6253 F_GETLK doesn't always return lock owner
[illumos-gate.git] / usr / src / uts / common / sys / fs / cachefs_log.h
blob5f339b82496656d3b4f51e08ed1d8a01ef5d0c61
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_LOG_H
28 #define _SYS_FS_CACHEFS_LOG_H
30 #pragma ident "%Z%%M% %I% %E% SMI"
32 #include <sys/types.h>
33 #include <sys/types32.h>
34 #include <sys/vfs.h>
35 #include <sys/fs/cachefs_fs.h>
37 #ifdef __cplusplus
38 extern "C" {
39 #endif
41 /* constants, etc. */
43 #define CACHEFS_LOG_MAGIC 32321
44 #define CACHEFS_LOG_FILE_REV 2
46 #define CACHEFS_LOG_MOUNT 1
47 #define CACHEFS_LOG_UMOUNT 2
48 #define CACHEFS_LOG_GETPAGE 3
49 #define CACHEFS_LOG_READDIR 4
50 #define CACHEFS_LOG_READLINK 5
51 #define CACHEFS_LOG_REMOVE 6
52 #define CACHEFS_LOG_RMDIR 7
53 #define CACHEFS_LOG_TRUNCATE 8
54 #define CACHEFS_LOG_PUTPAGE 9
55 #define CACHEFS_LOG_CREATE 10
56 #define CACHEFS_LOG_MKDIR 11
57 #define CACHEFS_LOG_RENAME 12
58 #define CACHEFS_LOG_SYMLINK 13
59 #define CACHEFS_LOG_POPULATE 14
60 #define CACHEFS_LOG_CSYMLINK 15
61 #define CACHEFS_LOG_FILLDIR 16
62 #define CACHEFS_LOG_MDCREATE 17
63 #define CACHEFS_LOG_GPFRONT 18
64 #define CACHEFS_LOG_RFDIR 19
65 #define CACHEFS_LOG_UALLOC 20
66 #define CACHEFS_LOG_CALLOC 21
67 #define CACHEFS_LOG_NOCACHE 22
68 #define CACHEFS_LOG_NUMRECS 22
71 * cachefs_log_* are stored on disk, so they need to be the same
72 * 32-bit vs. 64-bit.
75 #if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
76 #pragma pack(4)
77 #endif
80 * for communicating from user to kernel, or for storing state.
83 typedef struct cachefs_log_control {
84 int lc_magic;
85 char lc_path[MAXPATHLEN];
86 uchar_t lc_which[(CACHEFS_LOG_NUMRECS / NBBY) + 1];
87 uint64_t lc_cachep; /* really cachefscache_t * */
88 } cachefs_log_control_t;
91 * per-cachefscache information
94 typedef struct cachefs_log_cookie {
95 void *cl_head; /* head of records to be written */
96 void *cl_tail; /* tail of records to be written */
97 uint_t cl_size; /* # of bytes to be written */
99 struct vnode *cl_logvp; /* vnode for logfile */
101 cachefs_log_control_t *cl_logctl; /* points at ksp->ks_data */
103 int cl_magic; /* cheap sanity check */
104 } cachefs_log_cookie_t;
106 /* macros for determining which things we're logging + misc stuff */
107 #define CACHEFS_LOG_LOGGING(cp, which) \
108 ((cp != NULL) && \
109 (cp->c_log != NULL) && \
110 (cp->c_log_ctl->lc_which[which / NBBY] & \
111 (1 << (which % NBBY))))
112 #define CACHEFS_LOG_SET(lc, which) \
113 (lc->lc_which[which / NBBY] |= (1 << (which % NBBY)))
114 #define CACHEFS_LOG_CLEAR(lc, which) \
115 (lc->lc_which[which / NBBY] &= ~(1 << (which % NBBY)))
116 #define CLPAD(sname, field) \
117 (sizeof (struct sname) - \
118 offsetof(struct sname, field) - \
119 sizeof (((struct sname *)0)->field))
121 struct cachefs_log_logfile_header {
122 uint_t lh_magic;
123 uint_t lh_revision;
124 int lh_errno;
125 uint_t lh_blocks;
126 uint_t lh_files;
127 uint_t lh_maxbsize;
128 uint_t lh_pagesize;
132 * declarations of the logging records.
134 * note -- the first three fields must be int, int, and time_t (time32_t),
135 * corresponding to record type, error status, and timestamp.
137 * note -- the size of a trailing string should be large enough to
138 * hold any necessary null-terminating bytes. i.e. for one string,
139 * say `char foo[1]'. for two strings, null-separated, say `char
140 * foo[2]'.
142 * XX64 time32_t (above) is going to be a problem when the underlying
143 * filesystems support 64-bit time.
147 * XX64 - for now define all time types as 32-bits.
150 #if (defined(_SYSCALL32) && defined(_LP64))
151 typedef uid32_t cfs_uid_t;
152 #else /* not _SYSCALL32 && _LP64 */
153 typedef uid_t cfs_uid_t;
154 #endif /* _SYSCALL32 && _LP64 */
156 struct cachefs_log_mount_record {
157 int type; /* == CACHEFS_LOG_MOUNT */
158 int error; /* errno */
159 cfs_time_t time; /* timestamp */
160 uint64_t vfsp; /* vfs pointer -- unique while mounted */
161 uint_t flags; /* opt_flags from cachefsoptions */
162 uint_t popsize; /* opt_popsize from cachefsoptions */
163 uint_t fgsize; /* opt_fgsize from cachefsoptions */
164 ushort_t pathlen; /* length of path */
165 ushort_t cacheidlen; /* length of cacheid */
166 char path[2]; /* the path of the mountpoint, and cacheid */
169 struct cachefs_log_umount_record {
170 int type; /* == CACHEFS_LOG_UMOUNT */
171 int error; /* errno */
172 cfs_time_t time; /* timestamp */
173 uint64_t vfsp; /* vfs pointer we're unmounting */
176 struct cachefs_log_getpage_record {
177 int type; /* == CACHEFS_LOG_GETPAGE */
178 int error; /* errno */
179 cfs_time_t time; /* timestamp */
180 uint64_t vfsp; /* which filesystem */
181 cfs_fid_t fid; /* file identifier */
182 ino64_t fileno; /* fileno */
183 cfs_uid_t uid; /* uid of credential */
184 u_offset_t offset; /* offset we're getting */
185 uint_t len; /* how many bytes we're getting */
188 struct cachefs_log_readdir_record {
189 int type; /* == CACHEFS_LOG_READDIR */
190 int error; /* errno */
191 cfs_time_t time; /* timestamp */
192 uint64_t vfsp; /* which filesystem */
193 cfs_fid_t fid; /* file identifier */
194 ino64_t fileno; /* fileno */
195 cfs_uid_t uid; /* uid of credential */
196 u_offset_t offset; /* offset into directory */
197 int eof; /* like `*eofp' in VOP_READDIR */
200 struct cachefs_log_readlink_record {
201 int type; /* == CACHEFS_LOG_READLINK */
202 int error; /* errno */
203 cfs_time_t time; /* timestamp */
204 uint64_t vfsp; /* which filesystem */
205 cfs_fid_t fid; /* file identifier */
206 ino64_t fileno; /* fileno */
207 cfs_uid_t uid; /* uid of credential */
208 uint_t length; /* length of symlink */
211 struct cachefs_log_remove_record {
212 int type; /* == CACHEFS_LOG_REMOVE */
213 int error; /* errno */
214 cfs_time_t time; /* timestamp */
215 uint64_t vfsp; /* which filesystem */
216 cfs_fid_t fid; /* fid of file being removed */
217 /* (not the directory holding the file) */
218 ino64_t fileno; /* fileno */
219 cfs_uid_t uid; /* uid of credential */
222 struct cachefs_log_rmdir_record {
223 int type; /* == CACHEFS_LOG_RMDIR */
224 int error; /* errno */
225 cfs_time_t time; /* timestamp */
226 uint64_t vfsp; /* which filesystem */
227 cfs_fid_t fid; /* fid of directory being removed */
228 ino64_t fileno; /* fileno */
229 cfs_uid_t uid; /* uid of credential */
232 struct cachefs_log_truncate_record {
233 int type; /* == CACHEFS_LOG_TRUNCATE */
234 int error; /* errno */
235 cfs_time_t time; /* timestamp */
236 uint64_t vfsp; /* which filesystem */
237 cfs_fid_t fid; /* file being truncated */
238 ino64_t fileno; /* fileno */
239 cfs_uid_t uid; /* uid of credential */
240 u_offset_t size; /* new size */
243 struct cachefs_log_putpage_record {
244 int type; /* == CACHEFS_LOG_PUTPAGE */
245 int error; /* errno */
246 cfs_time_t time; /* timestamp */
247 uint64_t vfsp; /* which filesystem */
248 cfs_fid_t fid; /* file being written */
249 ino64_t fileno; /* fileno */
250 cfs_uid_t uid; /* uid of credential */
251 u_offset_t offset; /* offset */
252 uint_t len; /* length */
255 struct cachefs_log_create_record {
256 int type; /* == CACHEFS_LOG_CREATE */
257 int error; /* errno */
258 cfs_time_t time; /* timestamp */
259 uint64_t vfsp; /* which filesystem */
260 cfs_fid_t fid; /* fid of newly created file */
261 ino64_t fileno; /* fileno */
262 cfs_uid_t uid; /* uid of credential */
265 struct cachefs_log_mkdir_record {
266 int type; /* == CACHEFS_LOG_MKDIR */
267 int error; /* errno */
268 cfs_time_t time; /* timestamp */
269 uint64_t vfsp; /* which filesystem */
270 cfs_fid_t fid; /* fid of newly created directory */
271 ino64_t fileno; /* fileno */
272 cfs_uid_t uid; /* uid of credential */
275 struct cachefs_log_rename_record {
276 int type; /* == CACHEFS_LOG_RENAME */
277 int error; /* errno */
278 cfs_time_t time; /* timestamp */
279 uint64_t vfsp; /* which filesystem */
280 cfs_fid_t gone; /* fid of file removed (may be undefined) */
281 ino64_t fileno; /* fileno */
282 int removed; /* nonzero if file was removed */
283 cfs_uid_t uid; /* uid of credential */
286 struct cachefs_log_symlink_record {
287 int type; /* == CACHEFS_LOG_SYMLINK */
288 int error; /* errno */
289 cfs_time_t time; /* timestamp */
290 uint64_t vfsp; /* which filesystem */
291 cfs_fid_t fid; /* fid of newly created symlink */
292 ino64_t fileno; /* fileno */
293 uint_t size; /* size of newly created symlink */
294 cfs_uid_t uid; /* uid of credential */
297 struct cachefs_log_populate_record {
298 int type; /* == CACHEFS_LOG_POPULATE */
299 int error; /* errno */
300 cfs_time_t time; /* timestamp */
301 uint64_t vfsp; /* which filesystem */
302 cfs_fid_t fid; /* fid of file being populated */
303 ino64_t fileno; /* fileno */
304 u_offset_t off; /* offset */
305 uint_t size; /* popsize */
308 struct cachefs_log_csymlink_record {
309 int type; /* == CACHEFS_LOG_CSYMLINK */
310 int error; /* errno */
311 cfs_time_t time; /* timestamp */
312 uint64_t vfsp; /* which filesystem */
313 cfs_fid_t fid; /* fid of symlink being cached */
314 ino64_t fileno; /* fileno */
315 int size; /* size of symlink being cached */
318 struct cachefs_log_filldir_record {
319 int type; /* == CACHEFS_LOG_FILLDIR */
320 int error; /* errno */
321 cfs_time_t time; /* timestamp */
322 uint64_t vfsp; /* which filesystem */
323 cfs_fid_t fid; /* fid of directory being filled */
324 ino64_t fileno; /* fileno */
325 int size; /* size of frontfile after filling */
328 struct cachefs_log_mdcreate_record {
329 int type; /* == CACHEFS_LOG_MDCREATE */
330 int error; /* errno */
331 cfs_time_t time; /* timestamp */
332 uint64_t vfsp; /* which filesystem */
333 cfs_fid_t fid; /* fid of file for whom md slot is created */
334 ino64_t fileno; /* fileno */
335 uint_t count; /* new number of entries in attrcache */
338 struct cachefs_log_gpfront_record {
339 int type; /* == CACHEFS_LOG_GPFRONT */
340 int error; /* errno */
341 cfs_time_t time; /* timestamp */
342 uint64_t vfsp; /* which filesystem */
343 cfs_fid_t fid; /* fid of file for whom md slot is created */
344 ino64_t fileno; /* fileno */
345 cfs_uid_t uid; /* uid of credential */
346 u_offset_t off; /* offset */
347 uint_t len; /* length */
350 struct cachefs_log_rfdir_record {
351 int type; /* == CACHEFS_LOG_GPFRONT */
352 int error; /* errno */
353 cfs_time_t time; /* timestamp */
354 uint64_t vfsp; /* which filesystem */
355 cfs_fid_t fid; /* fid of directory */
356 ino64_t fileno; /* fileno */
357 cfs_uid_t uid; /* uid of credential */
360 struct cachefs_log_ualloc_record {
361 int type; /* == CACHEFS_LOG_UALLOC */
362 int error; /* errno */
363 cfs_time_t time; /* timestamp */
364 uint64_t vfsp; /* which filesystem */
365 cfs_fid_t fid; /* fid of allocmap-updated file */
366 ino64_t fileno; /* fileno of allocmap-updated file */
367 u_offset_t off; /* offset of new area */
368 uint_t len; /* length of new area */
371 struct cachefs_log_calloc_record {
372 int type; /* == CACHEFS_LOG_CALLOC */
373 int error; /* errno */
374 cfs_time_t time; /* timestamp */
375 uint64_t vfsp; /* which filesystem */
376 cfs_fid_t fid; /* fid of allocmap-checked file */
377 ino64_t fileno; /* fileno of allocmap-checked file */
378 u_offset_t off; /* offset of successful check_allocmap */
379 uint_t len; /* length of successful check_allocmap */
382 struct cachefs_log_nocache_record {
383 int type; /* == CACHEFS_LOG_NOCACHE */
384 int error; /* errno */
385 cfs_time_t time; /* timestamp */
386 uint64_t vfsp; /* which filesystem */
387 cfs_fid_t fid; /* fid of file being nocached */
388 ino64_t fileno; /* fileno of file being nocached */
391 #if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
392 #pragma pack()
393 #endif
395 #ifdef __cplusplus
397 #endif
400 #endif /* _SYS_FS_CACHEFS_LOG_H */