xref: /titanic_44/usr/src/uts/common/sys/fs/cachefs_log.h (revision 80e2ca8596e3435bc3b76f3c597833ea0a87f85e)
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_LOG_H
28 #define	_SYS_FS_CACHEFS_LOG_H
29 
30 #pragma ident	"%Z%%M%	%I%	%E% SMI"
31 
32 #include <sys/types.h>
33 #include <sys/types32.h>
34 #include <sys/vfs.h>
35 #include <sys/fs/cachefs_fs.h>
36 
37 #ifdef __cplusplus
38 extern "C" {
39 #endif
40 
41 /* constants, etc. */
42 
43 #define	CACHEFS_LOG_MAGIC	32321
44 #define	CACHEFS_LOG_FILE_REV	    2
45 
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
69 
70 /*
71  * cachefs_log_* are stored on disk, so they need to be the same
72  * 32-bit vs. 64-bit.
73  */
74 
75 #if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
76 #pragma pack(4)
77 #endif
78 
79 /*
80  * for communicating from user to kernel, or for storing state.
81  */
82 
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;
89 
90 /*
91  * per-cachefscache information
92  */
93 
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 */
98 
99 	struct vnode	*cl_logvp;	/* vnode for logfile */
100 
101 	cachefs_log_control_t *cl_logctl; /* points at ksp->ks_data */
102 
103 	int		cl_magic;	/* cheap sanity check */
104 } cachefs_log_cookie_t;
105 
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))
120 
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;
129 };
130 
131 /*
132  * declarations of the logging records.
133  *
134  * note -- the first three fields must be int, int, and time_t (time32_t),
135  * corresponding to record type, error status, and timestamp.
136  *
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]'.
141  *
142  * XX64	time32_t (above) is going to be a problem when the underlying
143  *	filesystems support 64-bit time.
144  */
145 
146 /*
147  * XX64 - for now define all time types as 32-bits.
148  */
149 
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 */
155 
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 */
167 };
168 
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 */
174 };
175 
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 */
186 };
187 
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 */
198 };
199 
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 */
209 };
210 
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 */
220 };
221 
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 */
230 };
231 
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 */
241 };
242 
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 */
253 };
254 
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 */
263 };
264 
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 */
273 };
274 
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 */
284 };
285 
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 */
295 };
296 
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 */
306 };
307 
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 */
316 };
317 
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 */
326 };
327 
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 */
336 };
337 
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 */
348 };
349 
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 */
358 };
359 
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 */
369 };
370 
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 */
380 };
381 
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 */
389 };
390 
391 #if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
392 #pragma pack()
393 #endif
394 
395 #ifdef __cplusplus
396 }
397 #endif
398 
399 
400 #endif /* _SYS_FS_CACHEFS_LOG_H */
401