6253 F_GETLK doesn't always return lock owner
[illumos-gate.git] / usr / src / uts / common / sys / fs / cachefs_fscache.h
blobe2c012b2ffc021d3fe62f4546ef139329e17f608
1 /*
2 * CDDL HEADER START
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.
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]
20 * CDDL HEADER END
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"
32 #ifdef __cplusplus
33 extern "C" {
34 #endif
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 {
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;
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
73 * readdir()
76 typedef struct cachefs_inum_trans {
77 ino64_t cit_real;
78 ino64_t cit_fake;
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.
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 */
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 */
138 /* list of fgps */
139 struct filegrp *fs_filegrp[CFS_FS_FGP_BUCKET_SIZE];
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;
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);
229 #ifdef __cplusplus
231 #endif
233 #endif /* _SYS_FS_CACHEFS_FSCACHE_H */