1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License, Version 1.0 only 6 * (the "License"). You may not use this file except in compliance 7 * with the License. 8 * 9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 * or http://www.opensolaris.org/os/licensing. 11 * See the License for the specific language governing permissions 12 * and limitations under the License. 13 * 14 * When distributing Covered Code, include this CDDL HEADER in each 15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 * If applicable, add the following below this CDDL HEADER, with the 17 * fields enclosed by brackets "[]" replaced with your own identifying 18 * information: Portions Copyright [yyyy] [name of copyright owner] 19 * 20 * CDDL HEADER END 21 */ 22 /* 23 * Copyright 2004 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 #ifndef _SYS_FS_CACHEFS_FSCACHE_H 28 #define _SYS_FS_CACHEFS_FSCACHE_H 29 30 #pragma ident "%Z%%M% %I% %E% SMI" 31 32 #ifdef __cplusplus 33 extern "C" { 34 #endif 35 36 #define CFS_FS_FGP_BUCKET_SIZE 64 /* must be a power of 2 */ 37 #define CFS_FS_MAXIDLE 100 38 39 enum cachefs_connected { 40 CFS_CD_CONNECTED = 0x801, /* connected to back fs */ 41 CFS_CD_DISCONNECTED, /* disconnected from back fs */ 42 CFS_CD_RECONNECTING /* rolling log to back fs */ 43 }; 44 45 typedef struct cachefs_stats { 46 uint_t st_hits; 47 uint_t st_misses; 48 uint_t st_passes; 49 uint_t st_fails; 50 uint_t st_modifies; 51 uint_t st_gc_count; 52 cfs_time_t st_gc_time; 53 cfs_time_t st_gc_before_atime; 54 cfs_time_t st_gc_after_atime; 55 } cachefs_stats_t; 56 57 /* file system persistant state */ 58 struct cachefs_fsinfo { 59 uint_t fi_mntflags; /* mount flags */ 60 int fi_popsize; /* cache population size */ 61 ino64_t fi_root; /* inode # of root of fs */ 62 uint_t fi_resettimes; /* when to reset local times */ 63 uint_t fi_resetfileno; /* when to reset local fileno */ 64 ino64_t fi_localfileno; /* next local fileno to use */ 65 int fi_fgsize; /* filegrp size, default 256 */ 66 uint_t fi_pad[1]; /* pad field */ 67 }; 68 typedef struct cachefs_fsinfo cachefs_fsinfo_t; 69 70 /* 71 * used to translate the server's idea of inode numbers into the 72 * client's idea, after a reconnect, in a directory entry a la 73 * readdir() 74 */ 75 76 typedef struct cachefs_inum_trans { 77 ino64_t cit_real; 78 ino64_t cit_fake; 79 } cachefs_inum_trans_t; 80 81 extern int cachefs_hash_sizes[]; 82 83 /* 84 * fscache structure contains per-filesystem information, both filesystem 85 * cache directory information and mount-specific information. 86 */ 87 struct fscache { 88 ino64_t fs_cfsid; /* File system ID */ 89 int fs_flags; 90 struct vnode *fs_fscdirvp; /* vp to fs cache dir */ 91 struct vnode *fs_fsattrdir; /* vp to attrcache dir */ 92 struct vnode *fs_infovp; /* vp to fsinfo file */ 93 struct cachefscache *fs_cache; /* back ptr to cache struct */ 94 cachefs_fsinfo_t fs_info; /* fs persistant state */ 95 struct vfs *fs_cfsvfsp; /* cfs vfsp */ 96 struct vfs *fs_backvfsp; /* back file system vfsp */ 97 struct vnode *fs_rootvp; /* root vnode ptr */ 98 offset_t fs_offmax; /* maximum offset if backvp */ 99 int fs_ref; /* ref count on fscache */ 100 int fs_cnodecnt; /* cnt of cnodes on fscache */ 101 int fs_consttype; /* type of consistency check */ 102 struct cachefsops *fs_cfsops; /* cfsops vector pointer */ 103 uint_t fs_acregmin; /* same as nfs values */ 104 uint_t fs_acregmax; 105 uint_t fs_acdirmin; 106 uint_t fs_acdirmax; 107 struct fscache *fs_next; /* ptr to next fscache */ 108 struct cachefs_workq fs_workq; /* async thread work queue */ 109 110 kmutex_t fs_fslock; /* contents lock */ 111 112 struct vnode *fs_dlogfile; /* log file */ 113 off_t fs_dlogoff; /* offset into log file */ 114 uint_t fs_dlogseq; /* sequence number */ 115 struct vnode *fs_dmapfile; /* map file */ 116 off_t fs_dmapoff; /* offset into map file */ 117 off_t fs_dmapsize; /* size of map file */ 118 kmutex_t fs_dlock; /* protects d* variables */ 119 120 kmutex_t fs_idlelock; /* idle* lock */ 121 int fs_idlecnt; /* number of idle cnodes */ 122 int fs_idleclean; /* cleaning idle list */ 123 struct cnode *fs_idlefront; /* front of idle list */ 124 125 /* related to connected or disconnected (cd) */ 126 kmutex_t fs_cdlock; /* protects fs_cd* variables */ 127 kcondvar_t fs_cdwaitcv; /* signal state transitions */ 128 enum cachefs_connected fs_cdconnected; /* how connected to backfs */ 129 int fs_cdtransition; /* 1 transitioning, 0 not */ 130 pid_t fs_cddaemonid; /* pid of cachefsd */ 131 int fs_cdrefcnt; /* # threads in cachefs */ 132 133 struct cnode *fs_idleback; /* back of idle list */ 134 135 cachefs_inum_trans_t *fs_inum_trans; /* real->fake inums */ 136 int fs_inum_size; /* # fs_inum_trans alloced */ 137 138 /* list of fgps */ 139 struct filegrp *fs_filegrp[CFS_FS_FGP_BUCKET_SIZE]; 140 141 timestruc_t fs_cod_time; /* time of CoD event */ 142 int fs_kstat_id; 143 cachefs_stats_t fs_stats; 144 char *fs_mntpt; 145 char *fs_hostname; 146 char *fs_backfsname; 147 }; 148 typedef struct fscache fscache_t; 149 150 extern struct kmem_cache *cachefs_fscache_cache; 151 152 /* valid fscache flags */ 153 #define CFS_FS_MOUNTED 0x01 /* fscache is mounted */ 154 #define CFS_FS_READ 0x02 /* fscache can be read */ 155 #define CFS_FS_WRITE 0x04 /* fscache can be written */ 156 #define CFS_FS_ROOTFS 0x08 /* fscache is / */ 157 #define CFS_FS_DIRTYINFO 0x10 /* fs_info needs to be written */ 158 #define CFS_FS_HASHPRINT 0x20 /* hash warning already printed once */ 159 160 /* types of consistency checking */ 161 #define CFS_FS_CONST_STRICT 11 /* strict consistency */ 162 #define CFS_FS_CONST_NOCONST 12 /* no consistency */ 163 #define CFS_FS_CONST_CODCONST 13 /* consistency on demand */ 164 165 #define CFSOP_INIT_COBJECT(FSCP, CP, VAP, CR) \ 166 (*(FSCP)->fs_cfsops->co_init_cobject)(FSCP, CP, VAP, CR) 167 #define CFSOP_CHECK_COBJECT(FSCP, CP, WHAT, CR) \ 168 (*(FSCP)->fs_cfsops->co_check_cobject)(FSCP, CP, WHAT, CR) 169 #define CFSOP_MODIFY_COBJECT(FSCP, CP, CR) \ 170 (*(FSCP)->fs_cfsops->co_modify_cobject)(FSCP, CP, CR) 171 #define CFSOP_INVALIDATE_COBJECT(FSCP, CP, CR) \ 172 (*(FSCP)->fs_cfsops->co_invalidate_cobject)(FSCP, CP, CR) 173 #define CFSOP_CONVERT_COBJECT(FSCP, CP, CR) \ 174 (*(FSCP)->fs_cfsops->co_convert_cobject)(FSCP, CP, CR) 175 176 #define CFS_ISFS_SNR(FSCP) \ 177 ((FSCP)->fs_info.fi_mntflags & CFS_DISCONNECTABLE) 178 #define CFS_ISFS_SOFT(FSCP) \ 179 ((FSCP)->fs_info.fi_mntflags & CFS_SOFT) 180 181 #define CFS_ISFS_WRITE_AROUND(FSCP) \ 182 ((FSCP)->fs_info.fi_mntflags & CFS_WRITE_AROUND) 183 #define CFS_ISFS_NONSHARED(FSCP) \ 184 ((FSCP)->fs_info.fi_mntflags & CFS_NONSHARED) 185 186 #define CFS_ISFS_STRICT(FSCP) \ 187 (((FSCP)->fs_info.fi_mntflags & CFS_WRITE_AROUND) && \ 188 (((FSCP)->fs_info.fi_mntflags & \ 189 (CFS_NOCONST_MODE | CFS_CODCONST_MODE)) == 0)) 190 #define CFS_ISFS_NOCONST(FSCP) \ 191 ((FSCP)->fs_info.fi_mntflags & CFS_NOCONST_MODE) 192 #define CFS_ISFS_CODCONST(FSCP) \ 193 ((FSCP)->fs_info.fi_mntflags & CFS_CODCONST_MODE) 194 195 #define CFS_ISFS_LLOCK(FSCP) \ 196 ((FSCP)->fs_info.fi_mntflags & CFS_LLOCK) 197 #define CFS_ISFS_BACKFS_NFSV4(FSCP) \ 198 ((FSCP)->fs_info.fi_mntflags & CFS_BACKFS_NFSV4) 199 200 fscache_t *fscache_create(cachefscache_t *cachep); 201 void fscache_destory(fscache_t *fscp); 202 int fscache_activate(fscache_t *fscp, ino64_t fsid, char *namep, 203 struct cachefsoptions *optp, ino64_t backfileno); 204 int fscache_enable(fscache_t *fscp, ino64_t fsid, char *namep, 205 struct cachefsoptions *optp, ino64_t backfileno); 206 void fscache_activate_rw(fscache_t *fscp); 207 void fscache_hold(fscache_t *fscp); 208 void fscache_rele(fscache_t *fscp); 209 int fscache_cnodecnt(fscache_t *fscp, int cnt); 210 int fscache_mounted(fscache_t *fscp, struct vfs *cfsvfsp, struct vfs *backvfsp); 211 int fscache_compare_options(fscache_t *fscp, struct cachefsoptions *opnewp); 212 void fscache_sync(fscache_t *fscp); 213 void fscache_acset(fscache_t *fscp, 214 uint_t acregmin, uint_t acregmax, uint_t acdirmin, uint_t acdirmax); 215 216 fscache_t *fscache_list_find(cachefscache_t *cachep, ino64_t fsid); 217 void fscache_list_add(cachefscache_t *cachep, fscache_t *fscp); 218 void fscache_list_remove(cachefscache_t *cachep, fscache_t *fscp); 219 void fscache_list_gc(cachefscache_t *cachep); 220 int fscache_list_mounted(cachefscache_t *cachep); 221 222 int fscache_name_to_fsid(cachefscache_t *cachep, char *namep, ino64_t *fsidp); 223 224 int cachefs_cd_access(fscache_t *fscp, int waitconnected, int writing); 225 int cachefs_cd_access_miss(fscache_t *fscp); 226 void cachefs_cd_release(fscache_t *fscp); 227 void cachefs_cd_timedout(fscache_t *fscp); 228 229 #ifdef __cplusplus 230 } 231 #endif 232 233 #endif /* _SYS_FS_CACHEFS_FSCACHE_H */ 234