[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     ! 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