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
38extern "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
83typedef 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
94typedef 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
121struct 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))
151typedef uid32_t		cfs_uid_t;
152#else /* not _SYSCALL32 && _LP64 */
153typedef uid_t		cfs_uid_t;
154#endif /* _SYSCALL32 && _LP64 */
155
156struct 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
169struct 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
176struct 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
188struct 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
200struct 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
211struct 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
222struct 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
232struct 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
243struct 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
255struct 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
265struct 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
275struct 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
286struct 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
297struct 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
308struct 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
318struct 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
328struct 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
338struct 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
350struct 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
360struct 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
371struct 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
382struct 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