1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Copyright (C) International Business Machines Corp., 2000-2001 4*4882a593Smuzhiyun */ 5*4882a593Smuzhiyun #ifndef _H_JFS_DINODE 6*4882a593Smuzhiyun #define _H_JFS_DINODE 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun /* 9*4882a593Smuzhiyun * jfs_dinode.h: on-disk inode manager 10*4882a593Smuzhiyun */ 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #define INODESLOTSIZE 128 13*4882a593Smuzhiyun #define L2INODESLOTSIZE 7 14*4882a593Smuzhiyun #define log2INODESIZE 9 /* log2(bytes per dinode) */ 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun /* 18*4882a593Smuzhiyun * on-disk inode : 512 bytes 19*4882a593Smuzhiyun * 20*4882a593Smuzhiyun * note: align 64-bit fields on 8-byte boundary. 21*4882a593Smuzhiyun */ 22*4882a593Smuzhiyun struct dinode { 23*4882a593Smuzhiyun /* 24*4882a593Smuzhiyun * I. base area (128 bytes) 25*4882a593Smuzhiyun * ------------------------ 26*4882a593Smuzhiyun * 27*4882a593Smuzhiyun * define generic/POSIX attributes 28*4882a593Smuzhiyun */ 29*4882a593Smuzhiyun __le32 di_inostamp; /* 4: stamp to show inode belongs to fileset */ 30*4882a593Smuzhiyun __le32 di_fileset; /* 4: fileset number */ 31*4882a593Smuzhiyun __le32 di_number; /* 4: inode number, aka file serial number */ 32*4882a593Smuzhiyun __le32 di_gen; /* 4: inode generation number */ 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun pxd_t di_ixpxd; /* 8: inode extent descriptor */ 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun __le64 di_size; /* 8: size */ 37*4882a593Smuzhiyun __le64 di_nblocks; /* 8: number of blocks allocated */ 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun __le32 di_nlink; /* 4: number of links to the object */ 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun __le32 di_uid; /* 4: user id of owner */ 42*4882a593Smuzhiyun __le32 di_gid; /* 4: group id of owner */ 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun __le32 di_mode; /* 4: attribute, format and permission */ 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun struct timestruc_t di_atime; /* 8: time last data accessed */ 47*4882a593Smuzhiyun struct timestruc_t di_ctime; /* 8: time last status changed */ 48*4882a593Smuzhiyun struct timestruc_t di_mtime; /* 8: time last data modified */ 49*4882a593Smuzhiyun struct timestruc_t di_otime; /* 8: time created */ 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun dxd_t di_acl; /* 16: acl descriptor */ 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun dxd_t di_ea; /* 16: ea descriptor */ 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun __le32 di_next_index; /* 4: Next available dir_table index */ 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun __le32 di_acltype; /* 4: Type of ACL */ 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun /* 60*4882a593Smuzhiyun * Extension Areas. 61*4882a593Smuzhiyun * 62*4882a593Smuzhiyun * Historically, the inode was partitioned into 4 128-byte areas, 63*4882a593Smuzhiyun * the last 3 being defined as unions which could have multiple 64*4882a593Smuzhiyun * uses. The first 96 bytes had been completely unused until 65*4882a593Smuzhiyun * an index table was added to the directory. It is now more 66*4882a593Smuzhiyun * useful to describe the last 3/4 of the inode as a single 67*4882a593Smuzhiyun * union. We would probably be better off redesigning the 68*4882a593Smuzhiyun * entire structure from scratch, but we don't want to break 69*4882a593Smuzhiyun * commonality with OS/2's JFS at this time. 70*4882a593Smuzhiyun */ 71*4882a593Smuzhiyun union { 72*4882a593Smuzhiyun struct { 73*4882a593Smuzhiyun /* 74*4882a593Smuzhiyun * This table contains the information needed to 75*4882a593Smuzhiyun * find a directory entry from a 32-bit index. 76*4882a593Smuzhiyun * If the index is small enough, the table is inline, 77*4882a593Smuzhiyun * otherwise, an x-tree root overlays this table 78*4882a593Smuzhiyun */ 79*4882a593Smuzhiyun struct dir_table_slot _table[12]; /* 96: inline */ 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun dtroot_t _dtroot; /* 288: dtree root */ 82*4882a593Smuzhiyun } _dir; /* (384) */ 83*4882a593Smuzhiyun #define di_dirtable u._dir._table 84*4882a593Smuzhiyun #define di_dtroot u._dir._dtroot 85*4882a593Smuzhiyun #define di_parent di_dtroot.header.idotdot 86*4882a593Smuzhiyun #define di_DASD di_dtroot.header.DASD 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun struct { 89*4882a593Smuzhiyun union { 90*4882a593Smuzhiyun u8 _data[96]; /* 96: unused */ 91*4882a593Smuzhiyun struct { 92*4882a593Smuzhiyun void *_imap; /* 4: unused */ 93*4882a593Smuzhiyun __le32 _gengen; /* 4: generator */ 94*4882a593Smuzhiyun } _imap; 95*4882a593Smuzhiyun } _u1; /* 96: */ 96*4882a593Smuzhiyun #define di_gengen u._file._u1._imap._gengen 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun union { 99*4882a593Smuzhiyun xtpage_t _xtroot; 100*4882a593Smuzhiyun struct { 101*4882a593Smuzhiyun u8 unused[16]; /* 16: */ 102*4882a593Smuzhiyun dxd_t _dxd; /* 16: */ 103*4882a593Smuzhiyun union { 104*4882a593Smuzhiyun __le32 _rdev; /* 4: */ 105*4882a593Smuzhiyun /* 106*4882a593Smuzhiyun * The fast symlink area 107*4882a593Smuzhiyun * is expected to overflow 108*4882a593Smuzhiyun * into _inlineea when 109*4882a593Smuzhiyun * needed (which will clear 110*4882a593Smuzhiyun * INLINEEA). 111*4882a593Smuzhiyun */ 112*4882a593Smuzhiyun u8 _fastsymlink[128]; 113*4882a593Smuzhiyun } _u; 114*4882a593Smuzhiyun u8 _inlineea[128]; 115*4882a593Smuzhiyun } _special; 116*4882a593Smuzhiyun } _u2; 117*4882a593Smuzhiyun } _file; 118*4882a593Smuzhiyun #define di_xtroot u._file._u2._xtroot 119*4882a593Smuzhiyun #define di_dxd u._file._u2._special._dxd 120*4882a593Smuzhiyun #define di_btroot di_xtroot 121*4882a593Smuzhiyun #define di_inlinedata u._file._u2._special._u 122*4882a593Smuzhiyun #define di_rdev u._file._u2._special._u._rdev 123*4882a593Smuzhiyun #define di_fastsymlink u._file._u2._special._u._fastsymlink 124*4882a593Smuzhiyun #define di_inlineea u._file._u2._special._inlineea 125*4882a593Smuzhiyun } u; 126*4882a593Smuzhiyun }; 127*4882a593Smuzhiyun 128*4882a593Smuzhiyun /* extended mode bits (on-disk inode di_mode) */ 129*4882a593Smuzhiyun #define IFJOURNAL 0x00010000 /* journalled file */ 130*4882a593Smuzhiyun #define ISPARSE 0x00020000 /* sparse file enabled */ 131*4882a593Smuzhiyun #define INLINEEA 0x00040000 /* inline EA area free */ 132*4882a593Smuzhiyun #define ISWAPFILE 0x00800000 /* file open for pager swap space */ 133*4882a593Smuzhiyun 134*4882a593Smuzhiyun /* more extended mode bits: attributes for OS/2 */ 135*4882a593Smuzhiyun #define IREADONLY 0x02000000 /* no write access to file */ 136*4882a593Smuzhiyun #define IHIDDEN 0x04000000 /* hidden file */ 137*4882a593Smuzhiyun #define ISYSTEM 0x08000000 /* system file */ 138*4882a593Smuzhiyun 139*4882a593Smuzhiyun #define IDIRECTORY 0x20000000 /* directory (shadow of real bit) */ 140*4882a593Smuzhiyun #define IARCHIVE 0x40000000 /* file archive bit */ 141*4882a593Smuzhiyun #define INEWNAME 0x80000000 /* non-8.3 filename format */ 142*4882a593Smuzhiyun 143*4882a593Smuzhiyun #define IRASH 0x4E000000 /* mask for changeable attributes */ 144*4882a593Smuzhiyun #define ATTRSHIFT 25 /* bits to shift to move attribute 145*4882a593Smuzhiyun specification to mode position */ 146*4882a593Smuzhiyun 147*4882a593Smuzhiyun /* extended attributes for Linux */ 148*4882a593Smuzhiyun 149*4882a593Smuzhiyun #define JFS_NOATIME_FL 0x00080000 /* do not update atime */ 150*4882a593Smuzhiyun 151*4882a593Smuzhiyun #define JFS_DIRSYNC_FL 0x00100000 /* dirsync behaviour */ 152*4882a593Smuzhiyun #define JFS_SYNC_FL 0x00200000 /* Synchronous updates */ 153*4882a593Smuzhiyun #define JFS_SECRM_FL 0x00400000 /* Secure deletion */ 154*4882a593Smuzhiyun #define JFS_UNRM_FL 0x00800000 /* allow for undelete */ 155*4882a593Smuzhiyun 156*4882a593Smuzhiyun #define JFS_APPEND_FL 0x01000000 /* writes to file may only append */ 157*4882a593Smuzhiyun #define JFS_IMMUTABLE_FL 0x02000000 /* Immutable file */ 158*4882a593Smuzhiyun 159*4882a593Smuzhiyun #define JFS_FL_USER_VISIBLE 0x03F80000 160*4882a593Smuzhiyun #define JFS_FL_USER_MODIFIABLE 0x03F80000 161*4882a593Smuzhiyun #define JFS_FL_INHERIT 0x03C80000 162*4882a593Smuzhiyun 163*4882a593Smuzhiyun /* These are identical to EXT[23]_IOC_GETFLAGS/SETFLAGS */ 164*4882a593Smuzhiyun #define JFS_IOC_GETFLAGS _IOR('f', 1, long) 165*4882a593Smuzhiyun #define JFS_IOC_SETFLAGS _IOW('f', 2, long) 166*4882a593Smuzhiyun 167*4882a593Smuzhiyun #define JFS_IOC_GETFLAGS32 _IOR('f', 1, int) 168*4882a593Smuzhiyun #define JFS_IOC_SETFLAGS32 _IOW('f', 2, int) 169*4882a593Smuzhiyun 170*4882a593Smuzhiyun #endif /*_H_JFS_DINODE */ 171