162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (c) 2000-2001 Christoph Hellwig.
462306a36Sopenharmony_ci * Copyright (c) 2016 Krzysztof Blaszkowski
562306a36Sopenharmony_ci */
662306a36Sopenharmony_ci#ifndef _VXFS_INODE_H_
762306a36Sopenharmony_ci#define _VXFS_INODE_H_
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci/*
1062306a36Sopenharmony_ci * Veritas filesystem driver - inode structure.
1162306a36Sopenharmony_ci *
1262306a36Sopenharmony_ci * This file contains the definition of the disk and core
1362306a36Sopenharmony_ci * inodes of the Veritas Filesystem.
1462306a36Sopenharmony_ci */
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci#define VXFS_ISIZE		0x100		/* Inode size */
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci#define VXFS_NDADDR		10		/* Number of direct addrs in inode */
2062306a36Sopenharmony_ci#define VXFS_NIADDR		2		/* Number of indirect addrs in inode */
2162306a36Sopenharmony_ci#define VXFS_NIMMED		96		/* Size of immediate data in inode */
2262306a36Sopenharmony_ci#define VXFS_NTYPED		6		/* Num of typed extents */
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci#define VXFS_TYPED_OFFSETMASK	(0x00FFFFFFFFFFFFFFULL)
2562306a36Sopenharmony_ci#define VXFS_TYPED_TYPEMASK	(0xFF00000000000000ULL)
2662306a36Sopenharmony_ci#define VXFS_TYPED_TYPESHIFT	56
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ci#define VXFS_TYPED_PER_BLOCK(sbp) \
2962306a36Sopenharmony_ci	((sbp)->s_blocksize / sizeof(struct vxfs_typed))
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci/*
3262306a36Sopenharmony_ci * Possible extent descriptor types for %VXFS_ORG_TYPED extents.
3362306a36Sopenharmony_ci */
3462306a36Sopenharmony_cienum {
3562306a36Sopenharmony_ci	VXFS_TYPED_INDIRECT		= 1,
3662306a36Sopenharmony_ci	VXFS_TYPED_DATA			= 2,
3762306a36Sopenharmony_ci	VXFS_TYPED_INDIRECT_DEV4	= 3,
3862306a36Sopenharmony_ci	VXFS_TYPED_DATA_DEV4		= 4,
3962306a36Sopenharmony_ci};
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci/*
4262306a36Sopenharmony_ci * Data stored immediately in the inode.
4362306a36Sopenharmony_ci */
4462306a36Sopenharmony_cistruct vxfs_immed {
4562306a36Sopenharmony_ci	__u8			vi_immed[VXFS_NIMMED];
4662306a36Sopenharmony_ci};
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_cistruct vxfs_ext4 {
4962306a36Sopenharmony_ci	__fs32			ve4_spare;		/* ?? */
5062306a36Sopenharmony_ci	__fs32			ve4_indsize;		/* Indirect extent size */
5162306a36Sopenharmony_ci	__fs32			ve4_indir[VXFS_NIADDR];	/* Indirect extents */
5262306a36Sopenharmony_ci	struct direct {					/* Direct extents */
5362306a36Sopenharmony_ci		__fs32		extent;			/* Extent number */
5462306a36Sopenharmony_ci		__fs32		size;			/* Size of extent */
5562306a36Sopenharmony_ci	} ve4_direct[VXFS_NDADDR];
5662306a36Sopenharmony_ci};
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_cistruct vxfs_typed {
5962306a36Sopenharmony_ci	__fs64		vt_hdr;		/* Header, 0xTTOOOOOOOOOOOOOO; T=type,O=offs */
6062306a36Sopenharmony_ci	__fs32		vt_block;	/* Extent block */
6162306a36Sopenharmony_ci	__fs32		vt_size;	/* Size in blocks */
6262306a36Sopenharmony_ci};
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_cistruct vxfs_typed_dev4 {
6562306a36Sopenharmony_ci	__fs64		vd4_hdr;	/* Header, 0xTTOOOOOOOOOOOOOO; T=type,O=offs */
6662306a36Sopenharmony_ci	__fs64		vd4_block;	/* Extent block */
6762306a36Sopenharmony_ci	__fs64		vd4_size;	/* Size in blocks */
6862306a36Sopenharmony_ci	__fs32		vd4_dev;	/* Device ID */
6962306a36Sopenharmony_ci	__u8		__pad1;
7062306a36Sopenharmony_ci};
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ci/*
7362306a36Sopenharmony_ci * The inode as contained on the physical device.
7462306a36Sopenharmony_ci */
7562306a36Sopenharmony_cistruct vxfs_dinode {
7662306a36Sopenharmony_ci	__fs32		vdi_mode;
7762306a36Sopenharmony_ci	__fs32		vdi_nlink;	/* Link count */
7862306a36Sopenharmony_ci	__fs32		vdi_uid;	/* UID */
7962306a36Sopenharmony_ci	__fs32		vdi_gid;	/* GID */
8062306a36Sopenharmony_ci	__fs64		vdi_size;	/* Inode size in bytes */
8162306a36Sopenharmony_ci	__fs32		vdi_atime;	/* Last time accessed - sec */
8262306a36Sopenharmony_ci	__fs32		vdi_autime;	/* Last time accessed - usec */
8362306a36Sopenharmony_ci	__fs32		vdi_mtime;	/* Last modify time - sec */
8462306a36Sopenharmony_ci	__fs32		vdi_mutime;	/* Last modify time - usec */
8562306a36Sopenharmony_ci	__fs32		vdi_ctime;	/* Create time - sec */
8662306a36Sopenharmony_ci	__fs32		vdi_cutime;	/* Create time - usec */
8762306a36Sopenharmony_ci	__u8		vdi_aflags;	/* Allocation flags */
8862306a36Sopenharmony_ci	__u8		vdi_orgtype;	/* Organisation type */
8962306a36Sopenharmony_ci	__fs16		vdi_eopflags;
9062306a36Sopenharmony_ci	__fs32		vdi_eopdata;
9162306a36Sopenharmony_ci	union {
9262306a36Sopenharmony_ci		__fs32			rdev;
9362306a36Sopenharmony_ci		__fs32			dotdot;
9462306a36Sopenharmony_ci		struct {
9562306a36Sopenharmony_ci			__u32		reserved;
9662306a36Sopenharmony_ci			__fs32		fixextsize;
9762306a36Sopenharmony_ci		} i_regular;
9862306a36Sopenharmony_ci		struct {
9962306a36Sopenharmony_ci			__fs32		matchino;
10062306a36Sopenharmony_ci			__fs32		fsetindex;
10162306a36Sopenharmony_ci		} i_vxspec;
10262306a36Sopenharmony_ci		__u64			align;
10362306a36Sopenharmony_ci	} vdi_ftarea;
10462306a36Sopenharmony_ci	__fs32		vdi_blocks;	/* How much blocks does inode occupy */
10562306a36Sopenharmony_ci	__fs32		vdi_gen;	/* Inode generation */
10662306a36Sopenharmony_ci	__fs64		vdi_version;	/* Version */
10762306a36Sopenharmony_ci	union {
10862306a36Sopenharmony_ci		struct vxfs_immed	immed;
10962306a36Sopenharmony_ci		struct vxfs_ext4	ext4;
11062306a36Sopenharmony_ci		struct vxfs_typed	typed[VXFS_NTYPED];
11162306a36Sopenharmony_ci	} vdi_org;
11262306a36Sopenharmony_ci	__fs32		vdi_iattrino;
11362306a36Sopenharmony_ci};
11462306a36Sopenharmony_ci
11562306a36Sopenharmony_ci#define vdi_rdev	vdi_ftarea.rdev
11662306a36Sopenharmony_ci#define vdi_dotdot	vdi_ftarea.dotdot
11762306a36Sopenharmony_ci#define vdi_fixextsize	vdi_ftarea.regular.fixextsize
11862306a36Sopenharmony_ci#define vdi_matchino	vdi_ftarea.vxspec.matchino
11962306a36Sopenharmony_ci#define vdi_fsetindex	vdi_ftarea.vxspec.fsetindex
12062306a36Sopenharmony_ci
12162306a36Sopenharmony_ci#define vdi_immed	vdi_org.immed
12262306a36Sopenharmony_ci#define vdi_ext4	vdi_org.ext4
12362306a36Sopenharmony_ci#define vdi_typed	vdi_org.typed
12462306a36Sopenharmony_ci
12562306a36Sopenharmony_ci
12662306a36Sopenharmony_ci/*
12762306a36Sopenharmony_ci * The inode as represented in the main memory.
12862306a36Sopenharmony_ci */
12962306a36Sopenharmony_cistruct vxfs_inode_info {
13062306a36Sopenharmony_ci	struct inode	vfs_inode;
13162306a36Sopenharmony_ci
13262306a36Sopenharmony_ci	__u32		vii_mode;
13362306a36Sopenharmony_ci	__u32		vii_nlink;	/* Link count */
13462306a36Sopenharmony_ci	__u32		vii_uid;	/* UID */
13562306a36Sopenharmony_ci	__u32		vii_gid;	/* GID */
13662306a36Sopenharmony_ci	__u64		vii_size;	/* Inode size in bytes */
13762306a36Sopenharmony_ci	__u32		vii_atime;	/* Last time accessed - sec */
13862306a36Sopenharmony_ci	__u32		vii_autime;	/* Last time accessed - usec */
13962306a36Sopenharmony_ci	__u32		vii_mtime;	/* Last modify time - sec */
14062306a36Sopenharmony_ci	__u32		vii_mutime;	/* Last modify time - usec */
14162306a36Sopenharmony_ci	__u32		vii_ctime;	/* Create time - sec */
14262306a36Sopenharmony_ci	__u32		vii_cutime;	/* Create time - usec */
14362306a36Sopenharmony_ci	__u8		vii_orgtype;	/* Organisation type */
14462306a36Sopenharmony_ci	union {
14562306a36Sopenharmony_ci		__u32			rdev;
14662306a36Sopenharmony_ci		__u32			dotdot;
14762306a36Sopenharmony_ci	} vii_ftarea;
14862306a36Sopenharmony_ci	__u32		vii_blocks;	/* How much blocks does inode occupy */
14962306a36Sopenharmony_ci	__u32		vii_gen;	/* Inode generation */
15062306a36Sopenharmony_ci	union {
15162306a36Sopenharmony_ci		struct vxfs_immed	immed;
15262306a36Sopenharmony_ci		struct vxfs_ext4	ext4;
15362306a36Sopenharmony_ci		struct vxfs_typed	typed[VXFS_NTYPED];
15462306a36Sopenharmony_ci	} vii_org;
15562306a36Sopenharmony_ci};
15662306a36Sopenharmony_ci
15762306a36Sopenharmony_ci#define vii_rdev	vii_ftarea.rdev
15862306a36Sopenharmony_ci#define vii_dotdot	vii_ftarea.dotdot
15962306a36Sopenharmony_ci
16062306a36Sopenharmony_ci#define vii_immed	vii_org.immed
16162306a36Sopenharmony_ci#define vii_ext4	vii_org.ext4
16262306a36Sopenharmony_ci#define vii_typed	vii_org.typed
16362306a36Sopenharmony_ci
16462306a36Sopenharmony_cistatic inline struct vxfs_inode_info *VXFS_INO(struct inode *inode)
16562306a36Sopenharmony_ci{
16662306a36Sopenharmony_ci	return container_of(inode, struct vxfs_inode_info, vfs_inode);
16762306a36Sopenharmony_ci}
16862306a36Sopenharmony_ci
16962306a36Sopenharmony_ci#endif /* _VXFS_INODE_H_ */
170