2019-05-27 09:55:05 +03:00
/* SPDX-License-Identifier: GPL-2.0-or-later */
2005-04-17 02:20:36 +04:00
/*
2006-10-02 18:55:27 +04:00
* Copyright ( C ) International Business Machines Corp . , 2000 - 2001
2005-04-17 02:20:36 +04:00
*/
# ifndef _H_JFS_DINODE
# define _H_JFS_DINODE
/*
2007-06-07 00:28:35 +04:00
* jfs_dinode . h : on - disk inode manager
2005-04-17 02:20:36 +04:00
*/
2007-06-07 00:28:35 +04:00
# define INODESLOTSIZE 128
# define L2INODESLOTSIZE 7
# define log2INODESIZE 9 /* log2(bytes per dinode) */
2005-04-17 02:20:36 +04:00
/*
2007-06-07 00:28:35 +04:00
* on - disk inode : 512 bytes
2005-04-17 02:20:36 +04:00
*
* note : align 64 - bit fields on 8 - byte boundary .
*/
struct dinode {
/*
2007-06-07 00:28:35 +04:00
* I . base area ( 128 bytes )
* - - - - - - - - - - - - - - - - - - - - - - - -
2005-04-17 02:20:36 +04:00
*
* define generic / POSIX attributes
*/
__le32 di_inostamp ; /* 4: stamp to show inode belongs to fileset */
__le32 di_fileset ; /* 4: fileset number */
__le32 di_number ; /* 4: inode number, aka file serial number */
__le32 di_gen ; /* 4: inode generation number */
pxd_t di_ixpxd ; /* 8: inode extent descriptor */
__le64 di_size ; /* 8: size */
__le64 di_nblocks ; /* 8: number of blocks allocated */
__le32 di_nlink ; /* 4: number of links to the object */
__le32 di_uid ; /* 4: user id of owner */
__le32 di_gid ; /* 4: group id of owner */
__le32 di_mode ; /* 4: attribute, format and permission */
struct timestruc_t di_atime ; /* 8: time last data accessed */
struct timestruc_t di_ctime ; /* 8: time last status changed */
struct timestruc_t di_mtime ; /* 8: time last data modified */
struct timestruc_t di_otime ; /* 8: time created */
dxd_t di_acl ; /* 16: acl descriptor */
dxd_t di_ea ; /* 16: ea descriptor */
__le32 di_next_index ; /* 4: Next available dir_table index */
__le32 di_acltype ; /* 4: Type of ACL */
/*
2007-06-07 00:28:35 +04:00
* Extension Areas .
2005-04-17 02:20:36 +04:00
*
2007-06-07 00:28:35 +04:00
* Historically , the inode was partitioned into 4 128 - byte areas ,
* the last 3 being defined as unions which could have multiple
* uses . The first 96 bytes had been completely unused until
* an index table was added to the directory . It is now more
* useful to describe the last 3 / 4 of the inode as a single
* union . We would probably be better off redesigning the
* entire structure from scratch , but we don ' t want to break
* commonality with OS / 2 ' s JFS at this time .
2005-04-17 02:20:36 +04:00
*/
union {
struct {
/*
* This table contains the information needed to
* find a directory entry from a 32 - bit index .
* If the index is small enough , the table is inline ,
* otherwise , an x - tree root overlays this table
*/
struct dir_table_slot _table [ 12 ] ; /* 96: inline */
dtroot_t _dtroot ; /* 288: dtree root */
} _dir ; /* (384) */
# define di_dirtable u._dir._table
# define di_dtroot u._dir._dtroot
2007-06-07 00:28:35 +04:00
# define di_parent di_dtroot.header.idotdot
2005-04-17 02:20:36 +04:00
# define di_DASD di_dtroot.header.DASD
struct {
union {
u8 _data [ 96 ] ; /* 96: unused */
struct {
void * _imap ; /* 4: unused */
__le32 _gengen ; /* 4: generator */
} _imap ;
} _u1 ; /* 96: */
# define di_gengen u._file._u1._imap._gengen
union {
2023-10-05 17:16:14 +03:00
xtroot_t _xtroot ;
2005-04-17 02:20:36 +04:00
struct {
u8 unused [ 16 ] ; /* 16: */
dxd_t _dxd ; /* 16: */
union {
2018-08-03 22:52:58 +03:00
/*
* The fast symlink area
* is expected to overflow
* into _inlineea when
* needed ( which will clear
* INLINEEA ) .
*/
2021-06-22 02:23:22 +03:00
struct {
union {
__le32 _rdev ; /* 4: */
u8 _fastsymlink [ 128 ] ;
} _u ;
u8 _inlineea [ 128 ] ;
} ;
u8 _inline_all [ 256 ] ;
} ;
2005-04-17 02:20:36 +04:00
} _special ;
} _u2 ;
} _file ;
# define di_xtroot u._file._u2._xtroot
# define di_dxd u._file._u2._special._dxd
# define di_btroot di_xtroot
# define di_inlinedata u._file._u2._special._u
# define di_rdev u._file._u2._special._u._rdev
# define di_fastsymlink u._file._u2._special._u._fastsymlink
2007-06-07 00:28:35 +04:00
# define di_inlineea u._file._u2._special._inlineea
2021-06-22 02:23:22 +03:00
# define di_inline_all u._file._u2._special._inline_all
2005-04-17 02:20:36 +04:00
} u ;
} ;
/* extended mode bits (on-disk inode di_mode) */
2007-06-07 00:28:35 +04:00
# define IFJOURNAL 0x00010000 /* journalled file */
# define ISPARSE 0x00020000 /* sparse file enabled */
# define INLINEEA 0x00040000 /* inline EA area free */
2005-04-17 02:20:36 +04:00
# define ISWAPFILE 0x00800000 /* file open for pager swap space */
/* more extended mode bits: attributes for OS/2 */
# define IREADONLY 0x02000000 /* no write access to file */
# define IHIDDEN 0x04000000 /* hidden file */
2006-02-09 18:09:16 +03:00
# define ISYSTEM 0x08000000 /* system file */
2005-04-17 02:20:36 +04:00
# define IDIRECTORY 0x20000000 /* directory (shadow of real bit) */
2006-02-09 18:09:16 +03:00
# define IARCHIVE 0x40000000 /* file archive bit */
# define INEWNAME 0x80000000 /* non-8.3 filename format */
# define IRASH 0x4E000000 /* mask for changeable attributes */
2005-04-17 02:20:36 +04:00
# define ATTRSHIFT 25 / * bits to shift to move attribute
specification to mode position */
2006-02-09 18:09:16 +03:00
/* extended attributes for Linux */
# define JFS_NOATIME_FL 0x00080000 /* do not update atime */
# define JFS_DIRSYNC_FL 0x00100000 /* dirsync behaviour */
# define JFS_SYNC_FL 0x00200000 /* Synchronous updates */
# define JFS_SECRM_FL 0x00400000 /* Secure deletion */
# define JFS_UNRM_FL 0x00800000 /* allow for undelete */
# define JFS_APPEND_FL 0x01000000 /* writes to file may only append */
# define JFS_IMMUTABLE_FL 0x02000000 /* Immutable file */
# define JFS_FL_USER_VISIBLE 0x03F80000
# define JFS_FL_USER_MODIFIABLE 0x03F80000
# define JFS_FL_INHERIT 0x03C80000
2005-04-17 02:20:36 +04:00
# endif /*_H_JFS_DINODE */