cachefs_fscache.h revision 7c478bd95313f5f23a4c958a745db2134aa03244
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, Version 1.0 only
* (the "License"). You may not use this file except in compliance
* with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2004 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#ifndef _SYS_FS_CACHEFS_FSCACHE_H
#define _SYS_FS_CACHEFS_FSCACHE_H
#pragma ident "%Z%%M% %I% %E% SMI"
#ifdef __cplusplus
extern "C" {
#endif
#define CFS_FS_FGP_BUCKET_SIZE 64 /* must be a power of 2 */
#define CFS_FS_MAXIDLE 100
enum cachefs_connected {
CFS_CD_CONNECTED = 0x801, /* connected to back fs */
CFS_CD_DISCONNECTED, /* disconnected from back fs */
CFS_CD_RECONNECTING /* rolling log to back fs */
};
typedef struct cachefs_stats {
uint_t st_hits;
uint_t st_misses;
uint_t st_passes;
uint_t st_fails;
uint_t st_modifies;
uint_t st_gc_count;
cfs_time_t st_gc_time;
cfs_time_t st_gc_before_atime;
cfs_time_t st_gc_after_atime;
} cachefs_stats_t;
/* file system persistant state */
struct cachefs_fsinfo {
uint_t fi_mntflags; /* mount flags */
int fi_popsize; /* cache population size */
ino64_t fi_root; /* inode # of root of fs */
uint_t fi_resettimes; /* when to reset local times */
uint_t fi_resetfileno; /* when to reset local fileno */
ino64_t fi_localfileno; /* next local fileno to use */
int fi_fgsize; /* filegrp size, default 256 */
uint_t fi_pad[1]; /* pad field */
};
typedef struct cachefs_fsinfo cachefs_fsinfo_t;
/*
* used to translate the server's idea of inode numbers into the
* client's idea, after a reconnect, in a directory entry a la
* readdir()
*/
typedef struct cachefs_inum_trans {
ino64_t cit_real;
ino64_t cit_fake;
} cachefs_inum_trans_t;
extern int cachefs_hash_sizes[];
/*
* fscache structure contains per-filesystem information, both filesystem
* cache directory information and mount-specific information.
*/
struct fscache {
ino64_t fs_cfsid; /* File system ID */
int fs_flags;
struct vnode *fs_fscdirvp; /* vp to fs cache dir */
struct vnode *fs_fsattrdir; /* vp to attrcache dir */
struct vnode *fs_infovp; /* vp to fsinfo file */
struct cachefscache *fs_cache; /* back ptr to cache struct */
cachefs_fsinfo_t fs_info; /* fs persistant state */
struct vfs *fs_cfsvfsp; /* cfs vfsp */
struct vfs *fs_backvfsp; /* back file system vfsp */
struct vnode *fs_rootvp; /* root vnode ptr */
offset_t fs_offmax; /* maximum offset if backvp */
int fs_ref; /* ref count on fscache */
int fs_cnodecnt; /* cnt of cnodes on fscache */
int fs_consttype; /* type of consistency check */
struct cachefsops *fs_cfsops; /* cfsops vector pointer */
uint_t fs_acregmin; /* same as nfs values */
uint_t fs_acregmax;
uint_t fs_acdirmin;
uint_t fs_acdirmax;
struct fscache *fs_next; /* ptr to next fscache */
struct cachefs_workq fs_workq; /* async thread work queue */
kmutex_t fs_fslock; /* contents lock */
struct vnode *fs_dlogfile; /* log file */
off_t fs_dlogoff; /* offset into log file */
uint_t fs_dlogseq; /* sequence number */
struct vnode *fs_dmapfile; /* map file */
off_t fs_dmapoff; /* offset into map file */
off_t fs_dmapsize; /* size of map file */
kmutex_t fs_dlock; /* protects d* variables */
kmutex_t fs_idlelock; /* idle* lock */
int fs_idlecnt; /* number of idle cnodes */
int fs_idleclean; /* cleaning idle list */
struct cnode *fs_idlefront; /* front of idle list */
/* related to connected or disconnected (cd) */
kmutex_t fs_cdlock; /* protects fs_cd* variables */
kcondvar_t fs_cdwaitcv; /* signal state transitions */
enum cachefs_connected fs_cdconnected; /* how connected to backfs */
int fs_cdtransition; /* 1 transitioning, 0 not */
pid_t fs_cddaemonid; /* pid of cachefsd */
int fs_cdrefcnt; /* # threads in cachefs */
struct cnode *fs_idleback; /* back of idle list */
cachefs_inum_trans_t *fs_inum_trans; /* real->fake inums */
int fs_inum_size; /* # fs_inum_trans alloced */
/* list of fgps */
struct filegrp *fs_filegrp[CFS_FS_FGP_BUCKET_SIZE];
timestruc_t fs_cod_time; /* time of CoD event */
int fs_kstat_id;
cachefs_stats_t fs_stats;
char *fs_mntpt;
char *fs_hostname;
char *fs_backfsname;
};
typedef struct fscache fscache_t;
extern struct kmem_cache *cachefs_fscache_cache;
/* valid fscache flags */
#define CFS_FS_MOUNTED 0x01 /* fscache is mounted */
#define CFS_FS_READ 0x02 /* fscache can be read */
#define CFS_FS_WRITE 0x04 /* fscache can be written */
#define CFS_FS_ROOTFS 0x08 /* fscache is / */
#define CFS_FS_DIRTYINFO 0x10 /* fs_info needs to be written */
#define CFS_FS_HASHPRINT 0x20 /* hash warning already printed once */
/* types of consistency checking */
#define CFS_FS_CONST_STRICT 11 /* strict consistency */
#define CFS_FS_CONST_NOCONST 12 /* no consistency */
#define CFS_FS_CONST_CODCONST 13 /* consistency on demand */
#define CFSOP_INIT_COBJECT(FSCP, CP, VAP, CR) \
(*(FSCP)->fs_cfsops->co_init_cobject)(FSCP, CP, VAP, CR)
#define CFSOP_CHECK_COBJECT(FSCP, CP, WHAT, CR) \
(*(FSCP)->fs_cfsops->co_check_cobject)(FSCP, CP, WHAT, CR)
#define CFSOP_MODIFY_COBJECT(FSCP, CP, CR) \
(*(FSCP)->fs_cfsops->co_modify_cobject)(FSCP, CP, CR)
#define CFSOP_INVALIDATE_COBJECT(FSCP, CP, CR) \
(*(FSCP)->fs_cfsops->co_invalidate_cobject)(FSCP, CP, CR)
#define CFSOP_CONVERT_COBJECT(FSCP, CP, CR) \
(*(FSCP)->fs_cfsops->co_convert_cobject)(FSCP, CP, CR)
#define CFS_ISFS_SNR(FSCP) \
((FSCP)->fs_info.fi_mntflags & CFS_DISCONNECTABLE)
#define CFS_ISFS_SOFT(FSCP) \
((FSCP)->fs_info.fi_mntflags & CFS_SOFT)
#define CFS_ISFS_WRITE_AROUND(FSCP) \
((FSCP)->fs_info.fi_mntflags & CFS_WRITE_AROUND)
#define CFS_ISFS_NONSHARED(FSCP) \
((FSCP)->fs_info.fi_mntflags & CFS_NONSHARED)
#define CFS_ISFS_STRICT(FSCP) \
(((FSCP)->fs_info.fi_mntflags & CFS_WRITE_AROUND) && \
(((FSCP)->fs_info.fi_mntflags & \
(CFS_NOCONST_MODE | CFS_CODCONST_MODE)) == 0))
#define CFS_ISFS_NOCONST(FSCP) \
((FSCP)->fs_info.fi_mntflags & CFS_NOCONST_MODE)
#define CFS_ISFS_CODCONST(FSCP) \
((FSCP)->fs_info.fi_mntflags & CFS_CODCONST_MODE)
#define CFS_ISFS_LLOCK(FSCP) \
((FSCP)->fs_info.fi_mntflags & CFS_LLOCK)
#define CFS_ISFS_BACKFS_NFSV4(FSCP) \
((FSCP)->fs_info.fi_mntflags & CFS_BACKFS_NFSV4)
fscache_t *fscache_create(cachefscache_t *cachep);
void fscache_destory(fscache_t *fscp);
int fscache_activate(fscache_t *fscp, ino64_t fsid, char *namep,
struct cachefsoptions *optp, ino64_t backfileno);
int fscache_enable(fscache_t *fscp, ino64_t fsid, char *namep,
struct cachefsoptions *optp, ino64_t backfileno);
void fscache_activate_rw(fscache_t *fscp);
void fscache_hold(fscache_t *fscp);
void fscache_rele(fscache_t *fscp);
int fscache_cnodecnt(fscache_t *fscp, int cnt);
int fscache_mounted(fscache_t *fscp, struct vfs *cfsvfsp, struct vfs *backvfsp);
int fscache_compare_options(fscache_t *fscp, struct cachefsoptions *opnewp);
void fscache_sync(fscache_t *fscp);
void fscache_acset(fscache_t *fscp,
uint_t acregmin, uint_t acregmax, uint_t acdirmin, uint_t acdirmax);
fscache_t *fscache_list_find(cachefscache_t *cachep, ino64_t fsid);
void fscache_list_add(cachefscache_t *cachep, fscache_t *fscp);
void fscache_list_remove(cachefscache_t *cachep, fscache_t *fscp);
void fscache_list_gc(cachefscache_t *cachep);
int fscache_list_mounted(cachefscache_t *cachep);
int fscache_name_to_fsid(cachefscache_t *cachep, char *namep, ino64_t *fsidp);
int cachefs_cd_access(fscache_t *fscp, int waitconnected, int writing);
int cachefs_cd_access_miss(fscache_t *fscp);
void cachefs_cd_release(fscache_t *fscp);
void cachefs_cd_timedout(fscache_t *fscp);
#ifdef __cplusplus
}
#endif
#endif /* _SYS_FS_CACHEFS_FSCACHE_H */