Annotation of sys/ufs/ufs/inode.h, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: inode.h,v 1.35 2007/06/02 00:45:50 pedro Exp $ */
! 2: /* $NetBSD: inode.h,v 1.8 1995/06/15 23:22:50 cgd Exp $ */
! 3:
! 4: /*
! 5: * Copyright (c) 1982, 1989, 1993
! 6: * The Regents of the University of California. All rights reserved.
! 7: * (c) UNIX System Laboratories, Inc.
! 8: * All or some portions of this file are derived from material licensed
! 9: * to the University of California by American Telephone and Telegraph
! 10: * Co. or Unix System Laboratories, Inc. and are reproduced herein with
! 11: * the permission of UNIX System Laboratories, Inc.
! 12: *
! 13: * Redistribution and use in source and binary forms, with or without
! 14: * modification, are permitted provided that the following conditions
! 15: * are met:
! 16: * 1. Redistributions of source code must retain the above copyright
! 17: * notice, this list of conditions and the following disclaimer.
! 18: * 2. Redistributions in binary form must reproduce the above copyright
! 19: * notice, this list of conditions and the following disclaimer in the
! 20: * documentation and/or other materials provided with the distribution.
! 21: * 3. Neither the name of the University nor the names of its contributors
! 22: * may be used to endorse or promote products derived from this software
! 23: * without specific prior written permission.
! 24: *
! 25: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
! 26: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
! 27: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
! 28: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
! 29: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
! 30: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
! 31: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
! 32: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
! 33: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
! 34: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
! 35: * SUCH DAMAGE.
! 36: *
! 37: * @(#)inode.h 8.5 (Berkeley) 7/8/94
! 38: */
! 39:
! 40: #include <sys/buf.h>
! 41: #include <sys/lock.h>
! 42: #include <ufs/ufs/dinode.h>
! 43: #include <ufs/ufs/dir.h>
! 44: #include <ufs/ext2fs/ext2fs_dinode.h>
! 45:
! 46: /*
! 47: * Per-filesystem inode extensions.
! 48: */
! 49: struct ext2fs_inode_ext {
! 50: int32_t ext2fs_last_lblk; /* last logical block allocated */
! 51: int32_t ext2fs_last_blk; /* last block allocated on disk */
! 52: u_int32_t ext2fs_effective_uid; /* effective inode uid */
! 53: u_int32_t ext2fs_effective_gid; /* effective inode gid */
! 54: };
! 55:
! 56: /*
! 57: * The inode is used to describe each active (or recently active) file in the
! 58: * UFS filesystem. It is composed of two types of information. The first part
! 59: * is the information that is needed only while the file is active (such as
! 60: * the identity of the file and linkage to speed its lookup). The second part
! 61: * is * the permanent meta-data associated with the file which is read in
! 62: * from the permanent dinode from long term storage when the file becomes
! 63: * active, and is put back when the file is no longer being used.
! 64: */
! 65: struct inode {
! 66: LIST_ENTRY(inode) i_hash; /* Hash chain */
! 67: struct vnode *i_vnode;/* Vnode associated with this inode. */
! 68: struct ufsmount *i_ump;
! 69: u_int32_t i_flag; /* flags, see below */
! 70: dev_t i_dev; /* Device associated with the inode. */
! 71: ino_t i_number; /* The identity of the inode. */
! 72: int i_effnlink; /* i_nlink when I/O completes */
! 73:
! 74: union { /* Associated filesystem. */
! 75: struct fs *fs; /* FFS */
! 76: struct m_ext2fs *e2fs; /* EXT2FS */
! 77: } inode_u;
! 78:
! 79: #define i_fs inode_u.fs
! 80: #define i_e2fs inode_u.e2fs
! 81:
! 82: struct cluster_info i_ci;
! 83: struct dquot *i_dquot[MAXQUOTAS]; /* Dquot structures. */
! 84: u_quad_t i_modrev; /* Revision level for NFS lease. */
! 85: struct lockf *i_lockf;/* Head of byte-level lock list. */
! 86: struct lock i_lock; /* Inode lock */
! 87:
! 88: /*
! 89: * Side effects; used during directory lookup.
! 90: */
! 91: int32_t i_count; /* Size of free slot in directory. */
! 92: doff_t i_endoff; /* End of useful stuff in directory. */
! 93: doff_t i_diroff; /* Offset in dir, where we found last entry. */
! 94: doff_t i_offset; /* Offset of free space in directory. */
! 95: ino_t i_ino; /* Inode number of found directory. */
! 96: u_int32_t i_reclen; /* Size of found directory entry. */
! 97: /*
! 98: * Inode extensions
! 99: */
! 100: union {
! 101: /* Other extensions could go here... */
! 102: struct ext2fs_inode_ext e2fs;
! 103: struct dirhash *dirhash;
! 104: } inode_ext;
! 105:
! 106: #define i_e2fs_last_lblk inode_ext.e2fs.ext2fs_last_lblk
! 107: #define i_e2fs_last_blk inode_ext.e2fs.ext2fs_last_blk
! 108: #define i_e2fs_uid inode_ext.e2fs.ext2fs_effective_uid
! 109: #define i_e2fs_gid inode_ext.e2fs.ext2fs_effective_gid
! 110: #define i_dirhash inode_ext.dirhash
! 111:
! 112: /*
! 113: * The on-disk dinode itself.
! 114: */
! 115: union {
! 116: struct ufs1_dinode *ffs1_din;
! 117: struct ufs2_dinode *ffs2_din;
! 118: struct ext2fs_dinode *e2fs_din;
! 119: } dinode_u;
! 120:
! 121: #define i_din1 dinode_u.ffs1_din
! 122: #define i_din2 dinode_u.ffs2_din
! 123: #define i_e2din dinode_u.e2fs_din
! 124:
! 125: struct inode_vtbl *i_vtbl;
! 126: };
! 127:
! 128: struct inode_vtbl {
! 129: int (* iv_truncate)(struct inode *, off_t, int,
! 130: struct ucred *);
! 131: int (* iv_update)(struct inode *, struct timespec *, struct timespec *,
! 132: int waitfor);
! 133: int (* iv_inode_alloc)(struct inode *, mode_t mode,
! 134: struct ucred *, struct vnode **);
! 135: int (* iv_inode_free)(struct inode *, ino_t ino, mode_t mode);
! 136: int (* iv_buf_alloc)(struct inode *, off_t, int, struct ucred *,
! 137: int, struct buf **);
! 138: int (* iv_bufatoff)(struct inode *, off_t offset, char **res,
! 139: struct buf **bpp);
! 140: };
! 141:
! 142: #define UFS_TRUNCATE(ip, off, flags, cred) \
! 143: ((ip)->i_vtbl->iv_truncate)((ip), (off), (flags), (cred))
! 144:
! 145: #define UFS_UPDATE(ip, sync) \
! 146: ((ip)->i_vtbl->iv_update)((ip), NULL, NULL, (sync))
! 147:
! 148: #define UFS_UPDATE2(ip, atime, mtime, sync) \
! 149: ((ip)->i_vtbl->iv_update)((ip), (atime), (mtime), (sync))
! 150:
! 151: #define UFS_INODE_ALLOC(pip, mode, cred, vpp) \
! 152: ((pip)->i_vtbl->iv_inode_alloc)((pip), (mode), (cred), (vpp))
! 153:
! 154: #define UFS_INODE_FREE(pip, ino, mode) \
! 155: ((pip)->i_vtbl->iv_inode_free)((pip), (ino), (mode))
! 156:
! 157: #define UFS_BUF_ALLOC(ip, startoffset, size, cred, flags, bpp) \
! 158: ((ip)->i_vtbl->iv_buf_alloc)((ip), (startoffset), (size), (cred), \
! 159: (flags), (bpp))
! 160:
! 161: #define UFS_BUFATOFF(ip, offset, res, bpp) \
! 162: ((ip)->i_vtbl->iv_bufatoff)((ip), (offset), (res), (bpp))
! 163:
! 164: #define i_ffs1_atime i_din1->di_atime
! 165: #define i_ffs1_atimensec i_din1->di_atimensec
! 166: #define i_ffs1_blocks i_din1->di_blocks
! 167: #define i_ffs1_ctime i_din1->di_ctime
! 168: #define i_ffs1_ctimensec i_din1->di_ctimensec
! 169: #define i_ffs1_db i_din1->di_db
! 170: #define i_ffs1_flags i_din1->di_flags
! 171: #define i_ffs1_gen i_din1->di_gen
! 172: #define i_ffs1_gid i_din1->di_gid
! 173: #define i_ffs1_ib i_din1->di_ib
! 174: #define i_ffs1_mode i_din1->di_mode
! 175: #define i_ffs1_mtime i_din1->di_mtime
! 176: #define i_ffs1_mtimensec i_din1->di_mtimensec
! 177: #define i_ffs1_nlink i_din1->di_nlink
! 178: #define i_ffs1_rdev i_din1->di_rdev
! 179: #define i_ffs1_shortlink i_din1->di_shortlink
! 180: #define i_ffs1_size i_din1->di_size
! 181: #define i_ffs1_uid i_din1->di_uid
! 182:
! 183: #define i_ffs2_atime i_din2->di_atime
! 184: #define i_ffs2_atimensec i_din2->di_atimensec
! 185: #define i_ffs2_blocks i_din2->di_blocks
! 186: #define i_ffs2_blksize i_din2->di_blksize
! 187: #define i_ffs2_ctime i_din2->di_ctime
! 188: #define i_ffs2_ctimensec i_din2->di_ctimensec
! 189: #define i_ffs2_db i_din2->di_db
! 190: #define i_ffs2_flags i_din2->di_flags
! 191: #define i_ffs2_gen i_din2->di_gen
! 192: #define i_ffs2_gid i_din2->di_gid
! 193: #define i_ffs2_ib i_din2->di_ib
! 194: #define i_ffs2_mode i_din2->di_mode
! 195: #define i_ffs2_mtime i_din2->di_mtime
! 196: #define i_ffs2_mtimensec i_din2->di_mtimensec
! 197: #define i_ffs2_nlink i_din2->di_nlink
! 198: #define i_ffs2_rdev i_din2->di_rdev
! 199: #define i_ffs2_size i_din2->di_size
! 200: #define i_ffs2_uid i_din2->di_uid
! 201:
! 202: #ifndef _KERNEL
! 203: /*
! 204: * These are here purely for backwards compatibility for userland.
! 205: * They allow direct references to FFS structures using the old names.
! 206: */
! 207: #define i_atime i_din1->di_atime
! 208: #define i_atimensec i_din1->di_atimensec
! 209: #define i_blocks i_din1->di_blocks
! 210: #define i_ctime i_din1->di_ctime
! 211: #define i_ctimensec i_din1->di_ctimensec
! 212: #define i_db i_din1->di_db
! 213: #define i_flags i_din1->di_flags
! 214: #define i_gen i_din1->di_gen
! 215: #define i_gid i_din1->di_gid
! 216: #define i_ib i_din1->di_ib
! 217: #define i_mode i_din1->di_mode
! 218: #define i_mtime i_din1->di_mtime
! 219: #define i_mtimensec i_din1->di_mtimensec
! 220: #define i_nlink i_din1->di_nlink
! 221: #define i_rdev i_din1->di_rdev
! 222: #define i_shortlink i_din1->di_shortlink
! 223: #define i_size i_din1->di_size
! 224: #define i_uid i_din1->di_uid
! 225: #endif /* _KERNEL */
! 226:
! 227: #define i_e2fs_mode i_e2din->e2di_mode
! 228: #define i_e2fs_size i_e2din->e2di_size
! 229: #define i_e2fs_atime i_e2din->e2di_atime
! 230: #define i_e2fs_ctime i_e2din->e2di_ctime
! 231: #define i_e2fs_mtime i_e2din->e2di_mtime
! 232: #define i_e2fs_dtime i_e2din->e2di_dtime
! 233: #define i_e2fs_nlink i_e2din->e2di_nlink
! 234: #define i_e2fs_nblock i_e2din->e2di_nblock
! 235: #define i_e2fs_flags i_e2din->e2di_flags
! 236: #define i_e2fs_blocks i_e2din->e2di_blocks
! 237: #define i_e2fs_gen i_e2din->e2di_gen
! 238: #define i_e2fs_facl i_e2din->e2di_facl
! 239: #define i_e2fs_dacl i_e2din->e2di_dacl
! 240: #define i_e2fs_faddr i_e2din->e2di_faddr
! 241: #define i_e2fs_nfrag i_e2din->e2di_nfrag
! 242: #define i_e2fs_fsize i_e2din->e2di_fsize
! 243: #define i_e2fs_uid_low i_e2din->e2di_uid_low
! 244: #define i_e2fs_gid_low i_e2din->e2di_gid_low
! 245: #define i_e2fs_uid_high i_e2din->e2di_uid_high
! 246: #define i_e2fs_gid_high i_e2din->e2di_gid_high
! 247:
! 248: /* These flags are kept in i_flag. */
! 249: #define IN_ACCESS 0x0001 /* Access time update request. */
! 250: #define IN_CHANGE 0x0002 /* Inode change time update request. */
! 251: #define IN_UPDATE 0x0004 /* Modification time update request */
! 252: #define IN_MODIFIED 0x0008 /* Inode has been modified. */
! 253: #define IN_RENAME 0x0010 /* Inode is being renamed. */
! 254: #define IN_SHLOCK 0x0020 /* File has shared lock. */
! 255: #define IN_EXLOCK 0x0040 /* File has exclusive lock. */
! 256:
! 257: #define i_devvp i_ump->um_devvp
! 258:
! 259: #ifdef _KERNEL
! 260:
! 261: /*
! 262: * The DIP macros are used to access fields in the dinode.
! 263: */
! 264: #define DIP(ip, field) \
! 265: (((ip)->i_ump->um_fstype == UM_UFS1) ? \
! 266: (ip)->i_ffs1_##field : (ip)->i_ffs2_##field)
! 267:
! 268: #define DIP_ASSIGN(ip, field, value) \
! 269: do { \
! 270: if ((ip)->i_ump->um_fstype == UM_UFS1) \
! 271: (ip)->i_ffs1_##field = (value); \
! 272: else \
! 273: (ip)->i_ffs2_##field = (value); \
! 274: } while (0)
! 275:
! 276: #define DIP_ADD(ip, field, value) \
! 277: do { \
! 278: if ((ip)->i_ump->um_fstype == UM_UFS1) \
! 279: (ip)->i_ffs1_##field += (value); \
! 280: else \
! 281: (ip)->i_ffs2_##field += (value); \
! 282: } while (0)
! 283:
! 284: #define SHORTLINK(ip) \
! 285: (((ip)->i_ump->um_fstype == UM_UFS1) ? \
! 286: (caddr_t)(ip)->i_ffs1_db : (caddr_t)(ip)->i_ffs2_db)
! 287:
! 288: /*
! 289: * Structure used to pass around logical block paths generated by
! 290: * ufs_getlbns and used by truncate and bmap code.
! 291: */
! 292: struct indir {
! 293: daddr_t in_lbn; /* Logical block number. */
! 294: int in_off; /* Offset in buffer. */
! 295: int in_exists; /* Flag if the block exists. */
! 296: };
! 297:
! 298: /* Convert between inode pointers and vnode pointers. */
! 299: #define VTOI(vp) ((struct inode *)(vp)->v_data)
! 300: #define ITOV(ip) ((ip)->i_vnode)
! 301:
! 302: #define FFS_ITIMES(ip, t1, t2) { \
! 303: if ((ip)->i_flag & (IN_ACCESS | IN_CHANGE | IN_UPDATE)) { \
! 304: (ip)->i_flag |= IN_MODIFIED; \
! 305: if ((ip)->i_flag & IN_ACCESS) \
! 306: DIP_ASSIGN((ip), atime, (t1)->tv_sec); \
! 307: if ((ip)->i_flag & IN_UPDATE) { \
! 308: DIP_ASSIGN((ip), mtime, (t2)->tv_sec); \
! 309: (ip)->i_modrev++; \
! 310: } \
! 311: if ((ip)->i_flag & IN_CHANGE) \
! 312: DIP_ASSIGN((ip), ctime, time_second); \
! 313: (ip)->i_flag &= ~(IN_ACCESS | IN_CHANGE | IN_UPDATE); \
! 314: } \
! 315: }
! 316:
! 317: #define EXT2FS_ITIMES(ip, t1, t2) { \
! 318: if ((ip)->i_flag & (IN_ACCESS | IN_CHANGE | IN_UPDATE)) { \
! 319: (ip)->i_flag |= IN_MODIFIED; \
! 320: if ((ip)->i_flag & IN_ACCESS) \
! 321: (ip)->i_e2fs_atime = (t1)->tv_sec; \
! 322: if ((ip)->i_flag & IN_UPDATE) { \
! 323: (ip)->i_e2fs_mtime = (t2)->tv_sec; \
! 324: (ip)->i_modrev++; \
! 325: } \
! 326: if ((ip)->i_flag & IN_CHANGE) \
! 327: (ip)->i_e2fs_ctime = time_second; \
! 328: (ip)->i_flag &= ~(IN_ACCESS | IN_CHANGE | IN_UPDATE); \
! 329: } \
! 330: }
! 331:
! 332: #define ITIMES(ip, t1, t2) { \
! 333: if (IS_EXT2_VNODE((ip)->i_vnode)) { \
! 334: EXT2FS_ITIMES(ip, t1, t2); \
! 335: } else { \
! 336: FFS_ITIMES(ip, t1, t2); \
! 337: } \
! 338: }
! 339:
! 340: /* Determine if soft dependencies are being done */
! 341: #ifdef FFS_SOFTUPDATES
! 342: #define DOINGSOFTDEP(vp) ((vp)->v_mount->mnt_flag & MNT_SOFTDEP)
! 343: #else
! 344: #define DOINGSOFTDEP(vp) (0)
! 345: #endif
! 346: #define DOINGASYNC(vp) ((vp)->v_mount->mnt_flag & MNT_ASYNC)
! 347:
! 348: /* This overlays the fid structure (see mount.h). */
! 349: struct ufid {
! 350: u_int16_t ufid_len; /* Length of structure. */
! 351: u_int16_t ufid_pad; /* Force 32-bit alignment. */
! 352: ino_t ufid_ino; /* File number (ino). */
! 353: int32_t ufid_gen; /* Generation number. */
! 354: };
! 355: #endif /* _KERNEL */
CVSweb