[BACK]Return to inode.h CVS log [TXT][DIR] Up to [local] / sys / ufs / ufs

Annotation of sys/ufs/ufs/inode.h, Revision 1.1.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