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