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