162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * ocfs2_fs.h
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * On-disk structures for OCFS2.
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci * Copyright (C) 2002, 2004 Oracle.  All rights reserved.
862306a36Sopenharmony_ci */
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#ifndef _OCFS2_FS_H
1162306a36Sopenharmony_ci#define _OCFS2_FS_H
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci#include <linux/magic.h>
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci/* Version */
1662306a36Sopenharmony_ci#define OCFS2_MAJOR_REV_LEVEL		0
1762306a36Sopenharmony_ci#define OCFS2_MINOR_REV_LEVEL          	90
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci/*
2062306a36Sopenharmony_ci * An OCFS2 volume starts this way:
2162306a36Sopenharmony_ci * Sector 0: Valid ocfs1_vol_disk_hdr that cleanly fails to mount OCFS.
2262306a36Sopenharmony_ci * Sector 1: Valid ocfs1_vol_label that cleanly fails to mount OCFS.
2362306a36Sopenharmony_ci * Block OCFS2_SUPER_BLOCK_BLKNO: OCFS2 superblock.
2462306a36Sopenharmony_ci *
2562306a36Sopenharmony_ci * All other structures are found from the superblock information.
2662306a36Sopenharmony_ci *
2762306a36Sopenharmony_ci * OCFS2_SUPER_BLOCK_BLKNO is in blocks, not sectors.  eg, for a
2862306a36Sopenharmony_ci * blocksize of 2K, it is 4096 bytes into disk.
2962306a36Sopenharmony_ci */
3062306a36Sopenharmony_ci#define OCFS2_SUPER_BLOCK_BLKNO		2
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci/*
3362306a36Sopenharmony_ci * Cluster size limits. The maximum is kept arbitrarily at 1 MB, and could
3462306a36Sopenharmony_ci * grow if needed.
3562306a36Sopenharmony_ci */
3662306a36Sopenharmony_ci#define OCFS2_MIN_CLUSTERSIZE		4096
3762306a36Sopenharmony_ci#define OCFS2_MAX_CLUSTERSIZE		1048576
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci/*
4062306a36Sopenharmony_ci * Blocks cannot be bigger than clusters, so the maximum blocksize is the
4162306a36Sopenharmony_ci * minimum cluster size.
4262306a36Sopenharmony_ci */
4362306a36Sopenharmony_ci#define OCFS2_MIN_BLOCKSIZE		512
4462306a36Sopenharmony_ci#define OCFS2_MAX_BLOCKSIZE		OCFS2_MIN_CLUSTERSIZE
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci/* Object signatures */
4762306a36Sopenharmony_ci#define OCFS2_SUPER_BLOCK_SIGNATURE	"OCFSV2"
4862306a36Sopenharmony_ci#define OCFS2_INODE_SIGNATURE		"INODE01"
4962306a36Sopenharmony_ci#define OCFS2_EXTENT_BLOCK_SIGNATURE	"EXBLK01"
5062306a36Sopenharmony_ci#define OCFS2_GROUP_DESC_SIGNATURE      "GROUP01"
5162306a36Sopenharmony_ci#define OCFS2_XATTR_BLOCK_SIGNATURE	"XATTR01"
5262306a36Sopenharmony_ci#define OCFS2_DIR_TRAILER_SIGNATURE	"DIRTRL1"
5362306a36Sopenharmony_ci#define OCFS2_DX_ROOT_SIGNATURE		"DXDIR01"
5462306a36Sopenharmony_ci#define OCFS2_DX_LEAF_SIGNATURE		"DXLEAF1"
5562306a36Sopenharmony_ci#define OCFS2_REFCOUNT_BLOCK_SIGNATURE	"REFCNT1"
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_ci/* Compatibility flags */
5862306a36Sopenharmony_ci#define OCFS2_HAS_COMPAT_FEATURE(sb,mask)			\
5962306a36Sopenharmony_ci	( OCFS2_SB(sb)->s_feature_compat & (mask) )
6062306a36Sopenharmony_ci#define OCFS2_HAS_RO_COMPAT_FEATURE(sb,mask)			\
6162306a36Sopenharmony_ci	( OCFS2_SB(sb)->s_feature_ro_compat & (mask) )
6262306a36Sopenharmony_ci#define OCFS2_HAS_INCOMPAT_FEATURE(sb,mask)			\
6362306a36Sopenharmony_ci	( OCFS2_SB(sb)->s_feature_incompat & (mask) )
6462306a36Sopenharmony_ci#define OCFS2_SET_COMPAT_FEATURE(sb,mask)			\
6562306a36Sopenharmony_ci	OCFS2_SB(sb)->s_feature_compat |= (mask)
6662306a36Sopenharmony_ci#define OCFS2_SET_RO_COMPAT_FEATURE(sb,mask)			\
6762306a36Sopenharmony_ci	OCFS2_SB(sb)->s_feature_ro_compat |= (mask)
6862306a36Sopenharmony_ci#define OCFS2_SET_INCOMPAT_FEATURE(sb,mask)			\
6962306a36Sopenharmony_ci	OCFS2_SB(sb)->s_feature_incompat |= (mask)
7062306a36Sopenharmony_ci#define OCFS2_CLEAR_COMPAT_FEATURE(sb,mask)			\
7162306a36Sopenharmony_ci	OCFS2_SB(sb)->s_feature_compat &= ~(mask)
7262306a36Sopenharmony_ci#define OCFS2_CLEAR_RO_COMPAT_FEATURE(sb,mask)			\
7362306a36Sopenharmony_ci	OCFS2_SB(sb)->s_feature_ro_compat &= ~(mask)
7462306a36Sopenharmony_ci#define OCFS2_CLEAR_INCOMPAT_FEATURE(sb,mask)			\
7562306a36Sopenharmony_ci	OCFS2_SB(sb)->s_feature_incompat &= ~(mask)
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci#define OCFS2_FEATURE_COMPAT_SUPP	(OCFS2_FEATURE_COMPAT_BACKUP_SB	\
7862306a36Sopenharmony_ci					 | OCFS2_FEATURE_COMPAT_JBD2_SB)
7962306a36Sopenharmony_ci#define OCFS2_FEATURE_INCOMPAT_SUPP	(OCFS2_FEATURE_INCOMPAT_LOCAL_MOUNT \
8062306a36Sopenharmony_ci					 | OCFS2_FEATURE_INCOMPAT_SPARSE_ALLOC \
8162306a36Sopenharmony_ci					 | OCFS2_FEATURE_INCOMPAT_INLINE_DATA \
8262306a36Sopenharmony_ci					 | OCFS2_FEATURE_INCOMPAT_EXTENDED_SLOT_MAP \
8362306a36Sopenharmony_ci					 | OCFS2_FEATURE_INCOMPAT_USERSPACE_STACK \
8462306a36Sopenharmony_ci					 | OCFS2_FEATURE_INCOMPAT_XATTR \
8562306a36Sopenharmony_ci					 | OCFS2_FEATURE_INCOMPAT_META_ECC \
8662306a36Sopenharmony_ci					 | OCFS2_FEATURE_INCOMPAT_INDEXED_DIRS \
8762306a36Sopenharmony_ci					 | OCFS2_FEATURE_INCOMPAT_REFCOUNT_TREE \
8862306a36Sopenharmony_ci					 | OCFS2_FEATURE_INCOMPAT_DISCONTIG_BG	\
8962306a36Sopenharmony_ci					 | OCFS2_FEATURE_INCOMPAT_CLUSTERINFO \
9062306a36Sopenharmony_ci					 | OCFS2_FEATURE_INCOMPAT_APPEND_DIO)
9162306a36Sopenharmony_ci#define OCFS2_FEATURE_RO_COMPAT_SUPP	(OCFS2_FEATURE_RO_COMPAT_UNWRITTEN \
9262306a36Sopenharmony_ci					 | OCFS2_FEATURE_RO_COMPAT_USRQUOTA \
9362306a36Sopenharmony_ci					 | OCFS2_FEATURE_RO_COMPAT_GRPQUOTA)
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_ci/*
9662306a36Sopenharmony_ci * Heartbeat-only devices are missing journals and other files.  The
9762306a36Sopenharmony_ci * filesystem driver can't load them, but the library can.  Never put
9862306a36Sopenharmony_ci * this in OCFS2_FEATURE_INCOMPAT_SUPP, *ever*.
9962306a36Sopenharmony_ci */
10062306a36Sopenharmony_ci#define OCFS2_FEATURE_INCOMPAT_HEARTBEAT_DEV	0x0002
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_ci/*
10362306a36Sopenharmony_ci * tunefs sets this incompat flag before starting the resize and clears it
10462306a36Sopenharmony_ci * at the end. This flag protects users from inadvertently mounting the fs
10562306a36Sopenharmony_ci * after an aborted run without fsck-ing.
10662306a36Sopenharmony_ci */
10762306a36Sopenharmony_ci#define OCFS2_FEATURE_INCOMPAT_RESIZE_INPROG    0x0004
10862306a36Sopenharmony_ci
10962306a36Sopenharmony_ci/* Used to denote a non-clustered volume */
11062306a36Sopenharmony_ci#define OCFS2_FEATURE_INCOMPAT_LOCAL_MOUNT	0x0008
11162306a36Sopenharmony_ci
11262306a36Sopenharmony_ci/* Support for sparse allocation in b-trees */
11362306a36Sopenharmony_ci#define OCFS2_FEATURE_INCOMPAT_SPARSE_ALLOC	0x0010
11462306a36Sopenharmony_ci
11562306a36Sopenharmony_ci/*
11662306a36Sopenharmony_ci * Tunefs sets this incompat flag before starting an operation which
11762306a36Sopenharmony_ci * would require cleanup on abort. This is done to protect users from
11862306a36Sopenharmony_ci * inadvertently mounting the fs after an aborted run without
11962306a36Sopenharmony_ci * fsck-ing.
12062306a36Sopenharmony_ci *
12162306a36Sopenharmony_ci * s_tunefs_flags on the super block describes precisely which
12262306a36Sopenharmony_ci * operations were in progress.
12362306a36Sopenharmony_ci */
12462306a36Sopenharmony_ci#define OCFS2_FEATURE_INCOMPAT_TUNEFS_INPROG	0x0020
12562306a36Sopenharmony_ci
12662306a36Sopenharmony_ci/* Support for data packed into inode blocks */
12762306a36Sopenharmony_ci#define OCFS2_FEATURE_INCOMPAT_INLINE_DATA	0x0040
12862306a36Sopenharmony_ci
12962306a36Sopenharmony_ci/*
13062306a36Sopenharmony_ci * Support for alternate, userspace cluster stacks.  If set, the superblock
13162306a36Sopenharmony_ci * field s_cluster_info contains a tag for the alternate stack in use as
13262306a36Sopenharmony_ci * well as the name of the cluster being joined.
13362306a36Sopenharmony_ci * mount.ocfs2 must pass in a matching stack name.
13462306a36Sopenharmony_ci *
13562306a36Sopenharmony_ci * If not set, the classic stack will be used.  This is compatbile with
13662306a36Sopenharmony_ci * all older versions.
13762306a36Sopenharmony_ci */
13862306a36Sopenharmony_ci#define OCFS2_FEATURE_INCOMPAT_USERSPACE_STACK	0x0080
13962306a36Sopenharmony_ci
14062306a36Sopenharmony_ci/* Support for the extended slot map */
14162306a36Sopenharmony_ci#define OCFS2_FEATURE_INCOMPAT_EXTENDED_SLOT_MAP 0x100
14262306a36Sopenharmony_ci
14362306a36Sopenharmony_ci/* Support for extended attributes */
14462306a36Sopenharmony_ci#define OCFS2_FEATURE_INCOMPAT_XATTR		0x0200
14562306a36Sopenharmony_ci
14662306a36Sopenharmony_ci/* Support for indexed directores */
14762306a36Sopenharmony_ci#define OCFS2_FEATURE_INCOMPAT_INDEXED_DIRS	0x0400
14862306a36Sopenharmony_ci
14962306a36Sopenharmony_ci/* Metadata checksum and error correction */
15062306a36Sopenharmony_ci#define OCFS2_FEATURE_INCOMPAT_META_ECC		0x0800
15162306a36Sopenharmony_ci
15262306a36Sopenharmony_ci/* Refcount tree support */
15362306a36Sopenharmony_ci#define OCFS2_FEATURE_INCOMPAT_REFCOUNT_TREE	0x1000
15462306a36Sopenharmony_ci
15562306a36Sopenharmony_ci/* Discontiguous block groups */
15662306a36Sopenharmony_ci#define OCFS2_FEATURE_INCOMPAT_DISCONTIG_BG	0x2000
15762306a36Sopenharmony_ci
15862306a36Sopenharmony_ci/*
15962306a36Sopenharmony_ci * Incompat bit to indicate useable clusterinfo with stackflags for all
16062306a36Sopenharmony_ci * cluster stacks (userspace adnd o2cb). If this bit is set,
16162306a36Sopenharmony_ci * INCOMPAT_USERSPACE_STACK becomes superfluous and thus should not be set.
16262306a36Sopenharmony_ci */
16362306a36Sopenharmony_ci#define OCFS2_FEATURE_INCOMPAT_CLUSTERINFO	0x4000
16462306a36Sopenharmony_ci
16562306a36Sopenharmony_ci/*
16662306a36Sopenharmony_ci * Append Direct IO support
16762306a36Sopenharmony_ci */
16862306a36Sopenharmony_ci#define OCFS2_FEATURE_INCOMPAT_APPEND_DIO	0x8000
16962306a36Sopenharmony_ci
17062306a36Sopenharmony_ci/*
17162306a36Sopenharmony_ci * backup superblock flag is used to indicate that this volume
17262306a36Sopenharmony_ci * has backup superblocks.
17362306a36Sopenharmony_ci */
17462306a36Sopenharmony_ci#define OCFS2_FEATURE_COMPAT_BACKUP_SB		0x0001
17562306a36Sopenharmony_ci
17662306a36Sopenharmony_ci/*
17762306a36Sopenharmony_ci * The filesystem will correctly handle journal feature bits.
17862306a36Sopenharmony_ci */
17962306a36Sopenharmony_ci#define OCFS2_FEATURE_COMPAT_JBD2_SB		0x0002
18062306a36Sopenharmony_ci
18162306a36Sopenharmony_ci/*
18262306a36Sopenharmony_ci * Unwritten extents support.
18362306a36Sopenharmony_ci */
18462306a36Sopenharmony_ci#define OCFS2_FEATURE_RO_COMPAT_UNWRITTEN	0x0001
18562306a36Sopenharmony_ci
18662306a36Sopenharmony_ci/*
18762306a36Sopenharmony_ci * Maintain quota information for this filesystem
18862306a36Sopenharmony_ci */
18962306a36Sopenharmony_ci#define OCFS2_FEATURE_RO_COMPAT_USRQUOTA	0x0002
19062306a36Sopenharmony_ci#define OCFS2_FEATURE_RO_COMPAT_GRPQUOTA	0x0004
19162306a36Sopenharmony_ci
19262306a36Sopenharmony_ci
19362306a36Sopenharmony_ci/* The byte offset of the first backup block will be 1G.
19462306a36Sopenharmony_ci * The following will be 4G, 16G, 64G, 256G and 1T.
19562306a36Sopenharmony_ci */
19662306a36Sopenharmony_ci#define OCFS2_BACKUP_SB_START			1 << 30
19762306a36Sopenharmony_ci
19862306a36Sopenharmony_ci/* the max backup superblock nums */
19962306a36Sopenharmony_ci#define OCFS2_MAX_BACKUP_SUPERBLOCKS	6
20062306a36Sopenharmony_ci
20162306a36Sopenharmony_ci/*
20262306a36Sopenharmony_ci * Flags on ocfs2_super_block.s_tunefs_flags
20362306a36Sopenharmony_ci */
20462306a36Sopenharmony_ci#define OCFS2_TUNEFS_INPROG_REMOVE_SLOT		0x0001	/* Removing slots */
20562306a36Sopenharmony_ci
20662306a36Sopenharmony_ci/*
20762306a36Sopenharmony_ci * Flags on ocfs2_dinode.i_flags
20862306a36Sopenharmony_ci */
20962306a36Sopenharmony_ci#define OCFS2_VALID_FL		(0x00000001)	/* Inode is valid */
21062306a36Sopenharmony_ci#define OCFS2_UNUSED2_FL	(0x00000002)
21162306a36Sopenharmony_ci#define OCFS2_ORPHANED_FL	(0x00000004)	/* On the orphan list */
21262306a36Sopenharmony_ci#define OCFS2_UNUSED3_FL	(0x00000008)
21362306a36Sopenharmony_ci/* System inode flags */
21462306a36Sopenharmony_ci#define OCFS2_SYSTEM_FL		(0x00000010)	/* System inode */
21562306a36Sopenharmony_ci#define OCFS2_SUPER_BLOCK_FL	(0x00000020)	/* Super block */
21662306a36Sopenharmony_ci#define OCFS2_LOCAL_ALLOC_FL	(0x00000040)	/* Slot local alloc bitmap */
21762306a36Sopenharmony_ci#define OCFS2_BITMAP_FL		(0x00000080)	/* Allocation bitmap */
21862306a36Sopenharmony_ci#define OCFS2_JOURNAL_FL	(0x00000100)	/* Slot local journal */
21962306a36Sopenharmony_ci#define OCFS2_HEARTBEAT_FL	(0x00000200)	/* Heartbeat area */
22062306a36Sopenharmony_ci#define OCFS2_CHAIN_FL		(0x00000400)	/* Chain allocator */
22162306a36Sopenharmony_ci#define OCFS2_DEALLOC_FL	(0x00000800)	/* Truncate log */
22262306a36Sopenharmony_ci#define OCFS2_QUOTA_FL		(0x00001000)	/* Quota file */
22362306a36Sopenharmony_ci#define OCFS2_DIO_ORPHANED_FL	(0X00002000)	/* On the orphan list especially
22462306a36Sopenharmony_ci						 * for dio */
22562306a36Sopenharmony_ci
22662306a36Sopenharmony_ci/*
22762306a36Sopenharmony_ci * Flags on ocfs2_dinode.i_dyn_features
22862306a36Sopenharmony_ci *
22962306a36Sopenharmony_ci * These can change much more often than i_flags. When adding flags,
23062306a36Sopenharmony_ci * keep in mind that i_dyn_features is only 16 bits wide.
23162306a36Sopenharmony_ci */
23262306a36Sopenharmony_ci#define OCFS2_INLINE_DATA_FL	(0x0001)	/* Data stored in inode block */
23362306a36Sopenharmony_ci#define OCFS2_HAS_XATTR_FL	(0x0002)
23462306a36Sopenharmony_ci#define OCFS2_INLINE_XATTR_FL	(0x0004)
23562306a36Sopenharmony_ci#define OCFS2_INDEXED_DIR_FL	(0x0008)
23662306a36Sopenharmony_ci#define OCFS2_HAS_REFCOUNT_FL   (0x0010)
23762306a36Sopenharmony_ci
23862306a36Sopenharmony_ci/* Inode attributes, keep in sync with EXT2 */
23962306a36Sopenharmony_ci#define OCFS2_SECRM_FL			FS_SECRM_FL	/* Secure deletion */
24062306a36Sopenharmony_ci#define OCFS2_UNRM_FL			FS_UNRM_FL	/* Undelete */
24162306a36Sopenharmony_ci#define OCFS2_COMPR_FL			FS_COMPR_FL	/* Compress file */
24262306a36Sopenharmony_ci#define OCFS2_SYNC_FL			FS_SYNC_FL	/* Synchronous updates */
24362306a36Sopenharmony_ci#define OCFS2_IMMUTABLE_FL		FS_IMMUTABLE_FL	/* Immutable file */
24462306a36Sopenharmony_ci#define OCFS2_APPEND_FL			FS_APPEND_FL	/* writes to file may only append */
24562306a36Sopenharmony_ci#define OCFS2_NODUMP_FL			FS_NODUMP_FL	/* do not dump file */
24662306a36Sopenharmony_ci#define OCFS2_NOATIME_FL		FS_NOATIME_FL	/* do not update atime */
24762306a36Sopenharmony_ci/* Reserved for compression usage... */
24862306a36Sopenharmony_ci#define OCFS2_DIRTY_FL			FS_DIRTY_FL
24962306a36Sopenharmony_ci#define OCFS2_COMPRBLK_FL		FS_COMPRBLK_FL	/* One or more compressed clusters */
25062306a36Sopenharmony_ci#define OCFS2_NOCOMP_FL			FS_NOCOMP_FL	/* Don't compress */
25162306a36Sopenharmony_ci#define OCFS2_ECOMPR_FL			FS_ECOMPR_FL	/* Compression error */
25262306a36Sopenharmony_ci/* End compression flags --- maybe not all used */
25362306a36Sopenharmony_ci#define OCFS2_BTREE_FL			FS_BTREE_FL	/* btree format dir */
25462306a36Sopenharmony_ci#define OCFS2_INDEX_FL			FS_INDEX_FL	/* hash-indexed directory */
25562306a36Sopenharmony_ci#define OCFS2_IMAGIC_FL			FS_IMAGIC_FL	/* AFS directory */
25662306a36Sopenharmony_ci#define OCFS2_JOURNAL_DATA_FL		FS_JOURNAL_DATA_FL /* Reserved for ext3 */
25762306a36Sopenharmony_ci#define OCFS2_NOTAIL_FL			FS_NOTAIL_FL	/* file tail should not be merged */
25862306a36Sopenharmony_ci#define OCFS2_DIRSYNC_FL		FS_DIRSYNC_FL	/* dirsync behaviour (directories only) */
25962306a36Sopenharmony_ci#define OCFS2_TOPDIR_FL			FS_TOPDIR_FL	/* Top of directory hierarchies*/
26062306a36Sopenharmony_ci#define OCFS2_RESERVED_FL		FS_RESERVED_FL	/* reserved for ext2 lib */
26162306a36Sopenharmony_ci
26262306a36Sopenharmony_ci#define OCFS2_FL_VISIBLE		FS_FL_USER_VISIBLE	/* User visible flags */
26362306a36Sopenharmony_ci#define OCFS2_FL_MODIFIABLE		FS_FL_USER_MODIFIABLE	/* User modifiable flags */
26462306a36Sopenharmony_ci
26562306a36Sopenharmony_ci/*
26662306a36Sopenharmony_ci * Extent record flags (e_node.leaf.flags)
26762306a36Sopenharmony_ci */
26862306a36Sopenharmony_ci#define OCFS2_EXT_UNWRITTEN		(0x01)	/* Extent is allocated but
26962306a36Sopenharmony_ci						 * unwritten */
27062306a36Sopenharmony_ci#define OCFS2_EXT_REFCOUNTED		(0x02)  /* Extent is reference
27162306a36Sopenharmony_ci						 * counted in an associated
27262306a36Sopenharmony_ci						 * refcount tree */
27362306a36Sopenharmony_ci
27462306a36Sopenharmony_ci/*
27562306a36Sopenharmony_ci * Journal Flags (ocfs2_dinode.id1.journal1.i_flags)
27662306a36Sopenharmony_ci */
27762306a36Sopenharmony_ci#define OCFS2_JOURNAL_DIRTY_FL	(0x00000001)	/* Journal needs recovery */
27862306a36Sopenharmony_ci
27962306a36Sopenharmony_ci/*
28062306a36Sopenharmony_ci * superblock s_state flags
28162306a36Sopenharmony_ci */
28262306a36Sopenharmony_ci#define OCFS2_ERROR_FS		(0x00000001)	/* FS saw errors */
28362306a36Sopenharmony_ci
28462306a36Sopenharmony_ci/* Limit of space in ocfs2_dir_entry */
28562306a36Sopenharmony_ci#define OCFS2_MAX_FILENAME_LEN		255
28662306a36Sopenharmony_ci
28762306a36Sopenharmony_ci/* Maximum slots on an ocfs2 file system */
28862306a36Sopenharmony_ci#define OCFS2_MAX_SLOTS			255
28962306a36Sopenharmony_ci
29062306a36Sopenharmony_ci/* Slot map indicator for an empty slot */
29162306a36Sopenharmony_ci#define OCFS2_INVALID_SLOT		((u16)-1)
29262306a36Sopenharmony_ci
29362306a36Sopenharmony_ci#define OCFS2_VOL_UUID_LEN		16
29462306a36Sopenharmony_ci#define OCFS2_MAX_VOL_LABEL_LEN		64
29562306a36Sopenharmony_ci
29662306a36Sopenharmony_ci/* The cluster stack fields */
29762306a36Sopenharmony_ci#define OCFS2_STACK_LABEL_LEN		4
29862306a36Sopenharmony_ci#define OCFS2_CLUSTER_NAME_LEN		16
29962306a36Sopenharmony_ci
30062306a36Sopenharmony_ci/* Classic (historically speaking) cluster stack */
30162306a36Sopenharmony_ci#define OCFS2_CLASSIC_CLUSTER_STACK	"o2cb"
30262306a36Sopenharmony_ci
30362306a36Sopenharmony_ci/* Journal limits (in bytes) */
30462306a36Sopenharmony_ci#define OCFS2_MIN_JOURNAL_SIZE		(4 * 1024 * 1024)
30562306a36Sopenharmony_ci
30662306a36Sopenharmony_ci/*
30762306a36Sopenharmony_ci * Inline extended attribute size (in bytes)
30862306a36Sopenharmony_ci * The value chosen should be aligned to 16 byte boundaries.
30962306a36Sopenharmony_ci */
31062306a36Sopenharmony_ci#define OCFS2_MIN_XATTR_INLINE_SIZE     256
31162306a36Sopenharmony_ci
31262306a36Sopenharmony_ci/*
31362306a36Sopenharmony_ci * Cluster info flags (ocfs2_cluster_info.ci_stackflags)
31462306a36Sopenharmony_ci */
31562306a36Sopenharmony_ci#define OCFS2_CLUSTER_O2CB_GLOBAL_HEARTBEAT	(0x01)
31662306a36Sopenharmony_ci
31762306a36Sopenharmony_cistruct ocfs2_system_inode_info {
31862306a36Sopenharmony_ci	char	*si_name;
31962306a36Sopenharmony_ci	int	si_iflags;
32062306a36Sopenharmony_ci	int	si_mode;
32162306a36Sopenharmony_ci};
32262306a36Sopenharmony_ci
32362306a36Sopenharmony_ci/* System file index */
32462306a36Sopenharmony_cienum {
32562306a36Sopenharmony_ci	BAD_BLOCK_SYSTEM_INODE = 0,
32662306a36Sopenharmony_ci	GLOBAL_INODE_ALLOC_SYSTEM_INODE,
32762306a36Sopenharmony_ci#define OCFS2_FIRST_ONLINE_SYSTEM_INODE GLOBAL_INODE_ALLOC_SYSTEM_INODE
32862306a36Sopenharmony_ci	SLOT_MAP_SYSTEM_INODE,
32962306a36Sopenharmony_ci	HEARTBEAT_SYSTEM_INODE,
33062306a36Sopenharmony_ci	GLOBAL_BITMAP_SYSTEM_INODE,
33162306a36Sopenharmony_ci	USER_QUOTA_SYSTEM_INODE,
33262306a36Sopenharmony_ci	GROUP_QUOTA_SYSTEM_INODE,
33362306a36Sopenharmony_ci#define OCFS2_LAST_GLOBAL_SYSTEM_INODE GROUP_QUOTA_SYSTEM_INODE
33462306a36Sopenharmony_ci#define OCFS2_FIRST_LOCAL_SYSTEM_INODE ORPHAN_DIR_SYSTEM_INODE
33562306a36Sopenharmony_ci	ORPHAN_DIR_SYSTEM_INODE,
33662306a36Sopenharmony_ci	EXTENT_ALLOC_SYSTEM_INODE,
33762306a36Sopenharmony_ci	INODE_ALLOC_SYSTEM_INODE,
33862306a36Sopenharmony_ci	JOURNAL_SYSTEM_INODE,
33962306a36Sopenharmony_ci	LOCAL_ALLOC_SYSTEM_INODE,
34062306a36Sopenharmony_ci	TRUNCATE_LOG_SYSTEM_INODE,
34162306a36Sopenharmony_ci	LOCAL_USER_QUOTA_SYSTEM_INODE,
34262306a36Sopenharmony_ci	LOCAL_GROUP_QUOTA_SYSTEM_INODE,
34362306a36Sopenharmony_ci#define OCFS2_LAST_LOCAL_SYSTEM_INODE LOCAL_GROUP_QUOTA_SYSTEM_INODE
34462306a36Sopenharmony_ci	NUM_SYSTEM_INODES
34562306a36Sopenharmony_ci};
34662306a36Sopenharmony_ci#define NUM_GLOBAL_SYSTEM_INODES OCFS2_FIRST_LOCAL_SYSTEM_INODE
34762306a36Sopenharmony_ci#define NUM_LOCAL_SYSTEM_INODES	\
34862306a36Sopenharmony_ci		(NUM_SYSTEM_INODES - OCFS2_FIRST_LOCAL_SYSTEM_INODE)
34962306a36Sopenharmony_ci
35062306a36Sopenharmony_cistatic struct ocfs2_system_inode_info ocfs2_system_inodes[NUM_SYSTEM_INODES] = {
35162306a36Sopenharmony_ci	/* Global system inodes (single copy) */
35262306a36Sopenharmony_ci	/* The first two are only used from userspace mfks/tunefs */
35362306a36Sopenharmony_ci	[BAD_BLOCK_SYSTEM_INODE]		= { "bad_blocks", 0, S_IFREG | 0644 },
35462306a36Sopenharmony_ci	[GLOBAL_INODE_ALLOC_SYSTEM_INODE] 	= { "global_inode_alloc", OCFS2_BITMAP_FL | OCFS2_CHAIN_FL, S_IFREG | 0644 },
35562306a36Sopenharmony_ci
35662306a36Sopenharmony_ci	/* These are used by the running filesystem */
35762306a36Sopenharmony_ci	[SLOT_MAP_SYSTEM_INODE]			= { "slot_map", 0, S_IFREG | 0644 },
35862306a36Sopenharmony_ci	[HEARTBEAT_SYSTEM_INODE]		= { "heartbeat", OCFS2_HEARTBEAT_FL, S_IFREG | 0644 },
35962306a36Sopenharmony_ci	[GLOBAL_BITMAP_SYSTEM_INODE]		= { "global_bitmap", 0, S_IFREG | 0644 },
36062306a36Sopenharmony_ci	[USER_QUOTA_SYSTEM_INODE]		= { "aquota.user", OCFS2_QUOTA_FL, S_IFREG | 0644 },
36162306a36Sopenharmony_ci	[GROUP_QUOTA_SYSTEM_INODE]		= { "aquota.group", OCFS2_QUOTA_FL, S_IFREG | 0644 },
36262306a36Sopenharmony_ci
36362306a36Sopenharmony_ci	/* Slot-specific system inodes (one copy per slot) */
36462306a36Sopenharmony_ci	[ORPHAN_DIR_SYSTEM_INODE]		= { "orphan_dir:%04d", 0, S_IFDIR | 0755 },
36562306a36Sopenharmony_ci	[EXTENT_ALLOC_SYSTEM_INODE]		= { "extent_alloc:%04d", OCFS2_BITMAP_FL | OCFS2_CHAIN_FL, S_IFREG | 0644 },
36662306a36Sopenharmony_ci	[INODE_ALLOC_SYSTEM_INODE]		= { "inode_alloc:%04d", OCFS2_BITMAP_FL | OCFS2_CHAIN_FL, S_IFREG | 0644 },
36762306a36Sopenharmony_ci	[JOURNAL_SYSTEM_INODE]			= { "journal:%04d", OCFS2_JOURNAL_FL, S_IFREG | 0644 },
36862306a36Sopenharmony_ci	[LOCAL_ALLOC_SYSTEM_INODE]		= { "local_alloc:%04d", OCFS2_BITMAP_FL | OCFS2_LOCAL_ALLOC_FL, S_IFREG | 0644 },
36962306a36Sopenharmony_ci	[TRUNCATE_LOG_SYSTEM_INODE]		= { "truncate_log:%04d", OCFS2_DEALLOC_FL, S_IFREG | 0644 },
37062306a36Sopenharmony_ci	[LOCAL_USER_QUOTA_SYSTEM_INODE]		= { "aquota.user:%04d", OCFS2_QUOTA_FL, S_IFREG | 0644 },
37162306a36Sopenharmony_ci	[LOCAL_GROUP_QUOTA_SYSTEM_INODE]	= { "aquota.group:%04d", OCFS2_QUOTA_FL, S_IFREG | 0644 },
37262306a36Sopenharmony_ci};
37362306a36Sopenharmony_ci
37462306a36Sopenharmony_ci/* Parameter passed from mount.ocfs2 to module */
37562306a36Sopenharmony_ci#define OCFS2_HB_NONE			"heartbeat=none"
37662306a36Sopenharmony_ci#define OCFS2_HB_LOCAL			"heartbeat=local"
37762306a36Sopenharmony_ci#define OCFS2_HB_GLOBAL			"heartbeat=global"
37862306a36Sopenharmony_ci
37962306a36Sopenharmony_ci/*
38062306a36Sopenharmony_ci * OCFS2_DIR_PAD defines the directory entries boundaries
38162306a36Sopenharmony_ci *
38262306a36Sopenharmony_ci * NOTE: It must be a multiple of 4
38362306a36Sopenharmony_ci */
38462306a36Sopenharmony_ci#define OCFS2_DIR_PAD			4
38562306a36Sopenharmony_ci#define OCFS2_DIR_ROUND			(OCFS2_DIR_PAD - 1)
38662306a36Sopenharmony_ci#define OCFS2_DIR_MEMBER_LEN 		offsetof(struct ocfs2_dir_entry, name)
38762306a36Sopenharmony_ci#define OCFS2_DIR_REC_LEN(name_len)	(((name_len) + OCFS2_DIR_MEMBER_LEN + \
38862306a36Sopenharmony_ci                                          OCFS2_DIR_ROUND) & \
38962306a36Sopenharmony_ci					 ~OCFS2_DIR_ROUND)
39062306a36Sopenharmony_ci#define OCFS2_DIR_MIN_REC_LEN	OCFS2_DIR_REC_LEN(1)
39162306a36Sopenharmony_ci
39262306a36Sopenharmony_ci#define OCFS2_LINK_MAX		32000
39362306a36Sopenharmony_ci#define	OCFS2_DX_LINK_MAX	((1U << 31) - 1U)
39462306a36Sopenharmony_ci#define	OCFS2_LINKS_HI_SHIFT	16
39562306a36Sopenharmony_ci#define	OCFS2_DX_ENTRIES_MAX	(0xffffffffU)
39662306a36Sopenharmony_ci
39762306a36Sopenharmony_ci
39862306a36Sopenharmony_ci/*
39962306a36Sopenharmony_ci * Convenience casts
40062306a36Sopenharmony_ci */
40162306a36Sopenharmony_ci#define OCFS2_RAW_SB(dinode)		(&((dinode)->id2.i_super))
40262306a36Sopenharmony_ci
40362306a36Sopenharmony_ci/*
40462306a36Sopenharmony_ci * Block checking structure.  This is used in metadata to validate the
40562306a36Sopenharmony_ci * contents.  If OCFS2_FEATURE_INCOMPAT_META_ECC is not set, it is all
40662306a36Sopenharmony_ci * zeros.
40762306a36Sopenharmony_ci */
40862306a36Sopenharmony_cistruct ocfs2_block_check {
40962306a36Sopenharmony_ci/*00*/	__le32 bc_crc32e;	/* 802.3 Ethernet II CRC32 */
41062306a36Sopenharmony_ci	__le16 bc_ecc;		/* Single-error-correction parity vector.
41162306a36Sopenharmony_ci				   This is a simple Hamming code dependent
41262306a36Sopenharmony_ci				   on the blocksize.  OCFS2's maximum
41362306a36Sopenharmony_ci				   blocksize, 4K, requires 16 parity bits,
41462306a36Sopenharmony_ci				   so we fit in __le16. */
41562306a36Sopenharmony_ci	__le16 bc_reserved1;
41662306a36Sopenharmony_ci/*08*/
41762306a36Sopenharmony_ci};
41862306a36Sopenharmony_ci
41962306a36Sopenharmony_ci/*
42062306a36Sopenharmony_ci * On disk extent record for OCFS2
42162306a36Sopenharmony_ci * It describes a range of clusters on disk.
42262306a36Sopenharmony_ci *
42362306a36Sopenharmony_ci * Length fields are divided into interior and leaf node versions.
42462306a36Sopenharmony_ci * This leaves room for a flags field (OCFS2_EXT_*) in the leaf nodes.
42562306a36Sopenharmony_ci */
42662306a36Sopenharmony_cistruct ocfs2_extent_rec {
42762306a36Sopenharmony_ci/*00*/	__le32 e_cpos;		/* Offset into the file, in clusters */
42862306a36Sopenharmony_ci	union {
42962306a36Sopenharmony_ci		__le32 e_int_clusters; /* Clusters covered by all children */
43062306a36Sopenharmony_ci		struct {
43162306a36Sopenharmony_ci			__le16 e_leaf_clusters; /* Clusters covered by this
43262306a36Sopenharmony_ci						   extent */
43362306a36Sopenharmony_ci			__u8 e_reserved1;
43462306a36Sopenharmony_ci			__u8 e_flags; /* Extent flags */
43562306a36Sopenharmony_ci		};
43662306a36Sopenharmony_ci	};
43762306a36Sopenharmony_ci	__le64 e_blkno;		/* Physical disk offset, in blocks */
43862306a36Sopenharmony_ci/*10*/
43962306a36Sopenharmony_ci};
44062306a36Sopenharmony_ci
44162306a36Sopenharmony_cistruct ocfs2_chain_rec {
44262306a36Sopenharmony_ci	__le32 c_free;	/* Number of free bits in this chain. */
44362306a36Sopenharmony_ci	__le32 c_total;	/* Number of total bits in this chain */
44462306a36Sopenharmony_ci	__le64 c_blkno;	/* Physical disk offset (blocks) of 1st group */
44562306a36Sopenharmony_ci};
44662306a36Sopenharmony_ci
44762306a36Sopenharmony_cistruct ocfs2_truncate_rec {
44862306a36Sopenharmony_ci	__le32 t_start;		/* 1st cluster in this log */
44962306a36Sopenharmony_ci	__le32 t_clusters;	/* Number of total clusters covered */
45062306a36Sopenharmony_ci};
45162306a36Sopenharmony_ci
45262306a36Sopenharmony_ci/*
45362306a36Sopenharmony_ci * On disk extent list for OCFS2 (node in the tree).  Note that this
45462306a36Sopenharmony_ci * is contained inside ocfs2_dinode or ocfs2_extent_block, so the
45562306a36Sopenharmony_ci * offsets are relative to ocfs2_dinode.id2.i_list or
45662306a36Sopenharmony_ci * ocfs2_extent_block.h_list, respectively.
45762306a36Sopenharmony_ci */
45862306a36Sopenharmony_cistruct ocfs2_extent_list {
45962306a36Sopenharmony_ci/*00*/	__le16 l_tree_depth;		/* Extent tree depth from this
46062306a36Sopenharmony_ci					   point.  0 means data extents
46162306a36Sopenharmony_ci					   hang directly off this
46262306a36Sopenharmony_ci					   header (a leaf)
46362306a36Sopenharmony_ci					   NOTE: The high 8 bits cannot be
46462306a36Sopenharmony_ci					   used - tree_depth is never that big.
46562306a36Sopenharmony_ci					*/
46662306a36Sopenharmony_ci	__le16 l_count;			/* Number of extent records */
46762306a36Sopenharmony_ci	__le16 l_next_free_rec;		/* Next unused extent slot */
46862306a36Sopenharmony_ci	__le16 l_reserved1;
46962306a36Sopenharmony_ci	__le64 l_reserved2;		/* Pad to
47062306a36Sopenharmony_ci					   sizeof(ocfs2_extent_rec) */
47162306a36Sopenharmony_ci/*10*/	struct ocfs2_extent_rec l_recs[];	/* Extent records */
47262306a36Sopenharmony_ci};
47362306a36Sopenharmony_ci
47462306a36Sopenharmony_ci/*
47562306a36Sopenharmony_ci * On disk allocation chain list for OCFS2.  Note that this is
47662306a36Sopenharmony_ci * contained inside ocfs2_dinode, so the offsets are relative to
47762306a36Sopenharmony_ci * ocfs2_dinode.id2.i_chain.
47862306a36Sopenharmony_ci */
47962306a36Sopenharmony_cistruct ocfs2_chain_list {
48062306a36Sopenharmony_ci/*00*/	__le16 cl_cpg;			/* Clusters per Block Group */
48162306a36Sopenharmony_ci	__le16 cl_bpc;			/* Bits per cluster */
48262306a36Sopenharmony_ci	__le16 cl_count;		/* Total chains in this list */
48362306a36Sopenharmony_ci	__le16 cl_next_free_rec;	/* Next unused chain slot */
48462306a36Sopenharmony_ci	__le64 cl_reserved1;
48562306a36Sopenharmony_ci/*10*/	struct ocfs2_chain_rec cl_recs[];	/* Chain records */
48662306a36Sopenharmony_ci};
48762306a36Sopenharmony_ci
48862306a36Sopenharmony_ci/*
48962306a36Sopenharmony_ci * On disk deallocation log for OCFS2.  Note that this is
49062306a36Sopenharmony_ci * contained inside ocfs2_dinode, so the offsets are relative to
49162306a36Sopenharmony_ci * ocfs2_dinode.id2.i_dealloc.
49262306a36Sopenharmony_ci */
49362306a36Sopenharmony_cistruct ocfs2_truncate_log {
49462306a36Sopenharmony_ci/*00*/	__le16 tl_count;		/* Total records in this log */
49562306a36Sopenharmony_ci	__le16 tl_used;			/* Number of records in use */
49662306a36Sopenharmony_ci	__le32 tl_reserved1;
49762306a36Sopenharmony_ci/*08*/	struct ocfs2_truncate_rec tl_recs[];	/* Truncate records */
49862306a36Sopenharmony_ci};
49962306a36Sopenharmony_ci
50062306a36Sopenharmony_ci/*
50162306a36Sopenharmony_ci * On disk extent block (indirect block) for OCFS2
50262306a36Sopenharmony_ci */
50362306a36Sopenharmony_cistruct ocfs2_extent_block
50462306a36Sopenharmony_ci{
50562306a36Sopenharmony_ci/*00*/	__u8 h_signature[8];		/* Signature for verification */
50662306a36Sopenharmony_ci	struct ocfs2_block_check h_check;	/* Error checking */
50762306a36Sopenharmony_ci/*10*/	__le16 h_suballoc_slot;		/* Slot suballocator this
50862306a36Sopenharmony_ci					   extent_header belongs to */
50962306a36Sopenharmony_ci	__le16 h_suballoc_bit;		/* Bit offset in suballocator
51062306a36Sopenharmony_ci					   block group */
51162306a36Sopenharmony_ci	__le32 h_fs_generation;		/* Must match super block */
51262306a36Sopenharmony_ci	__le64 h_blkno;			/* Offset on disk, in blocks */
51362306a36Sopenharmony_ci/*20*/	__le64 h_suballoc_loc;		/* Suballocator block group this
51462306a36Sopenharmony_ci					   eb belongs to.  Only valid
51562306a36Sopenharmony_ci					   if allocated from a
51662306a36Sopenharmony_ci					   discontiguous block group */
51762306a36Sopenharmony_ci	__le64 h_next_leaf_blk;		/* Offset on disk, in blocks,
51862306a36Sopenharmony_ci					   of next leaf header pointing
51962306a36Sopenharmony_ci					   to data */
52062306a36Sopenharmony_ci/*30*/	struct ocfs2_extent_list h_list;	/* Extent record list */
52162306a36Sopenharmony_ci/* Actual on-disk size is one block */
52262306a36Sopenharmony_ci};
52362306a36Sopenharmony_ci
52462306a36Sopenharmony_ci/*
52562306a36Sopenharmony_ci * On disk slot map for OCFS2.  This defines the contents of the "slot_map"
52662306a36Sopenharmony_ci * system file.  A slot is valid if it contains a node number >= 0.  The
52762306a36Sopenharmony_ci * value -1 (0xFFFF) is OCFS2_INVALID_SLOT.  This marks a slot empty.
52862306a36Sopenharmony_ci */
52962306a36Sopenharmony_cistruct ocfs2_slot_map {
53062306a36Sopenharmony_ci/*00*/	DECLARE_FLEX_ARRAY(__le16, sm_slots);
53162306a36Sopenharmony_ci/*
53262306a36Sopenharmony_ci * Actual on-disk size is one block.  OCFS2_MAX_SLOTS is 255,
53362306a36Sopenharmony_ci * 255 * sizeof(__le16) == 512B, within the 512B block minimum blocksize.
53462306a36Sopenharmony_ci */
53562306a36Sopenharmony_ci};
53662306a36Sopenharmony_ci
53762306a36Sopenharmony_cistruct ocfs2_extended_slot {
53862306a36Sopenharmony_ci/*00*/	__u8	es_valid;
53962306a36Sopenharmony_ci	__u8	es_reserved1[3];
54062306a36Sopenharmony_ci	__le32	es_node_num;
54162306a36Sopenharmony_ci/*08*/
54262306a36Sopenharmony_ci};
54362306a36Sopenharmony_ci
54462306a36Sopenharmony_ci/*
54562306a36Sopenharmony_ci * The extended slot map, used when OCFS2_FEATURE_INCOMPAT_EXTENDED_SLOT_MAP
54662306a36Sopenharmony_ci * is set.  It separates out the valid marker from the node number, and
54762306a36Sopenharmony_ci * has room to grow.  Unlike the old slot map, this format is defined by
54862306a36Sopenharmony_ci * i_size.
54962306a36Sopenharmony_ci */
55062306a36Sopenharmony_cistruct ocfs2_slot_map_extended {
55162306a36Sopenharmony_ci/*00*/	DECLARE_FLEX_ARRAY(struct ocfs2_extended_slot, se_slots);
55262306a36Sopenharmony_ci/*
55362306a36Sopenharmony_ci * Actual size is i_size of the slot_map system file.  It should
55462306a36Sopenharmony_ci * match s_max_slots * sizeof(struct ocfs2_extended_slot)
55562306a36Sopenharmony_ci */
55662306a36Sopenharmony_ci};
55762306a36Sopenharmony_ci
55862306a36Sopenharmony_ci/*
55962306a36Sopenharmony_ci * ci_stackflags is only valid if the incompat bit
56062306a36Sopenharmony_ci * OCFS2_FEATURE_INCOMPAT_CLUSTERINFO is set.
56162306a36Sopenharmony_ci */
56262306a36Sopenharmony_cistruct ocfs2_cluster_info {
56362306a36Sopenharmony_ci/*00*/	__u8   ci_stack[OCFS2_STACK_LABEL_LEN];
56462306a36Sopenharmony_ci	union {
56562306a36Sopenharmony_ci		__le32 ci_reserved;
56662306a36Sopenharmony_ci		struct {
56762306a36Sopenharmony_ci			__u8 ci_stackflags;
56862306a36Sopenharmony_ci			__u8 ci_reserved1;
56962306a36Sopenharmony_ci			__u8 ci_reserved2;
57062306a36Sopenharmony_ci			__u8 ci_reserved3;
57162306a36Sopenharmony_ci		};
57262306a36Sopenharmony_ci	};
57362306a36Sopenharmony_ci/*08*/	__u8   ci_cluster[OCFS2_CLUSTER_NAME_LEN];
57462306a36Sopenharmony_ci/*18*/
57562306a36Sopenharmony_ci};
57662306a36Sopenharmony_ci
57762306a36Sopenharmony_ci/*
57862306a36Sopenharmony_ci * On disk superblock for OCFS2
57962306a36Sopenharmony_ci * Note that it is contained inside an ocfs2_dinode, so all offsets
58062306a36Sopenharmony_ci * are relative to the start of ocfs2_dinode.id2.
58162306a36Sopenharmony_ci */
58262306a36Sopenharmony_cistruct ocfs2_super_block {
58362306a36Sopenharmony_ci/*00*/	__le16 s_major_rev_level;
58462306a36Sopenharmony_ci	__le16 s_minor_rev_level;
58562306a36Sopenharmony_ci	__le16 s_mnt_count;
58662306a36Sopenharmony_ci	__le16 s_max_mnt_count;
58762306a36Sopenharmony_ci	__le16 s_state;			/* File system state */
58862306a36Sopenharmony_ci	__le16 s_errors;			/* Behaviour when detecting errors */
58962306a36Sopenharmony_ci	__le32 s_checkinterval;		/* Max time between checks */
59062306a36Sopenharmony_ci/*10*/	__le64 s_lastcheck;		/* Time of last check */
59162306a36Sopenharmony_ci	__le32 s_creator_os;		/* OS */
59262306a36Sopenharmony_ci	__le32 s_feature_compat;		/* Compatible feature set */
59362306a36Sopenharmony_ci/*20*/	__le32 s_feature_incompat;	/* Incompatible feature set */
59462306a36Sopenharmony_ci	__le32 s_feature_ro_compat;	/* Readonly-compatible feature set */
59562306a36Sopenharmony_ci	__le64 s_root_blkno;		/* Offset, in blocks, of root directory
59662306a36Sopenharmony_ci					   dinode */
59762306a36Sopenharmony_ci/*30*/	__le64 s_system_dir_blkno;	/* Offset, in blocks, of system
59862306a36Sopenharmony_ci					   directory dinode */
59962306a36Sopenharmony_ci	__le32 s_blocksize_bits;		/* Blocksize for this fs */
60062306a36Sopenharmony_ci	__le32 s_clustersize_bits;	/* Clustersize for this fs */
60162306a36Sopenharmony_ci/*40*/	__le16 s_max_slots;		/* Max number of simultaneous mounts
60262306a36Sopenharmony_ci					   before tunefs required */
60362306a36Sopenharmony_ci	__le16 s_tunefs_flag;
60462306a36Sopenharmony_ci	__le32 s_uuid_hash;		/* hash value of uuid */
60562306a36Sopenharmony_ci	__le64 s_first_cluster_group;	/* Block offset of 1st cluster
60662306a36Sopenharmony_ci					 * group header */
60762306a36Sopenharmony_ci/*50*/	__u8  s_label[OCFS2_MAX_VOL_LABEL_LEN];	/* Label for mounting, etc. */
60862306a36Sopenharmony_ci/*90*/	__u8  s_uuid[OCFS2_VOL_UUID_LEN];	/* 128-bit uuid */
60962306a36Sopenharmony_ci/*A0*/  struct ocfs2_cluster_info s_cluster_info; /* Only valid if either
61062306a36Sopenharmony_ci						     userspace or clusterinfo
61162306a36Sopenharmony_ci						     INCOMPAT flag set. */
61262306a36Sopenharmony_ci/*B8*/	__le16 s_xattr_inline_size;	/* extended attribute inline size
61362306a36Sopenharmony_ci					   for this fs*/
61462306a36Sopenharmony_ci	__le16 s_reserved0;
61562306a36Sopenharmony_ci	__le32 s_dx_seed[3];		/* seed[0-2] for dx dir hash.
61662306a36Sopenharmony_ci					 * s_uuid_hash serves as seed[3]. */
61762306a36Sopenharmony_ci/*C0*/  __le64 s_reserved2[15];		/* Fill out superblock */
61862306a36Sopenharmony_ci/*140*/
61962306a36Sopenharmony_ci
62062306a36Sopenharmony_ci	/*
62162306a36Sopenharmony_ci	 * NOTE: As stated above, all offsets are relative to
62262306a36Sopenharmony_ci	 * ocfs2_dinode.id2, which is at 0xC0 in the inode.
62362306a36Sopenharmony_ci	 * 0xC0 + 0x140 = 0x200 or 512 bytes.  A superblock must fit within
62462306a36Sopenharmony_ci	 * our smallest blocksize, which is 512 bytes.  To ensure this,
62562306a36Sopenharmony_ci	 * we reserve the space in s_reserved2.  Anything past s_reserved2
62662306a36Sopenharmony_ci	 * will not be available on the smallest blocksize.
62762306a36Sopenharmony_ci	 */
62862306a36Sopenharmony_ci};
62962306a36Sopenharmony_ci
63062306a36Sopenharmony_ci/*
63162306a36Sopenharmony_ci * Local allocation bitmap for OCFS2 slots
63262306a36Sopenharmony_ci * Note that it exists inside an ocfs2_dinode, so all offsets are
63362306a36Sopenharmony_ci * relative to the start of ocfs2_dinode.id2.
63462306a36Sopenharmony_ci */
63562306a36Sopenharmony_cistruct ocfs2_local_alloc
63662306a36Sopenharmony_ci{
63762306a36Sopenharmony_ci/*00*/	__le32 la_bm_off;	/* Starting bit offset in main bitmap */
63862306a36Sopenharmony_ci	__le16 la_size;		/* Size of included bitmap, in bytes */
63962306a36Sopenharmony_ci	__le16 la_reserved1;
64062306a36Sopenharmony_ci	__le64 la_reserved2;
64162306a36Sopenharmony_ci/*10*/	__u8   la_bitmap[];
64262306a36Sopenharmony_ci};
64362306a36Sopenharmony_ci
64462306a36Sopenharmony_ci/*
64562306a36Sopenharmony_ci * Data-in-inode header. This is only used if i_dyn_features has
64662306a36Sopenharmony_ci * OCFS2_INLINE_DATA_FL set.
64762306a36Sopenharmony_ci */
64862306a36Sopenharmony_cistruct ocfs2_inline_data
64962306a36Sopenharmony_ci{
65062306a36Sopenharmony_ci/*00*/	__le16	id_count;	/* Number of bytes that can be used
65162306a36Sopenharmony_ci				 * for data, starting at id_data */
65262306a36Sopenharmony_ci	__le16	id_reserved0;
65362306a36Sopenharmony_ci	__le32	id_reserved1;
65462306a36Sopenharmony_ci	__u8	id_data[];	/* Start of user data */
65562306a36Sopenharmony_ci};
65662306a36Sopenharmony_ci
65762306a36Sopenharmony_ci/*
65862306a36Sopenharmony_ci * On disk inode for OCFS2
65962306a36Sopenharmony_ci */
66062306a36Sopenharmony_cistruct ocfs2_dinode {
66162306a36Sopenharmony_ci/*00*/	__u8 i_signature[8];		/* Signature for validation */
66262306a36Sopenharmony_ci	__le32 i_generation;		/* Generation number */
66362306a36Sopenharmony_ci	__le16 i_suballoc_slot;		/* Slot suballocator this inode
66462306a36Sopenharmony_ci					   belongs to */
66562306a36Sopenharmony_ci	__le16 i_suballoc_bit;		/* Bit offset in suballocator
66662306a36Sopenharmony_ci					   block group */
66762306a36Sopenharmony_ci/*10*/	__le16 i_links_count_hi;	/* High 16 bits of links count */
66862306a36Sopenharmony_ci	__le16 i_xattr_inline_size;
66962306a36Sopenharmony_ci	__le32 i_clusters;		/* Cluster count */
67062306a36Sopenharmony_ci	__le32 i_uid;			/* Owner UID */
67162306a36Sopenharmony_ci	__le32 i_gid;			/* Owning GID */
67262306a36Sopenharmony_ci/*20*/	__le64 i_size;			/* Size in bytes */
67362306a36Sopenharmony_ci	__le16 i_mode;			/* File mode */
67462306a36Sopenharmony_ci	__le16 i_links_count;		/* Links count */
67562306a36Sopenharmony_ci	__le32 i_flags;			/* File flags */
67662306a36Sopenharmony_ci/*30*/	__le64 i_atime;			/* Access time */
67762306a36Sopenharmony_ci	__le64 i_ctime;			/* Creation time */
67862306a36Sopenharmony_ci/*40*/	__le64 i_mtime;			/* Modification time */
67962306a36Sopenharmony_ci	__le64 i_dtime;			/* Deletion time */
68062306a36Sopenharmony_ci/*50*/	__le64 i_blkno;			/* Offset on disk, in blocks */
68162306a36Sopenharmony_ci	__le64 i_last_eb_blk;		/* Pointer to last extent
68262306a36Sopenharmony_ci					   block */
68362306a36Sopenharmony_ci/*60*/	__le32 i_fs_generation;		/* Generation per fs-instance */
68462306a36Sopenharmony_ci	__le32 i_atime_nsec;
68562306a36Sopenharmony_ci	__le32 i_ctime_nsec;
68662306a36Sopenharmony_ci	__le32 i_mtime_nsec;
68762306a36Sopenharmony_ci/*70*/	__le32 i_attr;
68862306a36Sopenharmony_ci	__le16 i_orphaned_slot;		/* Only valid when OCFS2_ORPHANED_FL
68962306a36Sopenharmony_ci					   was set in i_flags */
69062306a36Sopenharmony_ci	__le16 i_dyn_features;
69162306a36Sopenharmony_ci	__le64 i_xattr_loc;
69262306a36Sopenharmony_ci/*80*/	struct ocfs2_block_check i_check;	/* Error checking */
69362306a36Sopenharmony_ci/*88*/	__le64 i_dx_root;		/* Pointer to dir index root block */
69462306a36Sopenharmony_ci/*90*/	__le64 i_refcount_loc;
69562306a36Sopenharmony_ci	__le64 i_suballoc_loc;		/* Suballocator block group this
69662306a36Sopenharmony_ci					   inode belongs to.  Only valid
69762306a36Sopenharmony_ci					   if allocated from a
69862306a36Sopenharmony_ci					   discontiguous block group */
69962306a36Sopenharmony_ci/*A0*/	__le16 i_dio_orphaned_slot;	/* only used for append dio write */
70062306a36Sopenharmony_ci	__le16 i_reserved1[3];
70162306a36Sopenharmony_ci	__le64 i_reserved2[2];
70262306a36Sopenharmony_ci/*B8*/	union {
70362306a36Sopenharmony_ci		__le64 i_pad1;		/* Generic way to refer to this
70462306a36Sopenharmony_ci					   64bit union */
70562306a36Sopenharmony_ci		struct {
70662306a36Sopenharmony_ci			__le64 i_rdev;	/* Device number */
70762306a36Sopenharmony_ci		} dev1;
70862306a36Sopenharmony_ci		struct {		/* Info for bitmap system
70962306a36Sopenharmony_ci					   inodes */
71062306a36Sopenharmony_ci			__le32 i_used;	/* Bits (ie, clusters) used  */
71162306a36Sopenharmony_ci			__le32 i_total;	/* Total bits (clusters)
71262306a36Sopenharmony_ci					   available */
71362306a36Sopenharmony_ci		} bitmap1;
71462306a36Sopenharmony_ci		struct {		/* Info for journal system
71562306a36Sopenharmony_ci					   inodes */
71662306a36Sopenharmony_ci			__le32 ij_flags;	/* Mounted, version, etc. */
71762306a36Sopenharmony_ci			__le32 ij_recovery_generation; /* Incremented when the
71862306a36Sopenharmony_ci							  journal is recovered
71962306a36Sopenharmony_ci							  after an unclean
72062306a36Sopenharmony_ci							  shutdown */
72162306a36Sopenharmony_ci		} journal1;
72262306a36Sopenharmony_ci	} id1;				/* Inode type dependent 1 */
72362306a36Sopenharmony_ci/*C0*/	union {
72462306a36Sopenharmony_ci		struct ocfs2_super_block	i_super;
72562306a36Sopenharmony_ci		struct ocfs2_local_alloc	i_lab;
72662306a36Sopenharmony_ci		struct ocfs2_chain_list		i_chain;
72762306a36Sopenharmony_ci		struct ocfs2_extent_list	i_list;
72862306a36Sopenharmony_ci		struct ocfs2_truncate_log	i_dealloc;
72962306a36Sopenharmony_ci		struct ocfs2_inline_data	i_data;
73062306a36Sopenharmony_ci		DECLARE_FLEX_ARRAY(__u8,	i_symlink);
73162306a36Sopenharmony_ci	} id2;
73262306a36Sopenharmony_ci/* Actual on-disk size is one block */
73362306a36Sopenharmony_ci};
73462306a36Sopenharmony_ci
73562306a36Sopenharmony_ci/*
73662306a36Sopenharmony_ci * On-disk directory entry structure for OCFS2
73762306a36Sopenharmony_ci *
73862306a36Sopenharmony_ci * Packed as this structure could be accessed unaligned on 64-bit platforms
73962306a36Sopenharmony_ci */
74062306a36Sopenharmony_cistruct ocfs2_dir_entry {
74162306a36Sopenharmony_ci/*00*/	__le64   inode;                  /* Inode number */
74262306a36Sopenharmony_ci	__le16   rec_len;                /* Directory entry length */
74362306a36Sopenharmony_ci	__u8    name_len;               /* Name length */
74462306a36Sopenharmony_ci	__u8    file_type;
74562306a36Sopenharmony_ci/*0C*/	char    name[OCFS2_MAX_FILENAME_LEN];   /* File name */
74662306a36Sopenharmony_ci/* Actual on-disk length specified by rec_len */
74762306a36Sopenharmony_ci} __attribute__ ((packed));
74862306a36Sopenharmony_ci
74962306a36Sopenharmony_ci/*
75062306a36Sopenharmony_ci * Per-block record for the unindexed directory btree. This is carefully
75162306a36Sopenharmony_ci * crafted so that the rec_len and name_len records of an ocfs2_dir_entry are
75262306a36Sopenharmony_ci * mirrored. That way, the directory manipulation code needs a minimal amount
75362306a36Sopenharmony_ci * of update.
75462306a36Sopenharmony_ci *
75562306a36Sopenharmony_ci * NOTE: Keep this structure aligned to a multiple of 4 bytes.
75662306a36Sopenharmony_ci */
75762306a36Sopenharmony_cistruct ocfs2_dir_block_trailer {
75862306a36Sopenharmony_ci/*00*/	__le64		db_compat_inode;	/* Always zero. Was inode */
75962306a36Sopenharmony_ci
76062306a36Sopenharmony_ci	__le16		db_compat_rec_len;	/* Backwards compatible with
76162306a36Sopenharmony_ci						 * ocfs2_dir_entry. */
76262306a36Sopenharmony_ci	__u8		db_compat_name_len;	/* Always zero. Was name_len */
76362306a36Sopenharmony_ci	__u8		db_reserved0;
76462306a36Sopenharmony_ci	__le16		db_reserved1;
76562306a36Sopenharmony_ci	__le16		db_free_rec_len;	/* Size of largest empty hole
76662306a36Sopenharmony_ci						 * in this block. (unused) */
76762306a36Sopenharmony_ci/*10*/	__u8		db_signature[8];	/* Signature for verification */
76862306a36Sopenharmony_ci	__le64		db_reserved2;
76962306a36Sopenharmony_ci/*20*/	__le64		db_free_next;		/* Next block in list (unused) */
77062306a36Sopenharmony_ci	__le64		db_blkno;		/* Offset on disk, in blocks */
77162306a36Sopenharmony_ci/*30*/	__le64		db_parent_dinode;	/* dinode which owns me, in
77262306a36Sopenharmony_ci						   blocks */
77362306a36Sopenharmony_ci	struct ocfs2_block_check db_check;	/* Error checking */
77462306a36Sopenharmony_ci/*40*/
77562306a36Sopenharmony_ci};
77662306a36Sopenharmony_ci
77762306a36Sopenharmony_ci /*
77862306a36Sopenharmony_ci * A directory entry in the indexed tree. We don't store the full name here,
77962306a36Sopenharmony_ci * but instead provide a pointer to the full dirent in the unindexed tree.
78062306a36Sopenharmony_ci *
78162306a36Sopenharmony_ci * We also store name_len here so as to reduce the number of leaf blocks we
78262306a36Sopenharmony_ci * need to search in case of collisions.
78362306a36Sopenharmony_ci */
78462306a36Sopenharmony_cistruct ocfs2_dx_entry {
78562306a36Sopenharmony_ci	__le32		dx_major_hash;	/* Used to find logical
78662306a36Sopenharmony_ci					 * cluster in index */
78762306a36Sopenharmony_ci	__le32		dx_minor_hash;	/* Lower bits used to find
78862306a36Sopenharmony_ci					 * block in cluster */
78962306a36Sopenharmony_ci	__le64		dx_dirent_blk;	/* Physical block in unindexed
79062306a36Sopenharmony_ci					 * tree holding this dirent. */
79162306a36Sopenharmony_ci};
79262306a36Sopenharmony_ci
79362306a36Sopenharmony_cistruct ocfs2_dx_entry_list {
79462306a36Sopenharmony_ci	__le32		de_reserved;
79562306a36Sopenharmony_ci	__le16		de_count;	/* Maximum number of entries
79662306a36Sopenharmony_ci					 * possible in de_entries */
79762306a36Sopenharmony_ci	__le16		de_num_used;	/* Current number of
79862306a36Sopenharmony_ci					 * de_entries entries */
79962306a36Sopenharmony_ci	struct	ocfs2_dx_entry		de_entries[];	/* Indexed dir entries
80062306a36Sopenharmony_ci							 * in a packed array of
80162306a36Sopenharmony_ci							 * length de_num_used */
80262306a36Sopenharmony_ci};
80362306a36Sopenharmony_ci
80462306a36Sopenharmony_ci#define OCFS2_DX_FLAG_INLINE	0x01
80562306a36Sopenharmony_ci
80662306a36Sopenharmony_ci/*
80762306a36Sopenharmony_ci * A directory indexing block. Each indexed directory has one of these,
80862306a36Sopenharmony_ci * pointed to by ocfs2_dinode.
80962306a36Sopenharmony_ci *
81062306a36Sopenharmony_ci * This block stores an indexed btree root, and a set of free space
81162306a36Sopenharmony_ci * start-of-list pointers.
81262306a36Sopenharmony_ci */
81362306a36Sopenharmony_cistruct ocfs2_dx_root_block {
81462306a36Sopenharmony_ci	__u8		dr_signature[8];	/* Signature for verification */
81562306a36Sopenharmony_ci	struct ocfs2_block_check dr_check;	/* Error checking */
81662306a36Sopenharmony_ci	__le16		dr_suballoc_slot;	/* Slot suballocator this
81762306a36Sopenharmony_ci						 * block belongs to. */
81862306a36Sopenharmony_ci	__le16		dr_suballoc_bit;	/* Bit offset in suballocator
81962306a36Sopenharmony_ci						 * block group */
82062306a36Sopenharmony_ci	__le32		dr_fs_generation;	/* Must match super block */
82162306a36Sopenharmony_ci	__le64		dr_blkno;		/* Offset on disk, in blocks */
82262306a36Sopenharmony_ci	__le64		dr_last_eb_blk;		/* Pointer to last
82362306a36Sopenharmony_ci						 * extent block */
82462306a36Sopenharmony_ci	__le32		dr_clusters;		/* Clusters allocated
82562306a36Sopenharmony_ci						 * to the indexed tree. */
82662306a36Sopenharmony_ci	__u8		dr_flags;		/* OCFS2_DX_FLAG_* flags */
82762306a36Sopenharmony_ci	__u8		dr_reserved0;
82862306a36Sopenharmony_ci	__le16		dr_reserved1;
82962306a36Sopenharmony_ci	__le64		dr_dir_blkno;		/* Pointer to parent inode */
83062306a36Sopenharmony_ci	__le32		dr_num_entries;		/* Total number of
83162306a36Sopenharmony_ci						 * names stored in
83262306a36Sopenharmony_ci						 * this directory.*/
83362306a36Sopenharmony_ci	__le32		dr_reserved2;
83462306a36Sopenharmony_ci	__le64		dr_free_blk;		/* Pointer to head of free
83562306a36Sopenharmony_ci						 * unindexed block list. */
83662306a36Sopenharmony_ci	__le64		dr_suballoc_loc;	/* Suballocator block group
83762306a36Sopenharmony_ci						   this root belongs to.
83862306a36Sopenharmony_ci						   Only valid if allocated
83962306a36Sopenharmony_ci						   from a discontiguous
84062306a36Sopenharmony_ci						   block group */
84162306a36Sopenharmony_ci	__le64		dr_reserved3[14];
84262306a36Sopenharmony_ci	union {
84362306a36Sopenharmony_ci		struct ocfs2_extent_list dr_list; /* Keep this aligned to 128
84462306a36Sopenharmony_ci						   * bits for maximum space
84562306a36Sopenharmony_ci						   * efficiency. */
84662306a36Sopenharmony_ci		struct ocfs2_dx_entry_list dr_entries; /* In-root-block list of
84762306a36Sopenharmony_ci							* entries. We grow out
84862306a36Sopenharmony_ci							* to extents if this
84962306a36Sopenharmony_ci							* gets too big. */
85062306a36Sopenharmony_ci	};
85162306a36Sopenharmony_ci};
85262306a36Sopenharmony_ci
85362306a36Sopenharmony_ci/*
85462306a36Sopenharmony_ci * The header of a leaf block in the indexed tree.
85562306a36Sopenharmony_ci */
85662306a36Sopenharmony_cistruct ocfs2_dx_leaf {
85762306a36Sopenharmony_ci	__u8		dl_signature[8];/* Signature for verification */
85862306a36Sopenharmony_ci	struct ocfs2_block_check dl_check;	/* Error checking */
85962306a36Sopenharmony_ci	__le64		dl_blkno;	/* Offset on disk, in blocks */
86062306a36Sopenharmony_ci	__le32		dl_fs_generation;/* Must match super block */
86162306a36Sopenharmony_ci	__le32		dl_reserved0;
86262306a36Sopenharmony_ci	__le64		dl_reserved1;
86362306a36Sopenharmony_ci	struct ocfs2_dx_entry_list	dl_list;
86462306a36Sopenharmony_ci};
86562306a36Sopenharmony_ci
86662306a36Sopenharmony_ci/*
86762306a36Sopenharmony_ci * Largest bitmap for a block (suballocator) group in bytes.  This limit
86862306a36Sopenharmony_ci * does not affect cluster groups (global allocator).  Cluster group
86962306a36Sopenharmony_ci * bitmaps run to the end of the block.
87062306a36Sopenharmony_ci */
87162306a36Sopenharmony_ci#define OCFS2_MAX_BG_BITMAP_SIZE	256
87262306a36Sopenharmony_ci
87362306a36Sopenharmony_ci/*
87462306a36Sopenharmony_ci * On disk allocator group structure for OCFS2
87562306a36Sopenharmony_ci */
87662306a36Sopenharmony_cistruct ocfs2_group_desc
87762306a36Sopenharmony_ci{
87862306a36Sopenharmony_ci/*00*/	__u8    bg_signature[8];        /* Signature for validation */
87962306a36Sopenharmony_ci	__le16   bg_size;                /* Size of included bitmap in
88062306a36Sopenharmony_ci					   bytes. */
88162306a36Sopenharmony_ci	__le16   bg_bits;                /* Bits represented by this
88262306a36Sopenharmony_ci					   group. */
88362306a36Sopenharmony_ci	__le16	bg_free_bits_count;     /* Free bits count */
88462306a36Sopenharmony_ci	__le16   bg_chain;               /* What chain I am in. */
88562306a36Sopenharmony_ci/*10*/	__le32   bg_generation;
88662306a36Sopenharmony_ci	__le32	bg_reserved1;
88762306a36Sopenharmony_ci	__le64   bg_next_group;          /* Next group in my list, in
88862306a36Sopenharmony_ci					   blocks */
88962306a36Sopenharmony_ci/*20*/	__le64   bg_parent_dinode;       /* dinode which owns me, in
89062306a36Sopenharmony_ci					   blocks */
89162306a36Sopenharmony_ci	__le64   bg_blkno;               /* Offset on disk, in blocks */
89262306a36Sopenharmony_ci/*30*/	struct ocfs2_block_check bg_check;	/* Error checking */
89362306a36Sopenharmony_ci	__le64   bg_reserved2;
89462306a36Sopenharmony_ci/*40*/	union {
89562306a36Sopenharmony_ci		DECLARE_FLEX_ARRAY(__u8, bg_bitmap);
89662306a36Sopenharmony_ci		struct {
89762306a36Sopenharmony_ci			/*
89862306a36Sopenharmony_ci			 * Block groups may be discontiguous when
89962306a36Sopenharmony_ci			 * OCFS2_FEATURE_INCOMPAT_DISCONTIG_BG is set.
90062306a36Sopenharmony_ci			 * The extents of a discontiguous block group are
90162306a36Sopenharmony_ci			 * stored in bg_list.  It is a flat list.
90262306a36Sopenharmony_ci			 * l_tree_depth must always be zero.  A
90362306a36Sopenharmony_ci			 * discontiguous group is signified by a non-zero
90462306a36Sopenharmony_ci			 * bg_list->l_next_free_rec.  Only block groups
90562306a36Sopenharmony_ci			 * can be discontiguous; Cluster groups cannot.
90662306a36Sopenharmony_ci			 * We've never made a block group with more than
90762306a36Sopenharmony_ci			 * 2048 blocks (256 bytes of bg_bitmap).  This
90862306a36Sopenharmony_ci			 * codifies that limit so that we can fit bg_list.
90962306a36Sopenharmony_ci			 * bg_size of a discontiguous block group will
91062306a36Sopenharmony_ci			 * be 256 to match bg_bitmap_filler.
91162306a36Sopenharmony_ci			 */
91262306a36Sopenharmony_ci			__u8 bg_bitmap_filler[OCFS2_MAX_BG_BITMAP_SIZE];
91362306a36Sopenharmony_ci/*140*/			struct ocfs2_extent_list bg_list;
91462306a36Sopenharmony_ci		};
91562306a36Sopenharmony_ci	};
91662306a36Sopenharmony_ci/* Actual on-disk size is one block */
91762306a36Sopenharmony_ci};
91862306a36Sopenharmony_ci
91962306a36Sopenharmony_cistruct ocfs2_refcount_rec {
92062306a36Sopenharmony_ci/*00*/	__le64 r_cpos;		/* Physical offset, in clusters */
92162306a36Sopenharmony_ci	__le32 r_clusters;	/* Clusters covered by this extent */
92262306a36Sopenharmony_ci	__le32 r_refcount;	/* Reference count of this extent */
92362306a36Sopenharmony_ci/*10*/
92462306a36Sopenharmony_ci};
92562306a36Sopenharmony_ci#define OCFS2_32BIT_POS_MASK		(0xffffffffULL)
92662306a36Sopenharmony_ci
92762306a36Sopenharmony_ci#define OCFS2_REFCOUNT_LEAF_FL          (0x00000001)
92862306a36Sopenharmony_ci#define OCFS2_REFCOUNT_TREE_FL          (0x00000002)
92962306a36Sopenharmony_ci
93062306a36Sopenharmony_cistruct ocfs2_refcount_list {
93162306a36Sopenharmony_ci/*00*/	__le16 rl_count;	/* Maximum number of entries possible
93262306a36Sopenharmony_ci				   in rl_records */
93362306a36Sopenharmony_ci	__le16 rl_used;		/* Current number of used records */
93462306a36Sopenharmony_ci	__le32 rl_reserved2;
93562306a36Sopenharmony_ci	__le64 rl_reserved1;	/* Pad to sizeof(ocfs2_refcount_record) */
93662306a36Sopenharmony_ci/*10*/	struct ocfs2_refcount_rec rl_recs[];	/* Refcount records */
93762306a36Sopenharmony_ci};
93862306a36Sopenharmony_ci
93962306a36Sopenharmony_ci
94062306a36Sopenharmony_cistruct ocfs2_refcount_block {
94162306a36Sopenharmony_ci/*00*/	__u8 rf_signature[8];		/* Signature for verification */
94262306a36Sopenharmony_ci	__le16 rf_suballoc_slot;	/* Slot suballocator this block
94362306a36Sopenharmony_ci					   belongs to */
94462306a36Sopenharmony_ci	__le16 rf_suballoc_bit;		/* Bit offset in suballocator
94562306a36Sopenharmony_ci					   block group */
94662306a36Sopenharmony_ci	__le32 rf_fs_generation;	/* Must match superblock */
94762306a36Sopenharmony_ci/*10*/	__le64 rf_blkno;		/* Offset on disk, in blocks */
94862306a36Sopenharmony_ci	__le64 rf_parent;		/* Parent block, only valid if
94962306a36Sopenharmony_ci					   OCFS2_REFCOUNT_LEAF_FL is set in
95062306a36Sopenharmony_ci					   rf_flags */
95162306a36Sopenharmony_ci/*20*/	struct ocfs2_block_check rf_check;	/* Error checking */
95262306a36Sopenharmony_ci	__le64 rf_last_eb_blk;		/* Pointer to last extent block */
95362306a36Sopenharmony_ci/*30*/	__le32 rf_count;		/* Number of inodes sharing this
95462306a36Sopenharmony_ci					   refcount tree */
95562306a36Sopenharmony_ci	__le32 rf_flags;		/* See the flags above */
95662306a36Sopenharmony_ci	__le32 rf_clusters;		/* clusters covered by refcount tree. */
95762306a36Sopenharmony_ci	__le32 rf_cpos;			/* cluster offset in refcount tree.*/
95862306a36Sopenharmony_ci/*40*/	__le32 rf_generation;		/* generation number. all be the same
95962306a36Sopenharmony_ci					 * for the same refcount tree. */
96062306a36Sopenharmony_ci	__le32 rf_reserved0;
96162306a36Sopenharmony_ci	__le64 rf_suballoc_loc;		/* Suballocator block group this
96262306a36Sopenharmony_ci					   refcount block belongs to. Only
96362306a36Sopenharmony_ci					   valid if allocated from a
96462306a36Sopenharmony_ci					   discontiguous block group */
96562306a36Sopenharmony_ci/*50*/	__le64 rf_reserved1[6];
96662306a36Sopenharmony_ci/*80*/	union {
96762306a36Sopenharmony_ci		struct ocfs2_refcount_list rf_records;  /* List of refcount
96862306a36Sopenharmony_ci							  records */
96962306a36Sopenharmony_ci		struct ocfs2_extent_list rf_list;	/* Extent record list,
97062306a36Sopenharmony_ci							only valid if
97162306a36Sopenharmony_ci							OCFS2_REFCOUNT_TREE_FL
97262306a36Sopenharmony_ci							is set in rf_flags */
97362306a36Sopenharmony_ci	};
97462306a36Sopenharmony_ci/* Actual on-disk size is one block */
97562306a36Sopenharmony_ci};
97662306a36Sopenharmony_ci
97762306a36Sopenharmony_ci/*
97862306a36Sopenharmony_ci * On disk extended attribute structure for OCFS2.
97962306a36Sopenharmony_ci */
98062306a36Sopenharmony_ci
98162306a36Sopenharmony_ci/*
98262306a36Sopenharmony_ci * ocfs2_xattr_entry indicates one extend attribute.
98362306a36Sopenharmony_ci *
98462306a36Sopenharmony_ci * Note that it can be stored in inode, one block or one xattr bucket.
98562306a36Sopenharmony_ci */
98662306a36Sopenharmony_cistruct ocfs2_xattr_entry {
98762306a36Sopenharmony_ci	__le32	xe_name_hash;    /* hash value of xattr prefix+suffix. */
98862306a36Sopenharmony_ci	__le16	xe_name_offset;  /* byte offset from the 1st entry in the
98962306a36Sopenharmony_ci				    local xattr storage(inode, xattr block or
99062306a36Sopenharmony_ci				    xattr bucket). */
99162306a36Sopenharmony_ci	__u8	xe_name_len;	 /* xattr name len, doesn't include prefix. */
99262306a36Sopenharmony_ci	__u8	xe_type;         /* the low 7 bits indicate the name prefix
99362306a36Sopenharmony_ci				  * type and the highest bit indicates whether
99462306a36Sopenharmony_ci				  * the EA is stored in the local storage. */
99562306a36Sopenharmony_ci	__le64	xe_value_size;	 /* real xattr value length. */
99662306a36Sopenharmony_ci};
99762306a36Sopenharmony_ci
99862306a36Sopenharmony_ci/*
99962306a36Sopenharmony_ci * On disk structure for xattr header.
100062306a36Sopenharmony_ci *
100162306a36Sopenharmony_ci * One ocfs2_xattr_header describes how many ocfs2_xattr_entry records in
100262306a36Sopenharmony_ci * the local xattr storage.
100362306a36Sopenharmony_ci */
100462306a36Sopenharmony_cistruct ocfs2_xattr_header {
100562306a36Sopenharmony_ci	__le16	xh_count;                       /* contains the count of how
100662306a36Sopenharmony_ci						   many records are in the
100762306a36Sopenharmony_ci						   local xattr storage. */
100862306a36Sopenharmony_ci	__le16	xh_free_start;                  /* current offset for storing
100962306a36Sopenharmony_ci						   xattr. */
101062306a36Sopenharmony_ci	__le16	xh_name_value_len;              /* total length of name/value
101162306a36Sopenharmony_ci						   length in this bucket. */
101262306a36Sopenharmony_ci	__le16	xh_num_buckets;                 /* Number of xattr buckets
101362306a36Sopenharmony_ci						   in this extent record,
101462306a36Sopenharmony_ci						   only valid in the first
101562306a36Sopenharmony_ci						   bucket. */
101662306a36Sopenharmony_ci	struct ocfs2_block_check xh_check;	/* Error checking
101762306a36Sopenharmony_ci						   (Note, this is only
101862306a36Sopenharmony_ci						    used for xattr
101962306a36Sopenharmony_ci						    buckets.  A block uses
102062306a36Sopenharmony_ci						    xb_check and sets
102162306a36Sopenharmony_ci						    this field to zero.) */
102262306a36Sopenharmony_ci	struct ocfs2_xattr_entry xh_entries[]; /* xattr entry list. */
102362306a36Sopenharmony_ci};
102462306a36Sopenharmony_ci
102562306a36Sopenharmony_ci/*
102662306a36Sopenharmony_ci * On disk structure for xattr value root.
102762306a36Sopenharmony_ci *
102862306a36Sopenharmony_ci * When an xattr's value is large enough, it is stored in an external
102962306a36Sopenharmony_ci * b-tree like file data.  The xattr value root points to this structure.
103062306a36Sopenharmony_ci */
103162306a36Sopenharmony_cistruct ocfs2_xattr_value_root {
103262306a36Sopenharmony_ci/*00*/	__le32	xr_clusters;              /* clusters covered by xattr value. */
103362306a36Sopenharmony_ci	__le32	xr_reserved0;
103462306a36Sopenharmony_ci	__le64	xr_last_eb_blk;           /* Pointer to last extent block */
103562306a36Sopenharmony_ci/*10*/	struct ocfs2_extent_list xr_list; /* Extent record list */
103662306a36Sopenharmony_ci};
103762306a36Sopenharmony_ci
103862306a36Sopenharmony_ci/*
103962306a36Sopenharmony_ci * On disk structure for xattr tree root.
104062306a36Sopenharmony_ci *
104162306a36Sopenharmony_ci * It is used when there are too many extended attributes for one file. These
104262306a36Sopenharmony_ci * attributes will be organized and stored in an indexed-btree.
104362306a36Sopenharmony_ci */
104462306a36Sopenharmony_cistruct ocfs2_xattr_tree_root {
104562306a36Sopenharmony_ci/*00*/	__le32	xt_clusters;              /* clusters covered by xattr. */
104662306a36Sopenharmony_ci	__le32	xt_reserved0;
104762306a36Sopenharmony_ci	__le64	xt_last_eb_blk;           /* Pointer to last extent block */
104862306a36Sopenharmony_ci/*10*/	struct ocfs2_extent_list xt_list; /* Extent record list */
104962306a36Sopenharmony_ci};
105062306a36Sopenharmony_ci
105162306a36Sopenharmony_ci#define OCFS2_XATTR_INDEXED	0x1
105262306a36Sopenharmony_ci#define OCFS2_HASH_SHIFT	5
105362306a36Sopenharmony_ci#define OCFS2_XATTR_ROUND	3
105462306a36Sopenharmony_ci#define OCFS2_XATTR_SIZE(size)	(((size) + OCFS2_XATTR_ROUND) & \
105562306a36Sopenharmony_ci				~(OCFS2_XATTR_ROUND))
105662306a36Sopenharmony_ci
105762306a36Sopenharmony_ci#define OCFS2_XATTR_BUCKET_SIZE			4096
105862306a36Sopenharmony_ci#define OCFS2_XATTR_MAX_BLOCKS_PER_BUCKET 	(OCFS2_XATTR_BUCKET_SIZE \
105962306a36Sopenharmony_ci						 / OCFS2_MIN_BLOCKSIZE)
106062306a36Sopenharmony_ci
106162306a36Sopenharmony_ci/*
106262306a36Sopenharmony_ci * On disk structure for xattr block.
106362306a36Sopenharmony_ci */
106462306a36Sopenharmony_cistruct ocfs2_xattr_block {
106562306a36Sopenharmony_ci/*00*/	__u8	xb_signature[8];     /* Signature for verification */
106662306a36Sopenharmony_ci	__le16	xb_suballoc_slot;    /* Slot suballocator this
106762306a36Sopenharmony_ci					block belongs to. */
106862306a36Sopenharmony_ci	__le16	xb_suballoc_bit;     /* Bit offset in suballocator
106962306a36Sopenharmony_ci					block group */
107062306a36Sopenharmony_ci	__le32	xb_fs_generation;    /* Must match super block */
107162306a36Sopenharmony_ci/*10*/	__le64	xb_blkno;            /* Offset on disk, in blocks */
107262306a36Sopenharmony_ci	struct ocfs2_block_check xb_check;	/* Error checking */
107362306a36Sopenharmony_ci/*20*/	__le16	xb_flags;            /* Indicates whether this block contains
107462306a36Sopenharmony_ci					real xattr or a xattr tree. */
107562306a36Sopenharmony_ci	__le16	xb_reserved0;
107662306a36Sopenharmony_ci	__le32  xb_reserved1;
107762306a36Sopenharmony_ci	__le64	xb_suballoc_loc;	/* Suballocator block group this
107862306a36Sopenharmony_ci					   xattr block belongs to. Only
107962306a36Sopenharmony_ci					   valid if allocated from a
108062306a36Sopenharmony_ci					   discontiguous block group */
108162306a36Sopenharmony_ci/*30*/	union {
108262306a36Sopenharmony_ci		struct ocfs2_xattr_header xb_header; /* xattr header if this
108362306a36Sopenharmony_ci							block contains xattr */
108462306a36Sopenharmony_ci		struct ocfs2_xattr_tree_root xb_root;/* xattr tree root if this
108562306a36Sopenharmony_ci							block cotains xattr
108662306a36Sopenharmony_ci							tree. */
108762306a36Sopenharmony_ci	} xb_attrs;
108862306a36Sopenharmony_ci};
108962306a36Sopenharmony_ci
109062306a36Sopenharmony_ci#define OCFS2_XATTR_ENTRY_LOCAL		0x80
109162306a36Sopenharmony_ci#define OCFS2_XATTR_TYPE_MASK		0x7F
109262306a36Sopenharmony_cistatic inline void ocfs2_xattr_set_local(struct ocfs2_xattr_entry *xe,
109362306a36Sopenharmony_ci					 int local)
109462306a36Sopenharmony_ci{
109562306a36Sopenharmony_ci	if (local)
109662306a36Sopenharmony_ci		xe->xe_type |= OCFS2_XATTR_ENTRY_LOCAL;
109762306a36Sopenharmony_ci	else
109862306a36Sopenharmony_ci		xe->xe_type &= ~OCFS2_XATTR_ENTRY_LOCAL;
109962306a36Sopenharmony_ci}
110062306a36Sopenharmony_ci
110162306a36Sopenharmony_cistatic inline int ocfs2_xattr_is_local(struct ocfs2_xattr_entry *xe)
110262306a36Sopenharmony_ci{
110362306a36Sopenharmony_ci	return xe->xe_type & OCFS2_XATTR_ENTRY_LOCAL;
110462306a36Sopenharmony_ci}
110562306a36Sopenharmony_ci
110662306a36Sopenharmony_cistatic inline void ocfs2_xattr_set_type(struct ocfs2_xattr_entry *xe, int type)
110762306a36Sopenharmony_ci{
110862306a36Sopenharmony_ci	xe->xe_type |= type & OCFS2_XATTR_TYPE_MASK;
110962306a36Sopenharmony_ci}
111062306a36Sopenharmony_ci
111162306a36Sopenharmony_cistatic inline int ocfs2_xattr_get_type(struct ocfs2_xattr_entry *xe)
111262306a36Sopenharmony_ci{
111362306a36Sopenharmony_ci	return xe->xe_type & OCFS2_XATTR_TYPE_MASK;
111462306a36Sopenharmony_ci}
111562306a36Sopenharmony_ci
111662306a36Sopenharmony_ci/*
111762306a36Sopenharmony_ci *  On disk structures for global quota file
111862306a36Sopenharmony_ci */
111962306a36Sopenharmony_ci
112062306a36Sopenharmony_ci/* Magic numbers and known versions for global quota files */
112162306a36Sopenharmony_ci#define OCFS2_GLOBAL_QMAGICS {\
112262306a36Sopenharmony_ci	0x0cf52470, /* USRQUOTA */ \
112362306a36Sopenharmony_ci	0x0cf52471  /* GRPQUOTA */ \
112462306a36Sopenharmony_ci}
112562306a36Sopenharmony_ci
112662306a36Sopenharmony_ci#define OCFS2_GLOBAL_QVERSIONS {\
112762306a36Sopenharmony_ci	0, \
112862306a36Sopenharmony_ci	0, \
112962306a36Sopenharmony_ci}
113062306a36Sopenharmony_ci
113162306a36Sopenharmony_ci
113262306a36Sopenharmony_ci/* Each block of each quota file has a certain fixed number of bytes reserved
113362306a36Sopenharmony_ci * for OCFS2 internal use at its end. OCFS2 can use it for things like
113462306a36Sopenharmony_ci * checksums, etc. */
113562306a36Sopenharmony_ci#define OCFS2_QBLK_RESERVED_SPACE 8
113662306a36Sopenharmony_ci
113762306a36Sopenharmony_ci/* Generic header of all quota files */
113862306a36Sopenharmony_cistruct ocfs2_disk_dqheader {
113962306a36Sopenharmony_ci	__le32 dqh_magic;	/* Magic number identifying file */
114062306a36Sopenharmony_ci	__le32 dqh_version;	/* Quota format version */
114162306a36Sopenharmony_ci};
114262306a36Sopenharmony_ci
114362306a36Sopenharmony_ci#define OCFS2_GLOBAL_INFO_OFF (sizeof(struct ocfs2_disk_dqheader))
114462306a36Sopenharmony_ci
114562306a36Sopenharmony_ci/* Information header of global quota file (immediately follows the generic
114662306a36Sopenharmony_ci * header) */
114762306a36Sopenharmony_cistruct ocfs2_global_disk_dqinfo {
114862306a36Sopenharmony_ci/*00*/	__le32 dqi_bgrace;	/* Grace time for space softlimit excess */
114962306a36Sopenharmony_ci	__le32 dqi_igrace;	/* Grace time for inode softlimit excess */
115062306a36Sopenharmony_ci	__le32 dqi_syncms;	/* Time after which we sync local changes to
115162306a36Sopenharmony_ci				 * global quota file */
115262306a36Sopenharmony_ci	__le32 dqi_blocks;	/* Number of blocks in quota file */
115362306a36Sopenharmony_ci/*10*/	__le32 dqi_free_blk;	/* First free block in quota file */
115462306a36Sopenharmony_ci	__le32 dqi_free_entry;	/* First block with free dquot entry in quota
115562306a36Sopenharmony_ci				 * file */
115662306a36Sopenharmony_ci};
115762306a36Sopenharmony_ci
115862306a36Sopenharmony_ci/* Structure with global user / group information. We reserve some space
115962306a36Sopenharmony_ci * for future use. */
116062306a36Sopenharmony_cistruct ocfs2_global_disk_dqblk {
116162306a36Sopenharmony_ci/*00*/	__le32 dqb_id;          /* ID the structure belongs to */
116262306a36Sopenharmony_ci	__le32 dqb_use_count;   /* Number of nodes having reference to this structure */
116362306a36Sopenharmony_ci	__le64 dqb_ihardlimit;  /* absolute limit on allocated inodes */
116462306a36Sopenharmony_ci/*10*/	__le64 dqb_isoftlimit;  /* preferred inode limit */
116562306a36Sopenharmony_ci	__le64 dqb_curinodes;   /* current # allocated inodes */
116662306a36Sopenharmony_ci/*20*/	__le64 dqb_bhardlimit;  /* absolute limit on disk space */
116762306a36Sopenharmony_ci	__le64 dqb_bsoftlimit;  /* preferred limit on disk space */
116862306a36Sopenharmony_ci/*30*/	__le64 dqb_curspace;    /* current space occupied */
116962306a36Sopenharmony_ci	__le64 dqb_btime;       /* time limit for excessive disk use */
117062306a36Sopenharmony_ci/*40*/	__le64 dqb_itime;       /* time limit for excessive inode use */
117162306a36Sopenharmony_ci	__le64 dqb_pad1;
117262306a36Sopenharmony_ci/*50*/	__le64 dqb_pad2;
117362306a36Sopenharmony_ci};
117462306a36Sopenharmony_ci
117562306a36Sopenharmony_ci/*
117662306a36Sopenharmony_ci *  On-disk structures for local quota file
117762306a36Sopenharmony_ci */
117862306a36Sopenharmony_ci
117962306a36Sopenharmony_ci/* Magic numbers and known versions for local quota files */
118062306a36Sopenharmony_ci#define OCFS2_LOCAL_QMAGICS {\
118162306a36Sopenharmony_ci	0x0cf524c0, /* USRQUOTA */ \
118262306a36Sopenharmony_ci	0x0cf524c1  /* GRPQUOTA */ \
118362306a36Sopenharmony_ci}
118462306a36Sopenharmony_ci
118562306a36Sopenharmony_ci#define OCFS2_LOCAL_QVERSIONS {\
118662306a36Sopenharmony_ci	0, \
118762306a36Sopenharmony_ci	0, \
118862306a36Sopenharmony_ci}
118962306a36Sopenharmony_ci
119062306a36Sopenharmony_ci/* Quota flags in dqinfo header */
119162306a36Sopenharmony_ci#define OLQF_CLEAN	0x0001	/* Quota file is empty (this should be after\
119262306a36Sopenharmony_ci				 * quota has been cleanly turned off) */
119362306a36Sopenharmony_ci
119462306a36Sopenharmony_ci#define OCFS2_LOCAL_INFO_OFF (sizeof(struct ocfs2_disk_dqheader))
119562306a36Sopenharmony_ci
119662306a36Sopenharmony_ci/* Information header of local quota file (immediately follows the generic
119762306a36Sopenharmony_ci * header) */
119862306a36Sopenharmony_cistruct ocfs2_local_disk_dqinfo {
119962306a36Sopenharmony_ci	__le32 dqi_flags;	/* Flags for quota file */
120062306a36Sopenharmony_ci	__le32 dqi_chunks;	/* Number of chunks of quota structures
120162306a36Sopenharmony_ci				 * with a bitmap */
120262306a36Sopenharmony_ci	__le32 dqi_blocks;	/* Number of blocks allocated for quota file */
120362306a36Sopenharmony_ci};
120462306a36Sopenharmony_ci
120562306a36Sopenharmony_ci/* Header of one chunk of a quota file */
120662306a36Sopenharmony_cistruct ocfs2_local_disk_chunk {
120762306a36Sopenharmony_ci	__le32 dqc_free;	/* Number of free entries in the bitmap */
120862306a36Sopenharmony_ci	__u8 dqc_bitmap[];	/* Bitmap of entries in the corresponding
120962306a36Sopenharmony_ci				 * chunk of quota file */
121062306a36Sopenharmony_ci};
121162306a36Sopenharmony_ci
121262306a36Sopenharmony_ci/* One entry in local quota file */
121362306a36Sopenharmony_cistruct ocfs2_local_disk_dqblk {
121462306a36Sopenharmony_ci/*00*/	__le64 dqb_id;		/* id this quota applies to */
121562306a36Sopenharmony_ci	__le64 dqb_spacemod;	/* Change in the amount of used space */
121662306a36Sopenharmony_ci/*10*/	__le64 dqb_inodemod;	/* Change in the amount of used inodes */
121762306a36Sopenharmony_ci};
121862306a36Sopenharmony_ci
121962306a36Sopenharmony_ci
122062306a36Sopenharmony_ci/*
122162306a36Sopenharmony_ci * The quota trailer lives at the end of each quota block.
122262306a36Sopenharmony_ci */
122362306a36Sopenharmony_ci
122462306a36Sopenharmony_cistruct ocfs2_disk_dqtrailer {
122562306a36Sopenharmony_ci/*00*/	struct ocfs2_block_check dq_check;	/* Error checking */
122662306a36Sopenharmony_ci/*08*/	/* Cannot be larger than OCFS2_QBLK_RESERVED_SPACE */
122762306a36Sopenharmony_ci};
122862306a36Sopenharmony_ci
122962306a36Sopenharmony_cistatic inline struct ocfs2_disk_dqtrailer *ocfs2_block_dqtrailer(int blocksize,
123062306a36Sopenharmony_ci								 void *buf)
123162306a36Sopenharmony_ci{
123262306a36Sopenharmony_ci	char *ptr = buf;
123362306a36Sopenharmony_ci	ptr += blocksize - OCFS2_QBLK_RESERVED_SPACE;
123462306a36Sopenharmony_ci
123562306a36Sopenharmony_ci	return (struct ocfs2_disk_dqtrailer *)ptr;
123662306a36Sopenharmony_ci}
123762306a36Sopenharmony_ci
123862306a36Sopenharmony_ci#ifdef __KERNEL__
123962306a36Sopenharmony_cistatic inline int ocfs2_fast_symlink_chars(struct super_block *sb)
124062306a36Sopenharmony_ci{
124162306a36Sopenharmony_ci	return  sb->s_blocksize -
124262306a36Sopenharmony_ci		 offsetof(struct ocfs2_dinode, id2.i_symlink);
124362306a36Sopenharmony_ci}
124462306a36Sopenharmony_ci
124562306a36Sopenharmony_cistatic inline int ocfs2_max_inline_data_with_xattr(struct super_block *sb,
124662306a36Sopenharmony_ci						   struct ocfs2_dinode *di)
124762306a36Sopenharmony_ci{
124862306a36Sopenharmony_ci	unsigned int xattrsize = le16_to_cpu(di->i_xattr_inline_size);
124962306a36Sopenharmony_ci
125062306a36Sopenharmony_ci	if (le16_to_cpu(di->i_dyn_features) & OCFS2_INLINE_XATTR_FL)
125162306a36Sopenharmony_ci		return sb->s_blocksize -
125262306a36Sopenharmony_ci			offsetof(struct ocfs2_dinode, id2.i_data.id_data) -
125362306a36Sopenharmony_ci			xattrsize;
125462306a36Sopenharmony_ci	else
125562306a36Sopenharmony_ci		return sb->s_blocksize -
125662306a36Sopenharmony_ci			offsetof(struct ocfs2_dinode, id2.i_data.id_data);
125762306a36Sopenharmony_ci}
125862306a36Sopenharmony_ci
125962306a36Sopenharmony_cistatic inline int ocfs2_extent_recs_per_inode(struct super_block *sb)
126062306a36Sopenharmony_ci{
126162306a36Sopenharmony_ci	int size;
126262306a36Sopenharmony_ci
126362306a36Sopenharmony_ci	size = sb->s_blocksize -
126462306a36Sopenharmony_ci		offsetof(struct ocfs2_dinode, id2.i_list.l_recs);
126562306a36Sopenharmony_ci
126662306a36Sopenharmony_ci	return size / sizeof(struct ocfs2_extent_rec);
126762306a36Sopenharmony_ci}
126862306a36Sopenharmony_ci
126962306a36Sopenharmony_cistatic inline int ocfs2_extent_recs_per_inode_with_xattr(
127062306a36Sopenharmony_ci						struct super_block *sb,
127162306a36Sopenharmony_ci						struct ocfs2_dinode *di)
127262306a36Sopenharmony_ci{
127362306a36Sopenharmony_ci	int size;
127462306a36Sopenharmony_ci	unsigned int xattrsize = le16_to_cpu(di->i_xattr_inline_size);
127562306a36Sopenharmony_ci
127662306a36Sopenharmony_ci	if (le16_to_cpu(di->i_dyn_features) & OCFS2_INLINE_XATTR_FL)
127762306a36Sopenharmony_ci		size = sb->s_blocksize -
127862306a36Sopenharmony_ci			offsetof(struct ocfs2_dinode, id2.i_list.l_recs) -
127962306a36Sopenharmony_ci			xattrsize;
128062306a36Sopenharmony_ci	else
128162306a36Sopenharmony_ci		size = sb->s_blocksize -
128262306a36Sopenharmony_ci			offsetof(struct ocfs2_dinode, id2.i_list.l_recs);
128362306a36Sopenharmony_ci
128462306a36Sopenharmony_ci	return size / sizeof(struct ocfs2_extent_rec);
128562306a36Sopenharmony_ci}
128662306a36Sopenharmony_ci
128762306a36Sopenharmony_cistatic inline int ocfs2_extent_recs_per_dx_root(struct super_block *sb)
128862306a36Sopenharmony_ci{
128962306a36Sopenharmony_ci	int size;
129062306a36Sopenharmony_ci
129162306a36Sopenharmony_ci	size = sb->s_blocksize -
129262306a36Sopenharmony_ci		offsetof(struct ocfs2_dx_root_block, dr_list.l_recs);
129362306a36Sopenharmony_ci
129462306a36Sopenharmony_ci	return size / sizeof(struct ocfs2_extent_rec);
129562306a36Sopenharmony_ci}
129662306a36Sopenharmony_ci
129762306a36Sopenharmony_cistatic inline int ocfs2_chain_recs_per_inode(struct super_block *sb)
129862306a36Sopenharmony_ci{
129962306a36Sopenharmony_ci	int size;
130062306a36Sopenharmony_ci
130162306a36Sopenharmony_ci	size = sb->s_blocksize -
130262306a36Sopenharmony_ci		offsetof(struct ocfs2_dinode, id2.i_chain.cl_recs);
130362306a36Sopenharmony_ci
130462306a36Sopenharmony_ci	return size / sizeof(struct ocfs2_chain_rec);
130562306a36Sopenharmony_ci}
130662306a36Sopenharmony_ci
130762306a36Sopenharmony_cistatic inline u16 ocfs2_extent_recs_per_eb(struct super_block *sb)
130862306a36Sopenharmony_ci{
130962306a36Sopenharmony_ci	int size;
131062306a36Sopenharmony_ci
131162306a36Sopenharmony_ci	size = sb->s_blocksize -
131262306a36Sopenharmony_ci		offsetof(struct ocfs2_extent_block, h_list.l_recs);
131362306a36Sopenharmony_ci
131462306a36Sopenharmony_ci	return size / sizeof(struct ocfs2_extent_rec);
131562306a36Sopenharmony_ci}
131662306a36Sopenharmony_ci
131762306a36Sopenharmony_cistatic inline u16 ocfs2_extent_recs_per_gd(struct super_block *sb)
131862306a36Sopenharmony_ci{
131962306a36Sopenharmony_ci	int size;
132062306a36Sopenharmony_ci
132162306a36Sopenharmony_ci	size = sb->s_blocksize -
132262306a36Sopenharmony_ci		offsetof(struct ocfs2_group_desc, bg_list.l_recs);
132362306a36Sopenharmony_ci
132462306a36Sopenharmony_ci	return size / sizeof(struct ocfs2_extent_rec);
132562306a36Sopenharmony_ci}
132662306a36Sopenharmony_ci
132762306a36Sopenharmony_cistatic inline int ocfs2_dx_entries_per_leaf(struct super_block *sb)
132862306a36Sopenharmony_ci{
132962306a36Sopenharmony_ci	int size;
133062306a36Sopenharmony_ci
133162306a36Sopenharmony_ci	size = sb->s_blocksize -
133262306a36Sopenharmony_ci		offsetof(struct ocfs2_dx_leaf, dl_list.de_entries);
133362306a36Sopenharmony_ci
133462306a36Sopenharmony_ci	return size / sizeof(struct ocfs2_dx_entry);
133562306a36Sopenharmony_ci}
133662306a36Sopenharmony_ci
133762306a36Sopenharmony_cistatic inline int ocfs2_dx_entries_per_root(struct super_block *sb)
133862306a36Sopenharmony_ci{
133962306a36Sopenharmony_ci	int size;
134062306a36Sopenharmony_ci
134162306a36Sopenharmony_ci	size = sb->s_blocksize -
134262306a36Sopenharmony_ci		offsetof(struct ocfs2_dx_root_block, dr_entries.de_entries);
134362306a36Sopenharmony_ci
134462306a36Sopenharmony_ci	return size / sizeof(struct ocfs2_dx_entry);
134562306a36Sopenharmony_ci}
134662306a36Sopenharmony_ci
134762306a36Sopenharmony_cistatic inline u16 ocfs2_local_alloc_size(struct super_block *sb)
134862306a36Sopenharmony_ci{
134962306a36Sopenharmony_ci	u16 size;
135062306a36Sopenharmony_ci
135162306a36Sopenharmony_ci	size = sb->s_blocksize -
135262306a36Sopenharmony_ci		offsetof(struct ocfs2_dinode, id2.i_lab.la_bitmap);
135362306a36Sopenharmony_ci
135462306a36Sopenharmony_ci	return size;
135562306a36Sopenharmony_ci}
135662306a36Sopenharmony_ci
135762306a36Sopenharmony_cistatic inline int ocfs2_group_bitmap_size(struct super_block *sb,
135862306a36Sopenharmony_ci					  int suballocator,
135962306a36Sopenharmony_ci					  u32 feature_incompat)
136062306a36Sopenharmony_ci{
136162306a36Sopenharmony_ci	int size = sb->s_blocksize -
136262306a36Sopenharmony_ci		offsetof(struct ocfs2_group_desc, bg_bitmap);
136362306a36Sopenharmony_ci
136462306a36Sopenharmony_ci	/*
136562306a36Sopenharmony_ci	 * The cluster allocator uses the entire block.  Suballocators have
136662306a36Sopenharmony_ci	 * never used more than OCFS2_MAX_BG_BITMAP_SIZE.  Unfortunately, older
136762306a36Sopenharmony_ci	 * code expects bg_size set to the maximum.  Thus we must keep
136862306a36Sopenharmony_ci	 * bg_size as-is unless discontig_bg is enabled.
136962306a36Sopenharmony_ci	 */
137062306a36Sopenharmony_ci	if (suballocator &&
137162306a36Sopenharmony_ci	    (feature_incompat & OCFS2_FEATURE_INCOMPAT_DISCONTIG_BG))
137262306a36Sopenharmony_ci		size = OCFS2_MAX_BG_BITMAP_SIZE;
137362306a36Sopenharmony_ci
137462306a36Sopenharmony_ci	return size;
137562306a36Sopenharmony_ci}
137662306a36Sopenharmony_ci
137762306a36Sopenharmony_cistatic inline int ocfs2_truncate_recs_per_inode(struct super_block *sb)
137862306a36Sopenharmony_ci{
137962306a36Sopenharmony_ci	int size;
138062306a36Sopenharmony_ci
138162306a36Sopenharmony_ci	size = sb->s_blocksize -
138262306a36Sopenharmony_ci		offsetof(struct ocfs2_dinode, id2.i_dealloc.tl_recs);
138362306a36Sopenharmony_ci
138462306a36Sopenharmony_ci	return size / sizeof(struct ocfs2_truncate_rec);
138562306a36Sopenharmony_ci}
138662306a36Sopenharmony_ci
138762306a36Sopenharmony_cistatic inline u64 ocfs2_backup_super_blkno(struct super_block *sb, int index)
138862306a36Sopenharmony_ci{
138962306a36Sopenharmony_ci	u64 offset = OCFS2_BACKUP_SB_START;
139062306a36Sopenharmony_ci
139162306a36Sopenharmony_ci	if (index >= 0 && index < OCFS2_MAX_BACKUP_SUPERBLOCKS) {
139262306a36Sopenharmony_ci		offset <<= (2 * index);
139362306a36Sopenharmony_ci		offset >>= sb->s_blocksize_bits;
139462306a36Sopenharmony_ci		return offset;
139562306a36Sopenharmony_ci	}
139662306a36Sopenharmony_ci
139762306a36Sopenharmony_ci	return 0;
139862306a36Sopenharmony_ci
139962306a36Sopenharmony_ci}
140062306a36Sopenharmony_ci
140162306a36Sopenharmony_cistatic inline u16 ocfs2_xattr_recs_per_xb(struct super_block *sb)
140262306a36Sopenharmony_ci{
140362306a36Sopenharmony_ci	int size;
140462306a36Sopenharmony_ci
140562306a36Sopenharmony_ci	size = sb->s_blocksize -
140662306a36Sopenharmony_ci		offsetof(struct ocfs2_xattr_block,
140762306a36Sopenharmony_ci			 xb_attrs.xb_root.xt_list.l_recs);
140862306a36Sopenharmony_ci
140962306a36Sopenharmony_ci	return size / sizeof(struct ocfs2_extent_rec);
141062306a36Sopenharmony_ci}
141162306a36Sopenharmony_ci
141262306a36Sopenharmony_cistatic inline u16 ocfs2_extent_recs_per_rb(struct super_block *sb)
141362306a36Sopenharmony_ci{
141462306a36Sopenharmony_ci	int size;
141562306a36Sopenharmony_ci
141662306a36Sopenharmony_ci	size = sb->s_blocksize -
141762306a36Sopenharmony_ci		offsetof(struct ocfs2_refcount_block, rf_list.l_recs);
141862306a36Sopenharmony_ci
141962306a36Sopenharmony_ci	return size / sizeof(struct ocfs2_extent_rec);
142062306a36Sopenharmony_ci}
142162306a36Sopenharmony_ci
142262306a36Sopenharmony_cistatic inline u16 ocfs2_refcount_recs_per_rb(struct super_block *sb)
142362306a36Sopenharmony_ci{
142462306a36Sopenharmony_ci	int size;
142562306a36Sopenharmony_ci
142662306a36Sopenharmony_ci	size = sb->s_blocksize -
142762306a36Sopenharmony_ci		offsetof(struct ocfs2_refcount_block, rf_records.rl_recs);
142862306a36Sopenharmony_ci
142962306a36Sopenharmony_ci	return size / sizeof(struct ocfs2_refcount_rec);
143062306a36Sopenharmony_ci}
143162306a36Sopenharmony_ci
143262306a36Sopenharmony_cistatic inline u32
143362306a36Sopenharmony_ciocfs2_get_ref_rec_low_cpos(const struct ocfs2_refcount_rec *rec)
143462306a36Sopenharmony_ci{
143562306a36Sopenharmony_ci	return le64_to_cpu(rec->r_cpos) & OCFS2_32BIT_POS_MASK;
143662306a36Sopenharmony_ci}
143762306a36Sopenharmony_ci#else
143862306a36Sopenharmony_cistatic inline int ocfs2_fast_symlink_chars(int blocksize)
143962306a36Sopenharmony_ci{
144062306a36Sopenharmony_ci	return blocksize - offsetof(struct ocfs2_dinode, id2.i_symlink);
144162306a36Sopenharmony_ci}
144262306a36Sopenharmony_ci
144362306a36Sopenharmony_cistatic inline int ocfs2_max_inline_data_with_xattr(int blocksize,
144462306a36Sopenharmony_ci						   struct ocfs2_dinode *di)
144562306a36Sopenharmony_ci{
144662306a36Sopenharmony_ci	if (di && (di->i_dyn_features & OCFS2_INLINE_XATTR_FL))
144762306a36Sopenharmony_ci		return blocksize -
144862306a36Sopenharmony_ci			offsetof(struct ocfs2_dinode, id2.i_data.id_data) -
144962306a36Sopenharmony_ci			di->i_xattr_inline_size;
145062306a36Sopenharmony_ci	else
145162306a36Sopenharmony_ci		return blocksize -
145262306a36Sopenharmony_ci			offsetof(struct ocfs2_dinode, id2.i_data.id_data);
145362306a36Sopenharmony_ci}
145462306a36Sopenharmony_ci
145562306a36Sopenharmony_cistatic inline int ocfs2_extent_recs_per_inode(int blocksize)
145662306a36Sopenharmony_ci{
145762306a36Sopenharmony_ci	int size;
145862306a36Sopenharmony_ci
145962306a36Sopenharmony_ci	size = blocksize -
146062306a36Sopenharmony_ci		offsetof(struct ocfs2_dinode, id2.i_list.l_recs);
146162306a36Sopenharmony_ci
146262306a36Sopenharmony_ci	return size / sizeof(struct ocfs2_extent_rec);
146362306a36Sopenharmony_ci}
146462306a36Sopenharmony_ci
146562306a36Sopenharmony_cistatic inline int ocfs2_chain_recs_per_inode(int blocksize)
146662306a36Sopenharmony_ci{
146762306a36Sopenharmony_ci	int size;
146862306a36Sopenharmony_ci
146962306a36Sopenharmony_ci	size = blocksize -
147062306a36Sopenharmony_ci		offsetof(struct ocfs2_dinode, id2.i_chain.cl_recs);
147162306a36Sopenharmony_ci
147262306a36Sopenharmony_ci	return size / sizeof(struct ocfs2_chain_rec);
147362306a36Sopenharmony_ci}
147462306a36Sopenharmony_ci
147562306a36Sopenharmony_cistatic inline int ocfs2_extent_recs_per_eb(int blocksize)
147662306a36Sopenharmony_ci{
147762306a36Sopenharmony_ci	int size;
147862306a36Sopenharmony_ci
147962306a36Sopenharmony_ci	size = blocksize -
148062306a36Sopenharmony_ci		offsetof(struct ocfs2_extent_block, h_list.l_recs);
148162306a36Sopenharmony_ci
148262306a36Sopenharmony_ci	return size / sizeof(struct ocfs2_extent_rec);
148362306a36Sopenharmony_ci}
148462306a36Sopenharmony_ci
148562306a36Sopenharmony_cistatic inline int ocfs2_extent_recs_per_gd(int blocksize)
148662306a36Sopenharmony_ci{
148762306a36Sopenharmony_ci	int size;
148862306a36Sopenharmony_ci
148962306a36Sopenharmony_ci	size = blocksize -
149062306a36Sopenharmony_ci		offsetof(struct ocfs2_group_desc, bg_list.l_recs);
149162306a36Sopenharmony_ci
149262306a36Sopenharmony_ci	return size / sizeof(struct ocfs2_extent_rec);
149362306a36Sopenharmony_ci}
149462306a36Sopenharmony_ci
149562306a36Sopenharmony_cistatic inline int ocfs2_local_alloc_size(int blocksize)
149662306a36Sopenharmony_ci{
149762306a36Sopenharmony_ci	int size;
149862306a36Sopenharmony_ci
149962306a36Sopenharmony_ci	size = blocksize -
150062306a36Sopenharmony_ci		offsetof(struct ocfs2_dinode, id2.i_lab.la_bitmap);
150162306a36Sopenharmony_ci
150262306a36Sopenharmony_ci	return size;
150362306a36Sopenharmony_ci}
150462306a36Sopenharmony_ci
150562306a36Sopenharmony_cistatic inline int ocfs2_group_bitmap_size(int blocksize,
150662306a36Sopenharmony_ci					  int suballocator,
150762306a36Sopenharmony_ci					  uint32_t feature_incompat)
150862306a36Sopenharmony_ci{
150962306a36Sopenharmony_ci	int size = sb->s_blocksize -
151062306a36Sopenharmony_ci		offsetof(struct ocfs2_group_desc, bg_bitmap);
151162306a36Sopenharmony_ci
151262306a36Sopenharmony_ci	/*
151362306a36Sopenharmony_ci	 * The cluster allocator uses the entire block.  Suballocators have
151462306a36Sopenharmony_ci	 * never used more than OCFS2_MAX_BG_BITMAP_SIZE.  Unfortunately, older
151562306a36Sopenharmony_ci	 * code expects bg_size set to the maximum.  Thus we must keep
151662306a36Sopenharmony_ci	 * bg_size as-is unless discontig_bg is enabled.
151762306a36Sopenharmony_ci	 */
151862306a36Sopenharmony_ci	if (suballocator &&
151962306a36Sopenharmony_ci	    (feature_incompat & OCFS2_FEATURE_INCOMPAT_DISCONTIG_BG))
152062306a36Sopenharmony_ci		size = OCFS2_MAX_BG_BITMAP_SIZE;
152162306a36Sopenharmony_ci
152262306a36Sopenharmony_ci	return size;
152362306a36Sopenharmony_ci}
152462306a36Sopenharmony_ci
152562306a36Sopenharmony_cistatic inline int ocfs2_truncate_recs_per_inode(int blocksize)
152662306a36Sopenharmony_ci{
152762306a36Sopenharmony_ci	int size;
152862306a36Sopenharmony_ci
152962306a36Sopenharmony_ci	size = blocksize -
153062306a36Sopenharmony_ci		offsetof(struct ocfs2_dinode, id2.i_dealloc.tl_recs);
153162306a36Sopenharmony_ci
153262306a36Sopenharmony_ci	return size / sizeof(struct ocfs2_truncate_rec);
153362306a36Sopenharmony_ci}
153462306a36Sopenharmony_ci
153562306a36Sopenharmony_cistatic inline uint64_t ocfs2_backup_super_blkno(int blocksize, int index)
153662306a36Sopenharmony_ci{
153762306a36Sopenharmony_ci	uint64_t offset = OCFS2_BACKUP_SB_START;
153862306a36Sopenharmony_ci
153962306a36Sopenharmony_ci	if (index >= 0 && index < OCFS2_MAX_BACKUP_SUPERBLOCKS) {
154062306a36Sopenharmony_ci		offset <<= (2 * index);
154162306a36Sopenharmony_ci		offset /= blocksize;
154262306a36Sopenharmony_ci		return offset;
154362306a36Sopenharmony_ci	}
154462306a36Sopenharmony_ci
154562306a36Sopenharmony_ci	return 0;
154662306a36Sopenharmony_ci}
154762306a36Sopenharmony_ci
154862306a36Sopenharmony_cistatic inline int ocfs2_xattr_recs_per_xb(int blocksize)
154962306a36Sopenharmony_ci{
155062306a36Sopenharmony_ci	int size;
155162306a36Sopenharmony_ci
155262306a36Sopenharmony_ci	size = blocksize -
155362306a36Sopenharmony_ci		offsetof(struct ocfs2_xattr_block,
155462306a36Sopenharmony_ci			 xb_attrs.xb_root.xt_list.l_recs);
155562306a36Sopenharmony_ci
155662306a36Sopenharmony_ci	return size / sizeof(struct ocfs2_extent_rec);
155762306a36Sopenharmony_ci}
155862306a36Sopenharmony_ci#endif  /* __KERNEL__ */
155962306a36Sopenharmony_ci
156062306a36Sopenharmony_ci
156162306a36Sopenharmony_cistatic inline int ocfs2_system_inode_is_global(int type)
156262306a36Sopenharmony_ci{
156362306a36Sopenharmony_ci	return ((type >= 0) &&
156462306a36Sopenharmony_ci		(type <= OCFS2_LAST_GLOBAL_SYSTEM_INODE));
156562306a36Sopenharmony_ci}
156662306a36Sopenharmony_ci
156762306a36Sopenharmony_cistatic inline int ocfs2_sprintf_system_inode_name(char *buf, int len,
156862306a36Sopenharmony_ci						  int type, int slot)
156962306a36Sopenharmony_ci{
157062306a36Sopenharmony_ci	int chars;
157162306a36Sopenharmony_ci
157262306a36Sopenharmony_ci        /*
157362306a36Sopenharmony_ci         * Global system inodes can only have one copy.  Everything
157462306a36Sopenharmony_ci         * after OCFS2_LAST_GLOBAL_SYSTEM_INODE in the system inode
157562306a36Sopenharmony_ci         * list has a copy per slot.
157662306a36Sopenharmony_ci         */
157762306a36Sopenharmony_ci	if (type <= OCFS2_LAST_GLOBAL_SYSTEM_INODE)
157862306a36Sopenharmony_ci		chars = snprintf(buf, len, "%s",
157962306a36Sopenharmony_ci				 ocfs2_system_inodes[type].si_name);
158062306a36Sopenharmony_ci	else
158162306a36Sopenharmony_ci		chars = snprintf(buf, len,
158262306a36Sopenharmony_ci				 ocfs2_system_inodes[type].si_name,
158362306a36Sopenharmony_ci				 slot);
158462306a36Sopenharmony_ci
158562306a36Sopenharmony_ci	return chars;
158662306a36Sopenharmony_ci}
158762306a36Sopenharmony_ci
158862306a36Sopenharmony_cistatic inline void ocfs2_set_de_type(struct ocfs2_dir_entry *de,
158962306a36Sopenharmony_ci				    umode_t mode)
159062306a36Sopenharmony_ci{
159162306a36Sopenharmony_ci	de->file_type = fs_umode_to_ftype(mode);
159262306a36Sopenharmony_ci}
159362306a36Sopenharmony_ci
159462306a36Sopenharmony_cistatic inline int ocfs2_gd_is_discontig(struct ocfs2_group_desc *gd)
159562306a36Sopenharmony_ci{
159662306a36Sopenharmony_ci	if ((offsetof(struct ocfs2_group_desc, bg_bitmap) +
159762306a36Sopenharmony_ci	     le16_to_cpu(gd->bg_size)) !=
159862306a36Sopenharmony_ci	    offsetof(struct ocfs2_group_desc, bg_list))
159962306a36Sopenharmony_ci		return 0;
160062306a36Sopenharmony_ci	/*
160162306a36Sopenharmony_ci	 * Only valid to check l_next_free_rec if
160262306a36Sopenharmony_ci	 * bg_bitmap + bg_size == bg_list.
160362306a36Sopenharmony_ci	 */
160462306a36Sopenharmony_ci	if (!gd->bg_list.l_next_free_rec)
160562306a36Sopenharmony_ci		return 0;
160662306a36Sopenharmony_ci	return 1;
160762306a36Sopenharmony_ci}
160862306a36Sopenharmony_ci#endif  /* _OCFS2_FS_H */
160962306a36Sopenharmony_ci
1610