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
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.
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]
23 * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
27 #ifndef _SYS_FS_CACHEFS_FSCACHE_H
28 #define _SYS_FS_CACHEFS_FSCACHE_H
30 #pragma ident "%Z%%M% %I% %E% SMI"
36 #define CFS_FS_FGP_BUCKET_SIZE 64 /* must be a power of 2 */
37 #define CFS_FS_MAXIDLE 100
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 */
45 typedef struct cachefs_stats
{
52 cfs_time_t st_gc_time
;
53 cfs_time_t st_gc_before_atime
;
54 cfs_time_t st_gc_after_atime
;
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 */
68 typedef struct cachefs_fsinfo cachefs_fsinfo_t
;
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
76 typedef struct cachefs_inum_trans
{
79 } cachefs_inum_trans_t
;
81 extern int cachefs_hash_sizes
[];
84 * fscache structure contains per-filesystem information, both filesystem
85 * cache directory information and mount-specific information.
88 ino64_t fs_cfsid
; /* File system ID */
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 */
107 struct fscache
*fs_next
; /* ptr to next fscache */
108 struct cachefs_workq fs_workq
; /* async thread work queue */
110 kmutex_t fs_fslock
; /* contents lock */
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 */
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 */
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 */
133 struct cnode
*fs_idleback
; /* back of idle list */
135 cachefs_inum_trans_t
*fs_inum_trans
; /* real->fake inums */
136 int fs_inum_size
; /* # fs_inum_trans alloced */
139 struct filegrp
*fs_filegrp
[CFS_FS_FGP_BUCKET_SIZE
];
141 timestruc_t fs_cod_time
; /* time of CoD event */
143 cachefs_stats_t fs_stats
;
148 typedef struct fscache fscache_t
;
150 extern struct kmem_cache
*cachefs_fscache_cache
;
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 */
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 */
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)
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)
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)
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)
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)
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
);
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
);
222 int fscache_name_to_fsid(cachefscache_t
*cachep
, char *namep
, ino64_t
*fsidp
);
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
);
233 #endif /* _SYS_FS_CACHEFS_FSCACHE_H */