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 */