162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci *   Copyright (C) International Business Machines Corp., 2000-2001
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci#ifndef _H_JFS_DINODE
662306a36Sopenharmony_ci#define _H_JFS_DINODE
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci/*
962306a36Sopenharmony_ci *	jfs_dinode.h: on-disk inode manager
1062306a36Sopenharmony_ci */
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#define INODESLOTSIZE		128
1362306a36Sopenharmony_ci#define L2INODESLOTSIZE		7
1462306a36Sopenharmony_ci#define log2INODESIZE		9	/* log2(bytes per dinode) */
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci/*
1862306a36Sopenharmony_ci *	on-disk inode : 512 bytes
1962306a36Sopenharmony_ci *
2062306a36Sopenharmony_ci * note: align 64-bit fields on 8-byte boundary.
2162306a36Sopenharmony_ci */
2262306a36Sopenharmony_cistruct dinode {
2362306a36Sopenharmony_ci	/*
2462306a36Sopenharmony_ci	 *	I. base area (128 bytes)
2562306a36Sopenharmony_ci	 *	------------------------
2662306a36Sopenharmony_ci	 *
2762306a36Sopenharmony_ci	 * define generic/POSIX attributes
2862306a36Sopenharmony_ci	 */
2962306a36Sopenharmony_ci	__le32 di_inostamp;	/* 4: stamp to show inode belongs to fileset */
3062306a36Sopenharmony_ci	__le32 di_fileset;	/* 4: fileset number */
3162306a36Sopenharmony_ci	__le32 di_number;	/* 4: inode number, aka file serial number */
3262306a36Sopenharmony_ci	__le32 di_gen;		/* 4: inode generation number */
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci	pxd_t di_ixpxd;		/* 8: inode extent descriptor */
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci	__le64 di_size;		/* 8: size */
3762306a36Sopenharmony_ci	__le64 di_nblocks;	/* 8: number of blocks allocated */
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci	__le32 di_nlink;	/* 4: number of links to the object */
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci	__le32 di_uid;		/* 4: user id of owner */
4262306a36Sopenharmony_ci	__le32 di_gid;		/* 4: group id of owner */
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci	__le32 di_mode;		/* 4: attribute, format and permission */
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci	struct timestruc_t di_atime;	/* 8: time last data accessed */
4762306a36Sopenharmony_ci	struct timestruc_t di_ctime;	/* 8: time last status changed */
4862306a36Sopenharmony_ci	struct timestruc_t di_mtime;	/* 8: time last data modified */
4962306a36Sopenharmony_ci	struct timestruc_t di_otime;	/* 8: time created */
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ci	dxd_t di_acl;		/* 16: acl descriptor */
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci	dxd_t di_ea;		/* 16: ea descriptor */
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ci	__le32 di_next_index;	/* 4: Next available dir_table index */
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_ci	__le32 di_acltype;	/* 4: Type of ACL */
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci	/*
6062306a36Sopenharmony_ci	 *	Extension Areas.
6162306a36Sopenharmony_ci	 *
6262306a36Sopenharmony_ci	 *	Historically, the inode was partitioned into 4 128-byte areas,
6362306a36Sopenharmony_ci	 *	the last 3 being defined as unions which could have multiple
6462306a36Sopenharmony_ci	 *	uses.  The first 96 bytes had been completely unused until
6562306a36Sopenharmony_ci	 *	an index table was added to the directory.  It is now more
6662306a36Sopenharmony_ci	 *	useful to describe the last 3/4 of the inode as a single
6762306a36Sopenharmony_ci	 *	union.  We would probably be better off redesigning the
6862306a36Sopenharmony_ci	 *	entire structure from scratch, but we don't want to break
6962306a36Sopenharmony_ci	 *	commonality with OS/2's JFS at this time.
7062306a36Sopenharmony_ci	 */
7162306a36Sopenharmony_ci	union {
7262306a36Sopenharmony_ci		struct {
7362306a36Sopenharmony_ci			/*
7462306a36Sopenharmony_ci			 * This table contains the information needed to
7562306a36Sopenharmony_ci			 * find a directory entry from a 32-bit index.
7662306a36Sopenharmony_ci			 * If the index is small enough, the table is inline,
7762306a36Sopenharmony_ci			 * otherwise, an x-tree root overlays this table
7862306a36Sopenharmony_ci			 */
7962306a36Sopenharmony_ci			struct dir_table_slot _table[12]; /* 96: inline */
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_ci			dtroot_t _dtroot;		/* 288: dtree root */
8262306a36Sopenharmony_ci		} _dir;					/* (384) */
8362306a36Sopenharmony_ci#define di_dirtable	u._dir._table
8462306a36Sopenharmony_ci#define di_dtroot	u._dir._dtroot
8562306a36Sopenharmony_ci#define di_parent	di_dtroot.header.idotdot
8662306a36Sopenharmony_ci#define di_DASD		di_dtroot.header.DASD
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_ci		struct {
8962306a36Sopenharmony_ci			union {
9062306a36Sopenharmony_ci				u8 _data[96];		/* 96: unused */
9162306a36Sopenharmony_ci				struct {
9262306a36Sopenharmony_ci					void *_imap;	/* 4: unused */
9362306a36Sopenharmony_ci					__le32 _gengen;	/* 4: generator */
9462306a36Sopenharmony_ci				} _imap;
9562306a36Sopenharmony_ci			} _u1;				/* 96: */
9662306a36Sopenharmony_ci#define di_gengen	u._file._u1._imap._gengen
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_ci			union {
9962306a36Sopenharmony_ci				xtpage_t _xtroot;
10062306a36Sopenharmony_ci				struct {
10162306a36Sopenharmony_ci					u8 unused[16];	/* 16: */
10262306a36Sopenharmony_ci					dxd_t _dxd;	/* 16: */
10362306a36Sopenharmony_ci					union {
10462306a36Sopenharmony_ci						/*
10562306a36Sopenharmony_ci						 * The fast symlink area
10662306a36Sopenharmony_ci						 * is expected to overflow
10762306a36Sopenharmony_ci						 * into _inlineea when
10862306a36Sopenharmony_ci						 * needed (which will clear
10962306a36Sopenharmony_ci						 * INLINEEA).
11062306a36Sopenharmony_ci						 */
11162306a36Sopenharmony_ci						struct {
11262306a36Sopenharmony_ci							union {
11362306a36Sopenharmony_ci								__le32 _rdev;	/* 4: */
11462306a36Sopenharmony_ci								u8 _fastsymlink[128];
11562306a36Sopenharmony_ci							} _u;
11662306a36Sopenharmony_ci							u8 _inlineea[128];
11762306a36Sopenharmony_ci						};
11862306a36Sopenharmony_ci						u8 _inline_all[256];
11962306a36Sopenharmony_ci					};
12062306a36Sopenharmony_ci				} _special;
12162306a36Sopenharmony_ci			} _u2;
12262306a36Sopenharmony_ci		} _file;
12362306a36Sopenharmony_ci#define di_xtroot	u._file._u2._xtroot
12462306a36Sopenharmony_ci#define di_dxd		u._file._u2._special._dxd
12562306a36Sopenharmony_ci#define di_btroot	di_xtroot
12662306a36Sopenharmony_ci#define di_inlinedata	u._file._u2._special._u
12762306a36Sopenharmony_ci#define di_rdev		u._file._u2._special._u._rdev
12862306a36Sopenharmony_ci#define di_fastsymlink	u._file._u2._special._u._fastsymlink
12962306a36Sopenharmony_ci#define di_inlineea	u._file._u2._special._inlineea
13062306a36Sopenharmony_ci#define di_inline_all	u._file._u2._special._inline_all
13162306a36Sopenharmony_ci	} u;
13262306a36Sopenharmony_ci};
13362306a36Sopenharmony_ci
13462306a36Sopenharmony_ci/* extended mode bits (on-disk inode di_mode) */
13562306a36Sopenharmony_ci#define IFJOURNAL	0x00010000	/* journalled file */
13662306a36Sopenharmony_ci#define ISPARSE		0x00020000	/* sparse file enabled */
13762306a36Sopenharmony_ci#define INLINEEA	0x00040000	/* inline EA area free */
13862306a36Sopenharmony_ci#define ISWAPFILE	0x00800000	/* file open for pager swap space */
13962306a36Sopenharmony_ci
14062306a36Sopenharmony_ci/* more extended mode bits: attributes for OS/2 */
14162306a36Sopenharmony_ci#define IREADONLY	0x02000000	/* no write access to file */
14262306a36Sopenharmony_ci#define IHIDDEN		0x04000000	/* hidden file */
14362306a36Sopenharmony_ci#define ISYSTEM		0x08000000	/* system file */
14462306a36Sopenharmony_ci
14562306a36Sopenharmony_ci#define IDIRECTORY	0x20000000	/* directory (shadow of real bit) */
14662306a36Sopenharmony_ci#define IARCHIVE	0x40000000	/* file archive bit */
14762306a36Sopenharmony_ci#define INEWNAME	0x80000000	/* non-8.3 filename format */
14862306a36Sopenharmony_ci
14962306a36Sopenharmony_ci#define IRASH		0x4E000000	/* mask for changeable attributes */
15062306a36Sopenharmony_ci#define ATTRSHIFT	25	/* bits to shift to move attribute
15162306a36Sopenharmony_ci				   specification to mode position */
15262306a36Sopenharmony_ci
15362306a36Sopenharmony_ci/* extended attributes for Linux */
15462306a36Sopenharmony_ci
15562306a36Sopenharmony_ci#define JFS_NOATIME_FL		0x00080000 /* do not update atime */
15662306a36Sopenharmony_ci
15762306a36Sopenharmony_ci#define JFS_DIRSYNC_FL		0x00100000 /* dirsync behaviour */
15862306a36Sopenharmony_ci#define JFS_SYNC_FL		0x00200000 /* Synchronous updates */
15962306a36Sopenharmony_ci#define JFS_SECRM_FL		0x00400000 /* Secure deletion */
16062306a36Sopenharmony_ci#define JFS_UNRM_FL		0x00800000 /* allow for undelete */
16162306a36Sopenharmony_ci
16262306a36Sopenharmony_ci#define JFS_APPEND_FL		0x01000000 /* writes to file may only append */
16362306a36Sopenharmony_ci#define JFS_IMMUTABLE_FL	0x02000000 /* Immutable file */
16462306a36Sopenharmony_ci
16562306a36Sopenharmony_ci#define JFS_FL_USER_VISIBLE	0x03F80000
16662306a36Sopenharmony_ci#define JFS_FL_USER_MODIFIABLE	0x03F80000
16762306a36Sopenharmony_ci#define JFS_FL_INHERIT		0x03C80000
16862306a36Sopenharmony_ci
16962306a36Sopenharmony_ci#endif /*_H_JFS_DINODE */
170