Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-or-later */
0002 /*
0003  *   Copyright (C) International Business Machines Corp., 2000-2001
0004  */
0005 #ifndef _H_JFS_DINODE
0006 #define _H_JFS_DINODE
0007 
0008 /*
0009  *  jfs_dinode.h: on-disk inode manager
0010  */
0011 
0012 #define INODESLOTSIZE       128
0013 #define L2INODESLOTSIZE     7
0014 #define log2INODESIZE       9   /* log2(bytes per dinode) */
0015 
0016 
0017 /*
0018  *  on-disk inode : 512 bytes
0019  *
0020  * note: align 64-bit fields on 8-byte boundary.
0021  */
0022 struct dinode {
0023     /*
0024      *  I. base area (128 bytes)
0025      *  ------------------------
0026      *
0027      * define generic/POSIX attributes
0028      */
0029     __le32 di_inostamp; /* 4: stamp to show inode belongs to fileset */
0030     __le32 di_fileset;  /* 4: fileset number */
0031     __le32 di_number;   /* 4: inode number, aka file serial number */
0032     __le32 di_gen;      /* 4: inode generation number */
0033 
0034     pxd_t di_ixpxd;     /* 8: inode extent descriptor */
0035 
0036     __le64 di_size;     /* 8: size */
0037     __le64 di_nblocks;  /* 8: number of blocks allocated */
0038 
0039     __le32 di_nlink;    /* 4: number of links to the object */
0040 
0041     __le32 di_uid;      /* 4: user id of owner */
0042     __le32 di_gid;      /* 4: group id of owner */
0043 
0044     __le32 di_mode;     /* 4: attribute, format and permission */
0045 
0046     struct timestruc_t di_atime;    /* 8: time last data accessed */
0047     struct timestruc_t di_ctime;    /* 8: time last status changed */
0048     struct timestruc_t di_mtime;    /* 8: time last data modified */
0049     struct timestruc_t di_otime;    /* 8: time created */
0050 
0051     dxd_t di_acl;       /* 16: acl descriptor */
0052 
0053     dxd_t di_ea;        /* 16: ea descriptor */
0054 
0055     __le32 di_next_index;   /* 4: Next available dir_table index */
0056 
0057     __le32 di_acltype;  /* 4: Type of ACL */
0058 
0059     /*
0060      *  Extension Areas.
0061      *
0062      *  Historically, the inode was partitioned into 4 128-byte areas,
0063      *  the last 3 being defined as unions which could have multiple
0064      *  uses.  The first 96 bytes had been completely unused until
0065      *  an index table was added to the directory.  It is now more
0066      *  useful to describe the last 3/4 of the inode as a single
0067      *  union.  We would probably be better off redesigning the
0068      *  entire structure from scratch, but we don't want to break
0069      *  commonality with OS/2's JFS at this time.
0070      */
0071     union {
0072         struct {
0073             /*
0074              * This table contains the information needed to
0075              * find a directory entry from a 32-bit index.
0076              * If the index is small enough, the table is inline,
0077              * otherwise, an x-tree root overlays this table
0078              */
0079             struct dir_table_slot _table[12]; /* 96: inline */
0080 
0081             dtroot_t _dtroot;       /* 288: dtree root */
0082         } _dir;                 /* (384) */
0083 #define di_dirtable u._dir._table
0084 #define di_dtroot   u._dir._dtroot
0085 #define di_parent   di_dtroot.header.idotdot
0086 #define di_DASD     di_dtroot.header.DASD
0087 
0088         struct {
0089             union {
0090                 u8 _data[96];       /* 96: unused */
0091                 struct {
0092                     void *_imap;    /* 4: unused */
0093                     __le32 _gengen; /* 4: generator */
0094                 } _imap;
0095             } _u1;              /* 96: */
0096 #define di_gengen   u._file._u1._imap._gengen
0097 
0098             union {
0099                 xtpage_t _xtroot;
0100                 struct {
0101                     u8 unused[16];  /* 16: */
0102                     dxd_t _dxd; /* 16: */
0103                     union {
0104                         /*
0105                          * The fast symlink area
0106                          * is expected to overflow
0107                          * into _inlineea when
0108                          * needed (which will clear
0109                          * INLINEEA).
0110                          */
0111                         struct {
0112                             union {
0113                                 __le32 _rdev;   /* 4: */
0114                                 u8 _fastsymlink[128];
0115                             } _u;
0116                             u8 _inlineea[128];
0117                         };
0118                         u8 _inline_all[256];
0119                     };
0120                 } _special;
0121             } _u2;
0122         } _file;
0123 #define di_xtroot   u._file._u2._xtroot
0124 #define di_dxd      u._file._u2._special._dxd
0125 #define di_btroot   di_xtroot
0126 #define di_inlinedata   u._file._u2._special._u
0127 #define di_rdev     u._file._u2._special._u._rdev
0128 #define di_fastsymlink  u._file._u2._special._u._fastsymlink
0129 #define di_inlineea u._file._u2._special._inlineea
0130 #define di_inline_all   u._file._u2._special._inline_all
0131     } u;
0132 };
0133 
0134 /* extended mode bits (on-disk inode di_mode) */
0135 #define IFJOURNAL   0x00010000  /* journalled file */
0136 #define ISPARSE     0x00020000  /* sparse file enabled */
0137 #define INLINEEA    0x00040000  /* inline EA area free */
0138 #define ISWAPFILE   0x00800000  /* file open for pager swap space */
0139 
0140 /* more extended mode bits: attributes for OS/2 */
0141 #define IREADONLY   0x02000000  /* no write access to file */
0142 #define IHIDDEN     0x04000000  /* hidden file */
0143 #define ISYSTEM     0x08000000  /* system file */
0144 
0145 #define IDIRECTORY  0x20000000  /* directory (shadow of real bit) */
0146 #define IARCHIVE    0x40000000  /* file archive bit */
0147 #define INEWNAME    0x80000000  /* non-8.3 filename format */
0148 
0149 #define IRASH       0x4E000000  /* mask for changeable attributes */
0150 #define ATTRSHIFT   25  /* bits to shift to move attribute
0151                    specification to mode position */
0152 
0153 /* extended attributes for Linux */
0154 
0155 #define JFS_NOATIME_FL      0x00080000 /* do not update atime */
0156 
0157 #define JFS_DIRSYNC_FL      0x00100000 /* dirsync behaviour */
0158 #define JFS_SYNC_FL     0x00200000 /* Synchronous updates */
0159 #define JFS_SECRM_FL        0x00400000 /* Secure deletion */
0160 #define JFS_UNRM_FL     0x00800000 /* allow for undelete */
0161 
0162 #define JFS_APPEND_FL       0x01000000 /* writes to file may only append */
0163 #define JFS_IMMUTABLE_FL    0x02000000 /* Immutable file */
0164 
0165 #define JFS_FL_USER_VISIBLE 0x03F80000
0166 #define JFS_FL_USER_MODIFIABLE  0x03F80000
0167 #define JFS_FL_INHERIT      0x03C80000
0168 
0169 #endif /*_H_JFS_DINODE */