1ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/* -*- mode: c; c-basic-offset: 8; -*-
2ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh * vim: noexpandtab sw=8 ts=8 sts=0:
3ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh *
4ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh * ocfs2_fs.h
5ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh *
6ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh * On-disk structures for OCFS2.
7ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh *
8ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh * Copyright (C) 2002, 2004 Oracle.  All rights reserved.
9ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh *
10ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh * This program is free software; you can redistribute it and/or
11ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh * modify it under the terms of the GNU General Public
12ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh * License, version 2,  as published by the Free Software Foundation.
13ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh *
14ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh * This program is distributed in the hope that it will be useful,
15ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh * but WITHOUT ANY WARRANTY; without even the implied warranty of
16ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh * General Public License for more details.
18ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh *
19ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh * You should have received a copy of the GNU General Public
20ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh * License along with this program; if not, write to the
21ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
22ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh * Boston, MA 021110-1307, USA.
23ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh */
24ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
25ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#ifndef _OCFS2_FS_H
26ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#define _OCFS2_FS_H
27ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
28ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/* Version */
29ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#define OCFS2_MAJOR_REV_LEVEL		0
30ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#define OCFS2_MINOR_REV_LEVEL          	90
31ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
32ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/*
33ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh * An OCFS2 volume starts this way:
34ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh * Sector 0: Valid ocfs1_vol_disk_hdr that cleanly fails to mount OCFS.
35ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh * Sector 1: Valid ocfs1_vol_label that cleanly fails to mount OCFS.
36ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh * Block OCFS2_SUPER_BLOCK_BLKNO: OCFS2 superblock.
37ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh *
38ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh * All other structures are found from the superblock information.
39ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh *
40ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh * OCFS2_SUPER_BLOCK_BLKNO is in blocks, not sectors.  eg, for a
41ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh * blocksize of 2K, it is 4096 bytes into disk.
42ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh */
43ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#define OCFS2_SUPER_BLOCK_BLKNO		2
44ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
45ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/*
46ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh * Cluster size limits. The maximum is kept arbitrarily at 1 MB, and could
47ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh * grow if needed.
48ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh */
49ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#define OCFS2_MIN_CLUSTERSIZE		4096
50ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#define OCFS2_MAX_CLUSTERSIZE		1048576
51ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
52ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/*
53ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh * Blocks cannot be bigger than clusters, so the maximum blocksize is the
54ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh * minimum cluster size.
55ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh */
56ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#define OCFS2_MIN_BLOCKSIZE		512
57ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#define OCFS2_MAX_BLOCKSIZE		OCFS2_MIN_CLUSTERSIZE
58ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
59ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/* Filesystem magic number */
60ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#define OCFS2_SUPER_MAGIC		0x7461636f
61ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
62ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/* Object signatures */
63ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#define OCFS2_SUPER_BLOCK_SIGNATURE	"OCFSV2"
64ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#define OCFS2_INODE_SIGNATURE		"INODE01"
65ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#define OCFS2_EXTENT_BLOCK_SIGNATURE	"EXBLK01"
66ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#define OCFS2_GROUP_DESC_SIGNATURE      "GROUP01"
675a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma#define OCFS2_XATTR_BLOCK_SIGNATURE	"XATTR01"
6887d35a74b15ec703910a63e0667692fb5e267be0Mark Fasheh#define OCFS2_DIR_TRAILER_SIGNATURE	"DIRTRL1"
699b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh#define OCFS2_DX_ROOT_SIGNATURE		"DXDIR01"
709b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh#define OCFS2_DX_LEAF_SIGNATURE		"DXLEAF1"
71721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma#define OCFS2_REFCOUNT_BLOCK_SIGNATURE	"REFCNT1"
72ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
73ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/* Compatibility flags */
74ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#define OCFS2_HAS_COMPAT_FEATURE(sb,mask)			\
75ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	( OCFS2_SB(sb)->s_feature_compat & (mask) )
76ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#define OCFS2_HAS_RO_COMPAT_FEATURE(sb,mask)			\
77ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	( OCFS2_SB(sb)->s_feature_ro_compat & (mask) )
78ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#define OCFS2_HAS_INCOMPAT_FEATURE(sb,mask)			\
79ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	( OCFS2_SB(sb)->s_feature_incompat & (mask) )
80ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#define OCFS2_SET_COMPAT_FEATURE(sb,mask)			\
81ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	OCFS2_SB(sb)->s_feature_compat |= (mask)
82ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#define OCFS2_SET_RO_COMPAT_FEATURE(sb,mask)			\
83ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	OCFS2_SB(sb)->s_feature_ro_compat |= (mask)
84ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#define OCFS2_SET_INCOMPAT_FEATURE(sb,mask)			\
85ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	OCFS2_SB(sb)->s_feature_incompat |= (mask)
86ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#define OCFS2_CLEAR_COMPAT_FEATURE(sb,mask)			\
87ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	OCFS2_SB(sb)->s_feature_compat &= ~(mask)
88ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#define OCFS2_CLEAR_RO_COMPAT_FEATURE(sb,mask)			\
89ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	OCFS2_SB(sb)->s_feature_ro_compat &= ~(mask)
90ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#define OCFS2_CLEAR_INCOMPAT_FEATURE(sb,mask)			\
91ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	OCFS2_SB(sb)->s_feature_incompat &= ~(mask)
92ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
93a97721894a6dc0f9ebfe1dbaa4bb112eaf399273Joel Becker#define OCFS2_FEATURE_COMPAT_SUPP	(OCFS2_FEATURE_COMPAT_BACKUP_SB	\
94a97721894a6dc0f9ebfe1dbaa4bb112eaf399273Joel Becker					 | OCFS2_FEATURE_COMPAT_JBD2_SB)
95dcd0538ff4e854fa9d7f4630b359ca8fdb5cb5a8Mark Fasheh#define OCFS2_FEATURE_INCOMPAT_SUPP	(OCFS2_FEATURE_INCOMPAT_LOCAL_MOUNT \
9615b1e36bdb487d67ef924a37b0967453143be53aMark Fasheh					 | OCFS2_FEATURE_INCOMPAT_SPARSE_ALLOC \
97386a2ef8576e966076c293f6496b9e3d7e3d9035Joel Becker					 | OCFS2_FEATURE_INCOMPAT_INLINE_DATA \
98b61817e1166c5e19c08baf05196477cc345e1b1aJoel Becker					 | OCFS2_FEATURE_INCOMPAT_EXTENDED_SLOT_MAP \
998154da3d2114241cf3edb108b43e2172be86d483Tiger Yang					 | OCFS2_FEATURE_INCOMPAT_USERSPACE_STACK \
1009d28cfb73f3abccce001daf2d247b16bf20e2248Joel Becker					 | OCFS2_FEATURE_INCOMPAT_XATTR \
1013a8df2b9c365a9f366b76bbbce479e1cc18ddc16Mark Fasheh					 | OCFS2_FEATURE_INCOMPAT_META_ECC \
10264871b8d62570fabec3b0959d494f8e0b87f5c4bTao Ma					 | OCFS2_FEATURE_INCOMPAT_INDEXED_DIRS \
1031a934c3e57594588c373aea858e4593cdfcba4f4Tao Ma					 | OCFS2_FEATURE_INCOMPAT_REFCOUNT_TREE \
10498f486f23bc5b6a6fa90e1a0707b7e9fe0e7f3e4Sunil Mushran					 | OCFS2_FEATURE_INCOMPAT_DISCONTIG_BG	\
10598f486f23bc5b6a6fa90e1a0707b7e9fe0e7f3e4Sunil Mushran					 | OCFS2_FEATURE_INCOMPAT_CLUSTERINFO)
10619ece546a418997226bd91552fbc41abcb05cea6Jan Kara#define OCFS2_FEATURE_RO_COMPAT_SUPP	(OCFS2_FEATURE_RO_COMPAT_UNWRITTEN \
10719ece546a418997226bd91552fbc41abcb05cea6Jan Kara					 | OCFS2_FEATURE_RO_COMPAT_USRQUOTA \
10819ece546a418997226bd91552fbc41abcb05cea6Jan Kara					 | OCFS2_FEATURE_RO_COMPAT_GRPQUOTA)
109ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
110ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/*
111ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh * Heartbeat-only devices are missing journals and other files.  The
112ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh * filesystem driver can't load them, but the library can.  Never put
113ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh * this in OCFS2_FEATURE_INCOMPAT_SUPP, *ever*.
114ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh */
115ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#define OCFS2_FEATURE_INCOMPAT_HEARTBEAT_DEV	0x0002
116ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
1178903901dbf46bbdf1f70ffe7bc09cb6b97e6728aMark Fasheh/*
1188903901dbf46bbdf1f70ffe7bc09cb6b97e6728aMark Fasheh * tunefs sets this incompat flag before starting the resize and clears it
1198903901dbf46bbdf1f70ffe7bc09cb6b97e6728aMark Fasheh * at the end. This flag protects users from inadvertently mounting the fs
1208903901dbf46bbdf1f70ffe7bc09cb6b97e6728aMark Fasheh * after an aborted run without fsck-ing.
1218903901dbf46bbdf1f70ffe7bc09cb6b97e6728aMark Fasheh */
1228903901dbf46bbdf1f70ffe7bc09cb6b97e6728aMark Fasheh#define OCFS2_FEATURE_INCOMPAT_RESIZE_INPROG    0x0004
123ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
124c271c5c22b0a7ca45fda15f1f4d258bca36a5b94Sunil Mushran/* Used to denote a non-clustered volume */
125c271c5c22b0a7ca45fda15f1f4d258bca36a5b94Sunil Mushran#define OCFS2_FEATURE_INCOMPAT_LOCAL_MOUNT	0x0008
126c271c5c22b0a7ca45fda15f1f4d258bca36a5b94Sunil Mushran
1278903901dbf46bbdf1f70ffe7bc09cb6b97e6728aMark Fasheh/* Support for sparse allocation in b-trees */
1288903901dbf46bbdf1f70ffe7bc09cb6b97e6728aMark Fasheh#define OCFS2_FEATURE_INCOMPAT_SPARSE_ALLOC	0x0010
1298903901dbf46bbdf1f70ffe7bc09cb6b97e6728aMark Fasheh
130ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/*
13192e91ce2a30b2af53ebf077512801dc01e75cca5Mark Fasheh * Tunefs sets this incompat flag before starting an operation which
13292e91ce2a30b2af53ebf077512801dc01e75cca5Mark Fasheh * would require cleanup on abort. This is done to protect users from
13392e91ce2a30b2af53ebf077512801dc01e75cca5Mark Fasheh * inadvertently mounting the fs after an aborted run without
13492e91ce2a30b2af53ebf077512801dc01e75cca5Mark Fasheh * fsck-ing.
13592e91ce2a30b2af53ebf077512801dc01e75cca5Mark Fasheh *
13692e91ce2a30b2af53ebf077512801dc01e75cca5Mark Fasheh * s_tunefs_flags on the super block describes precisely which
13792e91ce2a30b2af53ebf077512801dc01e75cca5Mark Fasheh * operations were in progress.
13892e91ce2a30b2af53ebf077512801dc01e75cca5Mark Fasheh */
13992e91ce2a30b2af53ebf077512801dc01e75cca5Mark Fasheh#define OCFS2_FEATURE_INCOMPAT_TUNEFS_INPROG	0x0020
14092e91ce2a30b2af53ebf077512801dc01e75cca5Mark Fasheh
14115b1e36bdb487d67ef924a37b0967453143be53aMark Fasheh/* Support for data packed into inode blocks */
14215b1e36bdb487d67ef924a37b0967453143be53aMark Fasheh#define OCFS2_FEATURE_INCOMPAT_INLINE_DATA	0x0040
14315b1e36bdb487d67ef924a37b0967453143be53aMark Fasheh
14492e91ce2a30b2af53ebf077512801dc01e75cca5Mark Fasheh/*
145b61817e1166c5e19c08baf05196477cc345e1b1aJoel Becker * Support for alternate, userspace cluster stacks.  If set, the superblock
146b61817e1166c5e19c08baf05196477cc345e1b1aJoel Becker * field s_cluster_info contains a tag for the alternate stack in use as
147b61817e1166c5e19c08baf05196477cc345e1b1aJoel Becker * well as the name of the cluster being joined.
148b61817e1166c5e19c08baf05196477cc345e1b1aJoel Becker * mount.ocfs2 must pass in a matching stack name.
149b61817e1166c5e19c08baf05196477cc345e1b1aJoel Becker *
150b61817e1166c5e19c08baf05196477cc345e1b1aJoel Becker * If not set, the classic stack will be used.  This is compatbile with
151b61817e1166c5e19c08baf05196477cc345e1b1aJoel Becker * all older versions.
152b61817e1166c5e19c08baf05196477cc345e1b1aJoel Becker */
153b61817e1166c5e19c08baf05196477cc345e1b1aJoel Becker#define OCFS2_FEATURE_INCOMPAT_USERSPACE_STACK	0x0080
154b61817e1166c5e19c08baf05196477cc345e1b1aJoel Becker
1558154da3d2114241cf3edb108b43e2172be86d483Tiger Yang/* Support for the extended slot map */
1568154da3d2114241cf3edb108b43e2172be86d483Tiger Yang#define OCFS2_FEATURE_INCOMPAT_EXTENDED_SLOT_MAP 0x100
1578154da3d2114241cf3edb108b43e2172be86d483Tiger Yang
1588154da3d2114241cf3edb108b43e2172be86d483Tiger Yang/* Support for extended attributes */
1598154da3d2114241cf3edb108b43e2172be86d483Tiger Yang#define OCFS2_FEATURE_INCOMPAT_XATTR		0x0200
1608154da3d2114241cf3edb108b43e2172be86d483Tiger Yang
1619b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh/* Support for indexed directores */
1629b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh#define OCFS2_FEATURE_INCOMPAT_INDEXED_DIRS	0x0400
1639b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh
164ab552d54673f262d7f70014003d3928d29270f22Joel Becker/* Metadata checksum and error correction */
165ab552d54673f262d7f70014003d3928d29270f22Joel Becker#define OCFS2_FEATURE_INCOMPAT_META_ECC		0x0800
166ab552d54673f262d7f70014003d3928d29270f22Joel Becker
167721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma/* Refcount tree support */
168721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma#define OCFS2_FEATURE_INCOMPAT_REFCOUNT_TREE	0x1000
169721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma
1704cbe4249d6586d5d88ef271e07302407a14c8443Joel Becker/* Discontigous block groups */
1714cbe4249d6586d5d88ef271e07302407a14c8443Joel Becker#define OCFS2_FEATURE_INCOMPAT_DISCONTIG_BG	0x2000
1724cbe4249d6586d5d88ef271e07302407a14c8443Joel Becker
173b61817e1166c5e19c08baf05196477cc345e1b1aJoel Becker/*
17498f486f23bc5b6a6fa90e1a0707b7e9fe0e7f3e4Sunil Mushran * Incompat bit to indicate useable clusterinfo with stackflags for all
17598f486f23bc5b6a6fa90e1a0707b7e9fe0e7f3e4Sunil Mushran * cluster stacks (userspace adnd o2cb). If this bit is set,
17698f486f23bc5b6a6fa90e1a0707b7e9fe0e7f3e4Sunil Mushran * INCOMPAT_USERSPACE_STACK becomes superfluous and thus should not be set.
17798f486f23bc5b6a6fa90e1a0707b7e9fe0e7f3e4Sunil Mushran */
17898f486f23bc5b6a6fa90e1a0707b7e9fe0e7f3e4Sunil Mushran#define OCFS2_FEATURE_INCOMPAT_CLUSTERINFO	0x4000
17998f486f23bc5b6a6fa90e1a0707b7e9fe0e7f3e4Sunil Mushran
18098f486f23bc5b6a6fa90e1a0707b7e9fe0e7f3e4Sunil Mushran/*
18150af94b14c98f5769860a282a397c6f3b135c8a8Mark Fasheh * backup superblock flag is used to indicate that this volume
18250af94b14c98f5769860a282a397c6f3b135c8a8Mark Fasheh * has backup superblocks.
18350af94b14c98f5769860a282a397c6f3b135c8a8Mark Fasheh */
18450af94b14c98f5769860a282a397c6f3b135c8a8Mark Fasheh#define OCFS2_FEATURE_COMPAT_BACKUP_SB		0x0001
18550af94b14c98f5769860a282a397c6f3b135c8a8Mark Fasheh
186328d5752e1259dfb29b7e65f6c2d145fddbaa750Mark Fasheh/*
187a97721894a6dc0f9ebfe1dbaa4bb112eaf399273Joel Becker * The filesystem will correctly handle journal feature bits.
188a97721894a6dc0f9ebfe1dbaa4bb112eaf399273Joel Becker */
189a97721894a6dc0f9ebfe1dbaa4bb112eaf399273Joel Becker#define OCFS2_FEATURE_COMPAT_JBD2_SB		0x0002
190a97721894a6dc0f9ebfe1dbaa4bb112eaf399273Joel Becker
191a97721894a6dc0f9ebfe1dbaa4bb112eaf399273Joel Becker/*
192328d5752e1259dfb29b7e65f6c2d145fddbaa750Mark Fasheh * Unwritten extents support.
193328d5752e1259dfb29b7e65f6c2d145fddbaa750Mark Fasheh */
194328d5752e1259dfb29b7e65f6c2d145fddbaa750Mark Fasheh#define OCFS2_FEATURE_RO_COMPAT_UNWRITTEN	0x0001
195328d5752e1259dfb29b7e65f6c2d145fddbaa750Mark Fasheh
1961a224ad11eeb190da4a123e156601aad1bb67f24Jan Kara/*
1971a224ad11eeb190da4a123e156601aad1bb67f24Jan Kara * Maintain quota information for this filesystem
1981a224ad11eeb190da4a123e156601aad1bb67f24Jan Kara */
1991a224ad11eeb190da4a123e156601aad1bb67f24Jan Kara#define OCFS2_FEATURE_RO_COMPAT_USRQUOTA	0x0002
2001a224ad11eeb190da4a123e156601aad1bb67f24Jan Kara#define OCFS2_FEATURE_RO_COMPAT_GRPQUOTA	0x0004
2011a224ad11eeb190da4a123e156601aad1bb67f24Jan Kara
20250af94b14c98f5769860a282a397c6f3b135c8a8Mark Fasheh/* The byte offset of the first backup block will be 1G.
20350af94b14c98f5769860a282a397c6f3b135c8a8Mark Fasheh * The following will be 4G, 16G, 64G, 256G and 1T.
20450af94b14c98f5769860a282a397c6f3b135c8a8Mark Fasheh */
20550af94b14c98f5769860a282a397c6f3b135c8a8Mark Fasheh#define OCFS2_BACKUP_SB_START			1 << 30
20650af94b14c98f5769860a282a397c6f3b135c8a8Mark Fasheh
20750af94b14c98f5769860a282a397c6f3b135c8a8Mark Fasheh/* the max backup superblock nums */
20850af94b14c98f5769860a282a397c6f3b135c8a8Mark Fasheh#define OCFS2_MAX_BACKUP_SUPERBLOCKS	6
20950af94b14c98f5769860a282a397c6f3b135c8a8Mark Fasheh
21050af94b14c98f5769860a282a397c6f3b135c8a8Mark Fasheh/*
21192e91ce2a30b2af53ebf077512801dc01e75cca5Mark Fasheh * Flags on ocfs2_super_block.s_tunefs_flags
21292e91ce2a30b2af53ebf077512801dc01e75cca5Mark Fasheh */
21392e91ce2a30b2af53ebf077512801dc01e75cca5Mark Fasheh#define OCFS2_TUNEFS_INPROG_REMOVE_SLOT		0x0001	/* Removing slots */
21492e91ce2a30b2af53ebf077512801dc01e75cca5Mark Fasheh
21592e91ce2a30b2af53ebf077512801dc01e75cca5Mark Fasheh/*
216ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh * Flags on ocfs2_dinode.i_flags
217ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh */
218ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#define OCFS2_VALID_FL		(0x00000001)	/* Inode is valid */
219ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#define OCFS2_UNUSED2_FL	(0x00000002)
220ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#define OCFS2_ORPHANED_FL	(0x00000004)	/* On the orphan list */
221ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#define OCFS2_UNUSED3_FL	(0x00000008)
222ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/* System inode flags */
223ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#define OCFS2_SYSTEM_FL		(0x00000010)	/* System inode */
224ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#define OCFS2_SUPER_BLOCK_FL	(0x00000020)	/* Super block */
225ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#define OCFS2_LOCAL_ALLOC_FL	(0x00000040)	/* Slot local alloc bitmap */
226ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#define OCFS2_BITMAP_FL		(0x00000080)	/* Allocation bitmap */
227ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#define OCFS2_JOURNAL_FL	(0x00000100)	/* Slot local journal */
228ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#define OCFS2_HEARTBEAT_FL	(0x00000200)	/* Heartbeat area */
229ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#define OCFS2_CHAIN_FL		(0x00000400)	/* Chain allocator */
230ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#define OCFS2_DEALLOC_FL	(0x00000800)	/* Truncate log */
2311a224ad11eeb190da4a123e156601aad1bb67f24Jan Kara#define OCFS2_QUOTA_FL		(0x00001000)	/* Quota file */
232ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
23315b1e36bdb487d67ef924a37b0967453143be53aMark Fasheh/*
23415b1e36bdb487d67ef924a37b0967453143be53aMark Fasheh * Flags on ocfs2_dinode.i_dyn_features
23515b1e36bdb487d67ef924a37b0967453143be53aMark Fasheh *
23615b1e36bdb487d67ef924a37b0967453143be53aMark Fasheh * These can change much more often than i_flags. When adding flags,
23715b1e36bdb487d67ef924a37b0967453143be53aMark Fasheh * keep in mind that i_dyn_features is only 16 bits wide.
23815b1e36bdb487d67ef924a37b0967453143be53aMark Fasheh */
23915b1e36bdb487d67ef924a37b0967453143be53aMark Fasheh#define OCFS2_INLINE_DATA_FL	(0x0001)	/* Data stored in inode block */
24015b1e36bdb487d67ef924a37b0967453143be53aMark Fasheh#define OCFS2_HAS_XATTR_FL	(0x0002)
24115b1e36bdb487d67ef924a37b0967453143be53aMark Fasheh#define OCFS2_INLINE_XATTR_FL	(0x0004)
24215b1e36bdb487d67ef924a37b0967453143be53aMark Fasheh#define OCFS2_INDEXED_DIR_FL	(0x0008)
243721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma#define OCFS2_HAS_REFCOUNT_FL   (0x0010)
24415b1e36bdb487d67ef924a37b0967453143be53aMark Fasheh
245ca4d147e62df370c334898464023aa7f9126abe1Herbert Poetzl/* Inode attributes, keep in sync with EXT2 */
2460000b862027d624ac564609b87c1aa4d14dd1e46Tao Ma#define OCFS2_SECRM_FL			FS_SECRM_FL	/* Secure deletion */
2470000b862027d624ac564609b87c1aa4d14dd1e46Tao Ma#define OCFS2_UNRM_FL			FS_UNRM_FL	/* Undelete */
2480000b862027d624ac564609b87c1aa4d14dd1e46Tao Ma#define OCFS2_COMPR_FL			FS_COMPR_FL	/* Compress file */
2490000b862027d624ac564609b87c1aa4d14dd1e46Tao Ma#define OCFS2_SYNC_FL			FS_SYNC_FL	/* Synchronous updates */
2500000b862027d624ac564609b87c1aa4d14dd1e46Tao Ma#define OCFS2_IMMUTABLE_FL		FS_IMMUTABLE_FL	/* Immutable file */
2510000b862027d624ac564609b87c1aa4d14dd1e46Tao Ma#define OCFS2_APPEND_FL			FS_APPEND_FL	/* writes to file may only append */
2520000b862027d624ac564609b87c1aa4d14dd1e46Tao Ma#define OCFS2_NODUMP_FL			FS_NODUMP_FL	/* do not dump file */
2530000b862027d624ac564609b87c1aa4d14dd1e46Tao Ma#define OCFS2_NOATIME_FL		FS_NOATIME_FL	/* do not update atime */
2540000b862027d624ac564609b87c1aa4d14dd1e46Tao Ma/* Reserved for compression usage... */
2550000b862027d624ac564609b87c1aa4d14dd1e46Tao Ma#define OCFS2_DIRTY_FL			FS_DIRTY_FL
2560000b862027d624ac564609b87c1aa4d14dd1e46Tao Ma#define OCFS2_COMPRBLK_FL		FS_COMPRBLK_FL	/* One or more compressed clusters */
2570000b862027d624ac564609b87c1aa4d14dd1e46Tao Ma#define OCFS2_NOCOMP_FL			FS_NOCOMP_FL	/* Don't compress */
2580000b862027d624ac564609b87c1aa4d14dd1e46Tao Ma#define OCFS2_ECOMPR_FL			FS_ECOMPR_FL	/* Compression error */
2590000b862027d624ac564609b87c1aa4d14dd1e46Tao Ma/* End compression flags --- maybe not all used */
2600000b862027d624ac564609b87c1aa4d14dd1e46Tao Ma#define OCFS2_BTREE_FL			FS_BTREE_FL	/* btree format dir */
2610000b862027d624ac564609b87c1aa4d14dd1e46Tao Ma#define OCFS2_INDEX_FL			FS_INDEX_FL	/* hash-indexed directory */
2620000b862027d624ac564609b87c1aa4d14dd1e46Tao Ma#define OCFS2_IMAGIC_FL			FS_IMAGIC_FL	/* AFS directory */
2630000b862027d624ac564609b87c1aa4d14dd1e46Tao Ma#define OCFS2_JOURNAL_DATA_FL		FS_JOURNAL_DATA_FL /* Reserved for ext3 */
2640000b862027d624ac564609b87c1aa4d14dd1e46Tao Ma#define OCFS2_NOTAIL_FL			FS_NOTAIL_FL	/* file tail should not be merged */
2650000b862027d624ac564609b87c1aa4d14dd1e46Tao Ma#define OCFS2_DIRSYNC_FL		FS_DIRSYNC_FL	/* dirsync behaviour (directories only) */
2660000b862027d624ac564609b87c1aa4d14dd1e46Tao Ma#define OCFS2_TOPDIR_FL			FS_TOPDIR_FL	/* Top of directory hierarchies*/
2670000b862027d624ac564609b87c1aa4d14dd1e46Tao Ma#define OCFS2_RESERVED_FL		FS_RESERVED_FL	/* reserved for ext2 lib */
2680000b862027d624ac564609b87c1aa4d14dd1e46Tao Ma
2690000b862027d624ac564609b87c1aa4d14dd1e46Tao Ma#define OCFS2_FL_VISIBLE		FS_FL_USER_VISIBLE	/* User visible flags */
2700000b862027d624ac564609b87c1aa4d14dd1e46Tao Ma#define OCFS2_FL_MODIFIABLE		FS_FL_USER_MODIFIABLE	/* User modifiable flags */
271ca4d147e62df370c334898464023aa7f9126abe1Herbert Poetzl
272ca4d147e62df370c334898464023aa7f9126abe1Herbert Poetzl/*
273e48edee2d8eab812f31f0ff62c6ba635ca2e1e21Mark Fasheh * Extent record flags (e_node.leaf.flags)
274e48edee2d8eab812f31f0ff62c6ba635ca2e1e21Mark Fasheh */
275721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma#define OCFS2_EXT_UNWRITTEN		(0x01)	/* Extent is allocated but
276721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma						 * unwritten */
277721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma#define OCFS2_EXT_REFCOUNTED		(0x02)  /* Extent is reference
278721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma						 * counted in an associated
279721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma						 * refcount tree */
280e48edee2d8eab812f31f0ff62c6ba635ca2e1e21Mark Fasheh
281e48edee2d8eab812f31f0ff62c6ba635ca2e1e21Mark Fasheh/*
282ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh * Journal Flags (ocfs2_dinode.id1.journal1.i_flags)
283ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh */
284ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#define OCFS2_JOURNAL_DIRTY_FL	(0x00000001)	/* Journal needs recovery */
285ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
286ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/*
287ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh * superblock s_state flags
288ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh */
289ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#define OCFS2_ERROR_FS		(0x00000001)	/* FS saw errors */
290ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
291ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/* Limit of space in ocfs2_dir_entry */
292ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#define OCFS2_MAX_FILENAME_LEN		255
293ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
294ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/* Maximum slots on an ocfs2 file system */
295ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#define OCFS2_MAX_SLOTS			255
296ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
297ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/* Slot map indicator for an empty slot */
298ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#define OCFS2_INVALID_SLOT		-1
299ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
300ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#define OCFS2_VOL_UUID_LEN		16
301ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#define OCFS2_MAX_VOL_LABEL_LEN		64
302ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
30398f486f23bc5b6a6fa90e1a0707b7e9fe0e7f3e4Sunil Mushran/* The cluster stack fields */
304b61817e1166c5e19c08baf05196477cc345e1b1aJoel Becker#define OCFS2_STACK_LABEL_LEN		4
305b61817e1166c5e19c08baf05196477cc345e1b1aJoel Becker#define OCFS2_CLUSTER_NAME_LEN		16
306b61817e1166c5e19c08baf05196477cc345e1b1aJoel Becker
30798f486f23bc5b6a6fa90e1a0707b7e9fe0e7f3e4Sunil Mushran/* Classic (historically speaking) cluster stack */
30898f486f23bc5b6a6fa90e1a0707b7e9fe0e7f3e4Sunil Mushran#define OCFS2_CLASSIC_CLUSTER_STACK	"o2cb"
30998f486f23bc5b6a6fa90e1a0707b7e9fe0e7f3e4Sunil Mushran
310ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/* Journal limits (in bytes) */
311ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#define OCFS2_MIN_JOURNAL_SIZE		(4 * 1024 * 1024)
312ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
3132fbe8d1ebe004425b4f7b8bba345623d2280be82Sunil Mushran/*
314fdd77704a8b4666a32120fcd1e4a9fedaf3263d8Tiger Yang * Inline extended attribute size (in bytes)
315fdd77704a8b4666a32120fcd1e4a9fedaf3263d8Tiger Yang * The value chosen should be aligned to 16 byte boundaries.
316fdd77704a8b4666a32120fcd1e4a9fedaf3263d8Tiger Yang */
317fdd77704a8b4666a32120fcd1e4a9fedaf3263d8Tiger Yang#define OCFS2_MIN_XATTR_INLINE_SIZE     256
318fdd77704a8b4666a32120fcd1e4a9fedaf3263d8Tiger Yang
31998f486f23bc5b6a6fa90e1a0707b7e9fe0e7f3e4Sunil Mushran/*
32098f486f23bc5b6a6fa90e1a0707b7e9fe0e7f3e4Sunil Mushran * Cluster info flags (ocfs2_cluster_info.ci_stackflags)
32198f486f23bc5b6a6fa90e1a0707b7e9fe0e7f3e4Sunil Mushran */
32298f486f23bc5b6a6fa90e1a0707b7e9fe0e7f3e4Sunil Mushran#define OCFS2_CLUSTER_O2CB_GLOBAL_HEARTBEAT	(0x01)
32398f486f23bc5b6a6fa90e1a0707b7e9fe0e7f3e4Sunil Mushran
324ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fashehstruct ocfs2_system_inode_info {
325ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	char	*si_name;
326ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	int	si_iflags;
327ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	int	si_mode;
328ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh};
329ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
330ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/* System file index */
331ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fashehenum {
332ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	BAD_BLOCK_SYSTEM_INODE = 0,
333ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	GLOBAL_INODE_ALLOC_SYSTEM_INODE,
334ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	SLOT_MAP_SYSTEM_INODE,
335ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#define OCFS2_FIRST_ONLINE_SYSTEM_INODE SLOT_MAP_SYSTEM_INODE
336ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	HEARTBEAT_SYSTEM_INODE,
337ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	GLOBAL_BITMAP_SYSTEM_INODE,
3381a224ad11eeb190da4a123e156601aad1bb67f24Jan Kara	USER_QUOTA_SYSTEM_INODE,
3391a224ad11eeb190da4a123e156601aad1bb67f24Jan Kara	GROUP_QUOTA_SYSTEM_INODE,
3401a224ad11eeb190da4a123e156601aad1bb67f24Jan Kara#define OCFS2_LAST_GLOBAL_SYSTEM_INODE GROUP_QUOTA_SYSTEM_INODE
341b4d693fcc5fe99ed211addb5c6a0f8398f0b266eTao Ma#define OCFS2_FIRST_LOCAL_SYSTEM_INODE ORPHAN_DIR_SYSTEM_INODE
342ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	ORPHAN_DIR_SYSTEM_INODE,
343ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	EXTENT_ALLOC_SYSTEM_INODE,
344ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	INODE_ALLOC_SYSTEM_INODE,
345ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	JOURNAL_SYSTEM_INODE,
346ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	LOCAL_ALLOC_SYSTEM_INODE,
347ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	TRUNCATE_LOG_SYSTEM_INODE,
3481a224ad11eeb190da4a123e156601aad1bb67f24Jan Kara	LOCAL_USER_QUOTA_SYSTEM_INODE,
3491a224ad11eeb190da4a123e156601aad1bb67f24Jan Kara	LOCAL_GROUP_QUOTA_SYSTEM_INODE,
350b4d693fcc5fe99ed211addb5c6a0f8398f0b266eTao Ma#define OCFS2_LAST_LOCAL_SYSTEM_INODE LOCAL_GROUP_QUOTA_SYSTEM_INODE
351ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	NUM_SYSTEM_INODES
352ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh};
3537d8f98769e7f4bc29c38789daeb416c6a7d7c241Tao Ma#define NUM_GLOBAL_SYSTEM_INODES OCFS2_FIRST_LOCAL_SYSTEM_INODE
354b4d693fcc5fe99ed211addb5c6a0f8398f0b266eTao Ma#define NUM_LOCAL_SYSTEM_INODES	\
355b4d693fcc5fe99ed211addb5c6a0f8398f0b266eTao Ma		(NUM_SYSTEM_INODES - OCFS2_FIRST_LOCAL_SYSTEM_INODE)
356ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
357ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fashehstatic struct ocfs2_system_inode_info ocfs2_system_inodes[NUM_SYSTEM_INODES] = {
358ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	/* Global system inodes (single copy) */
359ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	/* The first two are only used from userspace mfks/tunefs */
360ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	[BAD_BLOCK_SYSTEM_INODE]		= { "bad_blocks", 0, S_IFREG | 0644 },
361ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	[GLOBAL_INODE_ALLOC_SYSTEM_INODE] 	= { "global_inode_alloc", OCFS2_BITMAP_FL | OCFS2_CHAIN_FL, S_IFREG | 0644 },
362ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
363ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	/* These are used by the running filesystem */
364ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	[SLOT_MAP_SYSTEM_INODE]			= { "slot_map", 0, S_IFREG | 0644 },
365ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	[HEARTBEAT_SYSTEM_INODE]		= { "heartbeat", OCFS2_HEARTBEAT_FL, S_IFREG | 0644 },
366ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	[GLOBAL_BITMAP_SYSTEM_INODE]		= { "global_bitmap", 0, S_IFREG | 0644 },
3671a224ad11eeb190da4a123e156601aad1bb67f24Jan Kara	[USER_QUOTA_SYSTEM_INODE]		= { "aquota.user", OCFS2_QUOTA_FL, S_IFREG | 0644 },
3681a224ad11eeb190da4a123e156601aad1bb67f24Jan Kara	[GROUP_QUOTA_SYSTEM_INODE]		= { "aquota.group", OCFS2_QUOTA_FL, S_IFREG | 0644 },
369ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
370ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	/* Slot-specific system inodes (one copy per slot) */
371ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	[ORPHAN_DIR_SYSTEM_INODE]		= { "orphan_dir:%04d", 0, S_IFDIR | 0755 },
372ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	[EXTENT_ALLOC_SYSTEM_INODE]		= { "extent_alloc:%04d", OCFS2_BITMAP_FL | OCFS2_CHAIN_FL, S_IFREG | 0644 },
373ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	[INODE_ALLOC_SYSTEM_INODE]		= { "inode_alloc:%04d", OCFS2_BITMAP_FL | OCFS2_CHAIN_FL, S_IFREG | 0644 },
374ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	[JOURNAL_SYSTEM_INODE]			= { "journal:%04d", OCFS2_JOURNAL_FL, S_IFREG | 0644 },
375ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	[LOCAL_ALLOC_SYSTEM_INODE]		= { "local_alloc:%04d", OCFS2_BITMAP_FL | OCFS2_LOCAL_ALLOC_FL, S_IFREG | 0644 },
3761a224ad11eeb190da4a123e156601aad1bb67f24Jan Kara	[TRUNCATE_LOG_SYSTEM_INODE]		= { "truncate_log:%04d", OCFS2_DEALLOC_FL, S_IFREG | 0644 },
3771a224ad11eeb190da4a123e156601aad1bb67f24Jan Kara	[LOCAL_USER_QUOTA_SYSTEM_INODE]		= { "aquota.user:%04d", OCFS2_QUOTA_FL, S_IFREG | 0644 },
3781a224ad11eeb190da4a123e156601aad1bb67f24Jan Kara	[LOCAL_GROUP_QUOTA_SYSTEM_INODE]	= { "aquota.group:%04d", OCFS2_QUOTA_FL, S_IFREG | 0644 },
379ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh};
380ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
381ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/* Parameter passed from mount.ocfs2 to module */
382ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#define OCFS2_HB_NONE			"heartbeat=none"
383ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#define OCFS2_HB_LOCAL			"heartbeat=local"
3842c442719e90a44a6982c033d69df4aae4b167cfaSunil Mushran#define OCFS2_HB_GLOBAL			"heartbeat=global"
385ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
386ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/*
387ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh * OCFS2 directory file types.  Only the low 3 bits are used.  The
388ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh * other bits are reserved for now.
389ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh */
390ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#define OCFS2_FT_UNKNOWN	0
391ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#define OCFS2_FT_REG_FILE	1
392ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#define OCFS2_FT_DIR		2
393ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#define OCFS2_FT_CHRDEV		3
394ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#define OCFS2_FT_BLKDEV		4
395ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#define OCFS2_FT_FIFO		5
396ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#define OCFS2_FT_SOCK		6
397ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#define OCFS2_FT_SYMLINK	7
398ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
399ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#define OCFS2_FT_MAX		8
400ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
401ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/*
402ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh * OCFS2_DIR_PAD defines the directory entries boundaries
403ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh *
404ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh * NOTE: It must be a multiple of 4
405ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh */
406ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#define OCFS2_DIR_PAD			4
407ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#define OCFS2_DIR_ROUND			(OCFS2_DIR_PAD - 1)
408ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#define OCFS2_DIR_MEMBER_LEN 		offsetof(struct ocfs2_dir_entry, name)
409ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#define OCFS2_DIR_REC_LEN(name_len)	(((name_len) + OCFS2_DIR_MEMBER_LEN + \
410ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh                                          OCFS2_DIR_ROUND) & \
411ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh					 ~OCFS2_DIR_ROUND)
412e7c17e43090afe558c40bfb66637744c27bd2aebMark Fasheh#define OCFS2_DIR_MIN_REC_LEN	OCFS2_DIR_REC_LEN(1)
413ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
414ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#define OCFS2_LINK_MAX		32000
415198a1ca3b735986542c538e38b9499ffcaed7005Mark Fasheh#define	OCFS2_DX_LINK_MAX	((1U << 31) - 1U)
416198a1ca3b735986542c538e38b9499ffcaed7005Mark Fasheh#define	OCFS2_LINKS_HI_SHIFT	16
417e3a93c2db6410822aa24295c3874b44ba21730a8Mark Fasheh#define	OCFS2_DX_ENTRIES_MAX	(0xffffffffU)
418ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
419ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#define S_SHIFT			12
420ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fashehstatic unsigned char ocfs2_type_by_mode[S_IFMT >> S_SHIFT] = {
421ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	[S_IFREG >> S_SHIFT]  = OCFS2_FT_REG_FILE,
422ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	[S_IFDIR >> S_SHIFT]  = OCFS2_FT_DIR,
423ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	[S_IFCHR >> S_SHIFT]  = OCFS2_FT_CHRDEV,
424ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	[S_IFBLK >> S_SHIFT]  = OCFS2_FT_BLKDEV,
425ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	[S_IFIFO >> S_SHIFT]  = OCFS2_FT_FIFO,
426ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	[S_IFSOCK >> S_SHIFT] = OCFS2_FT_SOCK,
427ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	[S_IFLNK >> S_SHIFT]  = OCFS2_FT_SYMLINK,
428ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh};
429ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
430ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
431ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/*
432ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh * Convenience casts
433ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh */
434ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#define OCFS2_RAW_SB(dinode)		(&((dinode)->id2.i_super))
435ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
436ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/*
437ab552d54673f262d7f70014003d3928d29270f22Joel Becker * Block checking structure.  This is used in metadata to validate the
438ab552d54673f262d7f70014003d3928d29270f22Joel Becker * contents.  If OCFS2_FEATURE_INCOMPAT_META_ECC is not set, it is all
439ab552d54673f262d7f70014003d3928d29270f22Joel Becker * zeros.
440ab552d54673f262d7f70014003d3928d29270f22Joel Becker */
441ab552d54673f262d7f70014003d3928d29270f22Joel Beckerstruct ocfs2_block_check {
442ab552d54673f262d7f70014003d3928d29270f22Joel Becker/*00*/	__le32 bc_crc32e;	/* 802.3 Ethernet II CRC32 */
443ab552d54673f262d7f70014003d3928d29270f22Joel Becker	__le16 bc_ecc;		/* Single-error-correction parity vector.
44425985edcedea6396277003854657b5f3cb31a628Lucas De Marchi				   This is a simple Hamming code dependent
445ab552d54673f262d7f70014003d3928d29270f22Joel Becker				   on the blocksize.  OCFS2's maximum
446ab552d54673f262d7f70014003d3928d29270f22Joel Becker				   blocksize, 4K, requires 16 parity bits,
447ab552d54673f262d7f70014003d3928d29270f22Joel Becker				   so we fit in __le16. */
448ab552d54673f262d7f70014003d3928d29270f22Joel Becker	__le16 bc_reserved1;
449ab552d54673f262d7f70014003d3928d29270f22Joel Becker/*08*/
450ab552d54673f262d7f70014003d3928d29270f22Joel Becker};
451ab552d54673f262d7f70014003d3928d29270f22Joel Becker
452ab552d54673f262d7f70014003d3928d29270f22Joel Becker/*
453ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh * On disk extent record for OCFS2
454ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh * It describes a range of clusters on disk.
455e48edee2d8eab812f31f0ff62c6ba635ca2e1e21Mark Fasheh *
456e48edee2d8eab812f31f0ff62c6ba635ca2e1e21Mark Fasheh * Length fields are divided into interior and leaf node versions.
457e48edee2d8eab812f31f0ff62c6ba635ca2e1e21Mark Fasheh * This leaves room for a flags field (OCFS2_EXT_*) in the leaf nodes.
458ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh */
459ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fashehstruct ocfs2_extent_rec {
460ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/*00*/	__le32 e_cpos;		/* Offset into the file, in clusters */
461e48edee2d8eab812f31f0ff62c6ba635ca2e1e21Mark Fasheh	union {
462e48edee2d8eab812f31f0ff62c6ba635ca2e1e21Mark Fasheh		__le32 e_int_clusters; /* Clusters covered by all children */
463e48edee2d8eab812f31f0ff62c6ba635ca2e1e21Mark Fasheh		struct {
464e48edee2d8eab812f31f0ff62c6ba635ca2e1e21Mark Fasheh			__le16 e_leaf_clusters; /* Clusters covered by this
465e48edee2d8eab812f31f0ff62c6ba635ca2e1e21Mark Fasheh						   extent */
466e48edee2d8eab812f31f0ff62c6ba635ca2e1e21Mark Fasheh			__u8 e_reserved1;
467e48edee2d8eab812f31f0ff62c6ba635ca2e1e21Mark Fasheh			__u8 e_flags; /* Extent flags */
468e48edee2d8eab812f31f0ff62c6ba635ca2e1e21Mark Fasheh		};
469e48edee2d8eab812f31f0ff62c6ba635ca2e1e21Mark Fasheh	};
470ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	__le64 e_blkno;		/* Physical disk offset, in blocks */
471ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/*10*/
472ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh};
473ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
474ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fashehstruct ocfs2_chain_rec {
475ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	__le32 c_free;	/* Number of free bits in this chain. */
476ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	__le32 c_total;	/* Number of total bits in this chain */
477ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	__le64 c_blkno;	/* Physical disk offset (blocks) of 1st group */
478ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh};
479ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
480ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fashehstruct ocfs2_truncate_rec {
481ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	__le32 t_start;		/* 1st cluster in this log */
482ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	__le32 t_clusters;	/* Number of total clusters covered */
483ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh};
484ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
485ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/*
486ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh * On disk extent list for OCFS2 (node in the tree).  Note that this
487ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh * is contained inside ocfs2_dinode or ocfs2_extent_block, so the
488ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh * offsets are relative to ocfs2_dinode.id2.i_list or
489ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh * ocfs2_extent_block.h_list, respectively.
490ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh */
491ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fashehstruct ocfs2_extent_list {
492ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/*00*/	__le16 l_tree_depth;		/* Extent tree depth from this
493ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh					   point.  0 means data extents
494ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh					   hang directly off this
495dcd0538ff4e854fa9d7f4630b359ca8fdb5cb5a8Mark Fasheh					   header (a leaf)
496dcd0538ff4e854fa9d7f4630b359ca8fdb5cb5a8Mark Fasheh					   NOTE: The high 8 bits cannot be
497dcd0538ff4e854fa9d7f4630b359ca8fdb5cb5a8Mark Fasheh					   used - tree_depth is never that big.
498dcd0538ff4e854fa9d7f4630b359ca8fdb5cb5a8Mark Fasheh					*/
499ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	__le16 l_count;			/* Number of extent records */
500ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	__le16 l_next_free_rec;		/* Next unused extent slot */
501ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	__le16 l_reserved1;
502ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	__le64 l_reserved2;		/* Pad to
503ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh					   sizeof(ocfs2_extent_rec) */
504ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/*10*/	struct ocfs2_extent_rec l_recs[0];	/* Extent records */
505ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh};
506ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
507ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/*
508ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh * On disk allocation chain list for OCFS2.  Note that this is
509ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh * contained inside ocfs2_dinode, so the offsets are relative to
510ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh * ocfs2_dinode.id2.i_chain.
511ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh */
512ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fashehstruct ocfs2_chain_list {
513ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/*00*/	__le16 cl_cpg;			/* Clusters per Block Group */
514ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	__le16 cl_bpc;			/* Bits per cluster */
515ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	__le16 cl_count;		/* Total chains in this list */
516ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	__le16 cl_next_free_rec;	/* Next unused chain slot */
517ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	__le64 cl_reserved1;
518ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/*10*/	struct ocfs2_chain_rec cl_recs[0];	/* Chain records */
519ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh};
520ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
521ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/*
522ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh * On disk deallocation log for OCFS2.  Note that this is
523ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh * contained inside ocfs2_dinode, so the offsets are relative to
524ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh * ocfs2_dinode.id2.i_dealloc.
525ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh */
526ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fashehstruct ocfs2_truncate_log {
527ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/*00*/	__le16 tl_count;		/* Total records in this log */
528ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	__le16 tl_used;			/* Number of records in use */
529ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	__le32 tl_reserved1;
530ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/*08*/	struct ocfs2_truncate_rec tl_recs[0];	/* Truncate records */
531ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh};
532ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
533ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/*
534ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh * On disk extent block (indirect block) for OCFS2
535ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh */
536ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fashehstruct ocfs2_extent_block
537ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh{
538ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/*00*/	__u8 h_signature[8];		/* Signature for verification */
539ab552d54673f262d7f70014003d3928d29270f22Joel Becker	struct ocfs2_block_check h_check;	/* Error checking */
540ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/*10*/	__le16 h_suballoc_slot;		/* Slot suballocator this
541ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh					   extent_header belongs to */
542ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	__le16 h_suballoc_bit;		/* Bit offset in suballocator
543ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh					   block group */
544ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	__le32 h_fs_generation;		/* Must match super block */
545ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	__le64 h_blkno;			/* Offset on disk, in blocks */
5469cbc01231e82f9390edaea2b766abcb7165dc4b2Joel Becker/*20*/	__le64 h_suballoc_loc;		/* Suballocator block group this
5479cbc01231e82f9390edaea2b766abcb7165dc4b2Joel Becker					   eb belongs to.  Only valid
5489cbc01231e82f9390edaea2b766abcb7165dc4b2Joel Becker					   if allocated from a
5499cbc01231e82f9390edaea2b766abcb7165dc4b2Joel Becker					   discontiguous block group */
550ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	__le64 h_next_leaf_blk;		/* Offset on disk, in blocks,
551ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh					   of next leaf header pointing
552ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh					   to data */
553ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/*30*/	struct ocfs2_extent_list h_list;	/* Extent record list */
554ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/* Actual on-disk size is one block */
555ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh};
556ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
557ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/*
558fb86b1f07120b66769a39c445da5c4300069dd44Joel Becker * On disk slot map for OCFS2.  This defines the contents of the "slot_map"
559386a2ef8576e966076c293f6496b9e3d7e3d9035Joel Becker * system file.  A slot is valid if it contains a node number >= 0.  The
560386a2ef8576e966076c293f6496b9e3d7e3d9035Joel Becker * value -1 (0xFFFF) is OCFS2_INVALID_SLOT.  This marks a slot empty.
561fb86b1f07120b66769a39c445da5c4300069dd44Joel Becker */
562fb86b1f07120b66769a39c445da5c4300069dd44Joel Beckerstruct ocfs2_slot_map {
563fb86b1f07120b66769a39c445da5c4300069dd44Joel Becker/*00*/	__le16 sm_slots[0];
564fb86b1f07120b66769a39c445da5c4300069dd44Joel Becker/*
565fb86b1f07120b66769a39c445da5c4300069dd44Joel Becker * Actual on-disk size is one block.  OCFS2_MAX_SLOTS is 255,
566fb86b1f07120b66769a39c445da5c4300069dd44Joel Becker * 255 * sizeof(__le16) == 512B, within the 512B block minimum blocksize.
567fb86b1f07120b66769a39c445da5c4300069dd44Joel Becker */
568fb86b1f07120b66769a39c445da5c4300069dd44Joel Becker};
569fb86b1f07120b66769a39c445da5c4300069dd44Joel Becker
570386a2ef8576e966076c293f6496b9e3d7e3d9035Joel Beckerstruct ocfs2_extended_slot {
571386a2ef8576e966076c293f6496b9e3d7e3d9035Joel Becker/*00*/	__u8	es_valid;
572386a2ef8576e966076c293f6496b9e3d7e3d9035Joel Becker	__u8	es_reserved1[3];
573386a2ef8576e966076c293f6496b9e3d7e3d9035Joel Becker	__le32	es_node_num;
574386a2ef8576e966076c293f6496b9e3d7e3d9035Joel Becker/*10*/
575386a2ef8576e966076c293f6496b9e3d7e3d9035Joel Becker};
576386a2ef8576e966076c293f6496b9e3d7e3d9035Joel Becker
577386a2ef8576e966076c293f6496b9e3d7e3d9035Joel Becker/*
578386a2ef8576e966076c293f6496b9e3d7e3d9035Joel Becker * The extended slot map, used when OCFS2_FEATURE_INCOMPAT_EXTENDED_SLOT_MAP
579386a2ef8576e966076c293f6496b9e3d7e3d9035Joel Becker * is set.  It separates out the valid marker from the node number, and
580386a2ef8576e966076c293f6496b9e3d7e3d9035Joel Becker * has room to grow.  Unlike the old slot map, this format is defined by
581386a2ef8576e966076c293f6496b9e3d7e3d9035Joel Becker * i_size.
582386a2ef8576e966076c293f6496b9e3d7e3d9035Joel Becker */
583386a2ef8576e966076c293f6496b9e3d7e3d9035Joel Beckerstruct ocfs2_slot_map_extended {
584386a2ef8576e966076c293f6496b9e3d7e3d9035Joel Becker/*00*/	struct ocfs2_extended_slot se_slots[0];
585386a2ef8576e966076c293f6496b9e3d7e3d9035Joel Becker/*
586386a2ef8576e966076c293f6496b9e3d7e3d9035Joel Becker * Actual size is i_size of the slot_map system file.  It should
587386a2ef8576e966076c293f6496b9e3d7e3d9035Joel Becker * match s_max_slots * sizeof(struct ocfs2_extended_slot)
588386a2ef8576e966076c293f6496b9e3d7e3d9035Joel Becker */
589386a2ef8576e966076c293f6496b9e3d7e3d9035Joel Becker};
590386a2ef8576e966076c293f6496b9e3d7e3d9035Joel Becker
59198f486f23bc5b6a6fa90e1a0707b7e9fe0e7f3e4Sunil Mushran/*
59298f486f23bc5b6a6fa90e1a0707b7e9fe0e7f3e4Sunil Mushran * ci_stackflags is only valid if the incompat bit
59398f486f23bc5b6a6fa90e1a0707b7e9fe0e7f3e4Sunil Mushran * OCFS2_FEATURE_INCOMPAT_CLUSTERINFO is set.
59498f486f23bc5b6a6fa90e1a0707b7e9fe0e7f3e4Sunil Mushran */
595b61817e1166c5e19c08baf05196477cc345e1b1aJoel Beckerstruct ocfs2_cluster_info {
596b61817e1166c5e19c08baf05196477cc345e1b1aJoel Becker/*00*/	__u8   ci_stack[OCFS2_STACK_LABEL_LEN];
59798f486f23bc5b6a6fa90e1a0707b7e9fe0e7f3e4Sunil Mushran	union {
59898f486f23bc5b6a6fa90e1a0707b7e9fe0e7f3e4Sunil Mushran		__le32 ci_reserved;
59998f486f23bc5b6a6fa90e1a0707b7e9fe0e7f3e4Sunil Mushran		struct {
60098f486f23bc5b6a6fa90e1a0707b7e9fe0e7f3e4Sunil Mushran			__u8 ci_stackflags;
60198f486f23bc5b6a6fa90e1a0707b7e9fe0e7f3e4Sunil Mushran			__u8 ci_reserved1;
60298f486f23bc5b6a6fa90e1a0707b7e9fe0e7f3e4Sunil Mushran			__u8 ci_reserved2;
60398f486f23bc5b6a6fa90e1a0707b7e9fe0e7f3e4Sunil Mushran			__u8 ci_reserved3;
60498f486f23bc5b6a6fa90e1a0707b7e9fe0e7f3e4Sunil Mushran		};
60598f486f23bc5b6a6fa90e1a0707b7e9fe0e7f3e4Sunil Mushran	};
606b61817e1166c5e19c08baf05196477cc345e1b1aJoel Becker/*08*/	__u8   ci_cluster[OCFS2_CLUSTER_NAME_LEN];
607b61817e1166c5e19c08baf05196477cc345e1b1aJoel Becker/*18*/
608b61817e1166c5e19c08baf05196477cc345e1b1aJoel Becker};
609b61817e1166c5e19c08baf05196477cc345e1b1aJoel Becker
610fb86b1f07120b66769a39c445da5c4300069dd44Joel Becker/*
611ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh * On disk superblock for OCFS2
612ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh * Note that it is contained inside an ocfs2_dinode, so all offsets
613ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh * are relative to the start of ocfs2_dinode.id2.
614ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh */
615ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fashehstruct ocfs2_super_block {
616ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/*00*/	__le16 s_major_rev_level;
617ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	__le16 s_minor_rev_level;
618ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	__le16 s_mnt_count;
619ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	__le16 s_max_mnt_count;
620ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	__le16 s_state;			/* File system state */
621ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	__le16 s_errors;			/* Behaviour when detecting errors */
622ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	__le32 s_checkinterval;		/* Max time between checks */
623ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/*10*/	__le64 s_lastcheck;		/* Time of last check */
624ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	__le32 s_creator_os;		/* OS */
625ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	__le32 s_feature_compat;		/* Compatible feature set */
626ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/*20*/	__le32 s_feature_incompat;	/* Incompatible feature set */
627ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	__le32 s_feature_ro_compat;	/* Readonly-compatible feature set */
628ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	__le64 s_root_blkno;		/* Offset, in blocks, of root directory
629ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh					   dinode */
630ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/*30*/	__le64 s_system_dir_blkno;	/* Offset, in blocks, of system
631ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh					   directory dinode */
632ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	__le32 s_blocksize_bits;		/* Blocksize for this fs */
633ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	__le32 s_clustersize_bits;	/* Clustersize for this fs */
634ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/*40*/	__le16 s_max_slots;		/* Max number of simultaneous mounts
635ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh					   before tunefs required */
63692e91ce2a30b2af53ebf077512801dc01e75cca5Mark Fasheh	__le16 s_tunefs_flag;
637cf1d6c763fbcb115263114302485ad17e7933d87Tiger Yang	__le32 s_uuid_hash;		/* hash value of uuid */
638ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	__le64 s_first_cluster_group;	/* Block offset of 1st cluster
639ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh					 * group header */
640ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/*50*/	__u8  s_label[OCFS2_MAX_VOL_LABEL_LEN];	/* Label for mounting, etc. */
641ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/*90*/	__u8  s_uuid[OCFS2_VOL_UUID_LEN];	/* 128-bit uuid */
64298f486f23bc5b6a6fa90e1a0707b7e9fe0e7f3e4Sunil Mushran/*A0*/  struct ocfs2_cluster_info s_cluster_info; /* Only valid if either
64398f486f23bc5b6a6fa90e1a0707b7e9fe0e7f3e4Sunil Mushran						     userspace or clusterinfo
64498f486f23bc5b6a6fa90e1a0707b7e9fe0e7f3e4Sunil Mushran						     INCOMPAT flag set. */
6458154da3d2114241cf3edb108b43e2172be86d483Tiger Yang/*B8*/	__le16 s_xattr_inline_size;	/* extended attribute inline size
6468154da3d2114241cf3edb108b43e2172be86d483Tiger Yang					   for this fs*/
6478154da3d2114241cf3edb108b43e2172be86d483Tiger Yang	__le16 s_reserved0;
6489b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh	__le32 s_dx_seed[3];		/* seed[0-2] for dx dir hash.
6499b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh					 * s_uuid_hash serves as seed[3]. */
6509b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh/*C0*/  __le64 s_reserved2[15];		/* Fill out superblock */
651b61817e1166c5e19c08baf05196477cc345e1b1aJoel Becker/*140*/
652b61817e1166c5e19c08baf05196477cc345e1b1aJoel Becker
653b61817e1166c5e19c08baf05196477cc345e1b1aJoel Becker	/*
654b61817e1166c5e19c08baf05196477cc345e1b1aJoel Becker	 * NOTE: As stated above, all offsets are relative to
655b61817e1166c5e19c08baf05196477cc345e1b1aJoel Becker	 * ocfs2_dinode.id2, which is at 0xC0 in the inode.
656b61817e1166c5e19c08baf05196477cc345e1b1aJoel Becker	 * 0xC0 + 0x140 = 0x200 or 512 bytes.  A superblock must fit within
657b61817e1166c5e19c08baf05196477cc345e1b1aJoel Becker	 * our smallest blocksize, which is 512 bytes.  To ensure this,
658b61817e1166c5e19c08baf05196477cc345e1b1aJoel Becker	 * we reserve the space in s_reserved2.  Anything past s_reserved2
659b61817e1166c5e19c08baf05196477cc345e1b1aJoel Becker	 * will not be available on the smallest blocksize.
660b61817e1166c5e19c08baf05196477cc345e1b1aJoel Becker	 */
661ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh};
662ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
663ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/*
664ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh * Local allocation bitmap for OCFS2 slots
665ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh * Note that it exists inside an ocfs2_dinode, so all offsets are
666ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh * relative to the start of ocfs2_dinode.id2.
667ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh */
668ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fashehstruct ocfs2_local_alloc
669ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh{
670ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/*00*/	__le32 la_bm_off;	/* Starting bit offset in main bitmap */
671ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	__le16 la_size;		/* Size of included bitmap, in bytes */
672ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	__le16 la_reserved1;
673ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	__le64 la_reserved2;
674ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/*10*/	__u8   la_bitmap[0];
675ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh};
676ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
677ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/*
67815b1e36bdb487d67ef924a37b0967453143be53aMark Fasheh * Data-in-inode header. This is only used if i_dyn_features has
67915b1e36bdb487d67ef924a37b0967453143be53aMark Fasheh * OCFS2_INLINE_DATA_FL set.
68015b1e36bdb487d67ef924a37b0967453143be53aMark Fasheh */
68115b1e36bdb487d67ef924a37b0967453143be53aMark Fashehstruct ocfs2_inline_data
68215b1e36bdb487d67ef924a37b0967453143be53aMark Fasheh{
68315b1e36bdb487d67ef924a37b0967453143be53aMark Fasheh/*00*/	__le16	id_count;	/* Number of bytes that can be used
68415b1e36bdb487d67ef924a37b0967453143be53aMark Fasheh				 * for data, starting at id_data */
68515b1e36bdb487d67ef924a37b0967453143be53aMark Fasheh	__le16	id_reserved0;
68615b1e36bdb487d67ef924a37b0967453143be53aMark Fasheh	__le32	id_reserved1;
68715b1e36bdb487d67ef924a37b0967453143be53aMark Fasheh	__u8	id_data[0];	/* Start of user data */
68815b1e36bdb487d67ef924a37b0967453143be53aMark Fasheh};
68915b1e36bdb487d67ef924a37b0967453143be53aMark Fasheh
69015b1e36bdb487d67ef924a37b0967453143be53aMark Fasheh/*
691ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh * On disk inode for OCFS2
692ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh */
693ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fashehstruct ocfs2_dinode {
694ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/*00*/	__u8 i_signature[8];		/* Signature for validation */
695ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	__le32 i_generation;		/* Generation number */
696ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	__le16 i_suballoc_slot;		/* Slot suballocator this inode
697ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh					   belongs to */
698ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	__le16 i_suballoc_bit;		/* Bit offset in suballocator
699ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh					   block group */
700198a1ca3b735986542c538e38b9499ffcaed7005Mark Fasheh/*10*/	__le16 i_links_count_hi;	/* High 16 bits of links count */
701fdd77704a8b4666a32120fcd1e4a9fedaf3263d8Tiger Yang	__le16 i_xattr_inline_size;
702ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	__le32 i_clusters;		/* Cluster count */
703ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	__le32 i_uid;			/* Owner UID */
704ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	__le32 i_gid;			/* Owning GID */
705ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/*20*/	__le64 i_size;			/* Size in bytes */
706ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	__le16 i_mode;			/* File mode */
707ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	__le16 i_links_count;		/* Links count */
708ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	__le32 i_flags;			/* File flags */
709ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/*30*/	__le64 i_atime;			/* Access time */
710ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	__le64 i_ctime;			/* Creation time */
711ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/*40*/	__le64 i_mtime;			/* Modification time */
712ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	__le64 i_dtime;			/* Deletion time */
713ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/*50*/	__le64 i_blkno;			/* Offset on disk, in blocks */
714ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	__le64 i_last_eb_blk;		/* Pointer to last extent
715ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh					   block */
716ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/*60*/	__le32 i_fs_generation;		/* Generation per fs-instance */
717ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	__le32 i_atime_nsec;
718ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	__le32 i_ctime_nsec;
719ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	__le32 i_mtime_nsec;
720fdd77704a8b4666a32120fcd1e4a9fedaf3263d8Tiger Yang/*70*/	__le32 i_attr;
721500086300e6dc5308a7328990bd50d17e075162bTiger Yang	__le16 i_orphaned_slot;		/* Only valid when OCFS2_ORPHANED_FL
722500086300e6dc5308a7328990bd50d17e075162bTiger Yang					   was set in i_flags */
72315b1e36bdb487d67ef924a37b0967453143be53aMark Fasheh	__le16 i_dyn_features;
724fdd77704a8b4666a32120fcd1e4a9fedaf3263d8Tiger Yang	__le64 i_xattr_loc;
725ab552d54673f262d7f70014003d3928d29270f22Joel Becker/*80*/	struct ocfs2_block_check i_check;	/* Error checking */
7269b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh/*88*/	__le64 i_dx_root;		/* Pointer to dir index root block */
727721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma/*90*/	__le64 i_refcount_loc;
7289cbc01231e82f9390edaea2b766abcb7165dc4b2Joel Becker	__le64 i_suballoc_loc;		/* Suballocator block group this
7299cbc01231e82f9390edaea2b766abcb7165dc4b2Joel Becker					   inode belongs to.  Only valid
7309cbc01231e82f9390edaea2b766abcb7165dc4b2Joel Becker					   if allocated from a
7319cbc01231e82f9390edaea2b766abcb7165dc4b2Joel Becker					   discontiguous block group */
7329cbc01231e82f9390edaea2b766abcb7165dc4b2Joel Becker/*A0*/	__le64 i_reserved2[3];
733ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/*B8*/	union {
734ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh		__le64 i_pad1;		/* Generic way to refer to this
735ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh					   64bit union */
736ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh		struct {
737ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh			__le64 i_rdev;	/* Device number */
738ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh		} dev1;
739ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh		struct {		/* Info for bitmap system
740ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh					   inodes */
741ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh			__le32 i_used;	/* Bits (ie, clusters) used  */
742ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh			__le32 i_total;	/* Total bits (clusters)
743ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh					   available */
744ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh		} bitmap1;
745ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh		struct {		/* Info for journal system
746ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh					   inodes */
747ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh			__le32 ij_flags;	/* Mounted, version, etc. */
748c69991aac71a8beb57c11d651c7fd4b24c32aa8bSunil Mushran			__le32 ij_recovery_generation; /* Incremented when the
749c69991aac71a8beb57c11d651c7fd4b24c32aa8bSunil Mushran							  journal is recovered
750c69991aac71a8beb57c11d651c7fd4b24c32aa8bSunil Mushran							  after an unclean
751c69991aac71a8beb57c11d651c7fd4b24c32aa8bSunil Mushran							  shutdown */
752ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh		} journal1;
75325985edcedea6396277003854657b5f3cb31a628Lucas De Marchi	} id1;				/* Inode type dependent 1 */
754ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/*C0*/	union {
755ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh		struct ocfs2_super_block	i_super;
756ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh		struct ocfs2_local_alloc	i_lab;
757ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh		struct ocfs2_chain_list		i_chain;
758ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh		struct ocfs2_extent_list	i_list;
759ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh		struct ocfs2_truncate_log	i_dealloc;
76015b1e36bdb487d67ef924a37b0967453143be53aMark Fasheh		struct ocfs2_inline_data	i_data;
761ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh		__u8               		i_symlink[0];
762ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	} id2;
763ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/* Actual on-disk size is one block */
764ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh};
765ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
766ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/*
767ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh * On-disk directory entry structure for OCFS2
768ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh *
769ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh * Packed as this structure could be accessed unaligned on 64-bit platforms
770ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh */
771ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fashehstruct ocfs2_dir_entry {
772ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/*00*/	__le64   inode;                  /* Inode number */
773ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	__le16   rec_len;                /* Directory entry length */
774ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	__u8    name_len;               /* Name length */
775ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	__u8    file_type;
776ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/*0C*/	char    name[OCFS2_MAX_FILENAME_LEN];   /* File name */
777ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/* Actual on-disk length specified by rec_len */
778ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh} __attribute__ ((packed));
779ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
780ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/*
78187d35a74b15ec703910a63e0667692fb5e267be0Mark Fasheh * Per-block record for the unindexed directory btree. This is carefully
78287d35a74b15ec703910a63e0667692fb5e267be0Mark Fasheh * crafted so that the rec_len and name_len records of an ocfs2_dir_entry are
78387d35a74b15ec703910a63e0667692fb5e267be0Mark Fasheh * mirrored. That way, the directory manipulation code needs a minimal amount
78487d35a74b15ec703910a63e0667692fb5e267be0Mark Fasheh * of update.
78587d35a74b15ec703910a63e0667692fb5e267be0Mark Fasheh *
78687d35a74b15ec703910a63e0667692fb5e267be0Mark Fasheh * NOTE: Keep this structure aligned to a multiple of 4 bytes.
78787d35a74b15ec703910a63e0667692fb5e267be0Mark Fasheh */
78887d35a74b15ec703910a63e0667692fb5e267be0Mark Fashehstruct ocfs2_dir_block_trailer {
78987d35a74b15ec703910a63e0667692fb5e267be0Mark Fasheh/*00*/	__le64		db_compat_inode;	/* Always zero. Was inode */
79087d35a74b15ec703910a63e0667692fb5e267be0Mark Fasheh
79187d35a74b15ec703910a63e0667692fb5e267be0Mark Fasheh	__le16		db_compat_rec_len;	/* Backwards compatible with
79287d35a74b15ec703910a63e0667692fb5e267be0Mark Fasheh						 * ocfs2_dir_entry. */
79387d35a74b15ec703910a63e0667692fb5e267be0Mark Fasheh	__u8		db_compat_name_len;	/* Always zero. Was name_len */
79487d35a74b15ec703910a63e0667692fb5e267be0Mark Fasheh	__u8		db_reserved0;
79587d35a74b15ec703910a63e0667692fb5e267be0Mark Fasheh	__le16		db_reserved1;
79687d35a74b15ec703910a63e0667692fb5e267be0Mark Fasheh	__le16		db_free_rec_len;	/* Size of largest empty hole
79787d35a74b15ec703910a63e0667692fb5e267be0Mark Fasheh						 * in this block. (unused) */
79887d35a74b15ec703910a63e0667692fb5e267be0Mark Fasheh/*10*/	__u8		db_signature[8];	/* Signature for verification */
79987d35a74b15ec703910a63e0667692fb5e267be0Mark Fasheh	__le64		db_reserved2;
80087d35a74b15ec703910a63e0667692fb5e267be0Mark Fasheh	__le64		db_free_next;		/* Next block in list (unused) */
80187d35a74b15ec703910a63e0667692fb5e267be0Mark Fasheh/*20*/	__le64		db_blkno;		/* Offset on disk, in blocks */
80287d35a74b15ec703910a63e0667692fb5e267be0Mark Fasheh	__le64		db_parent_dinode;	/* dinode which owns me, in
80387d35a74b15ec703910a63e0667692fb5e267be0Mark Fasheh						   blocks */
804c175a518b4a1d514483abf61813ce5d855917164Joel Becker/*30*/	struct ocfs2_block_check db_check;	/* Error checking */
80587d35a74b15ec703910a63e0667692fb5e267be0Mark Fasheh/*40*/
80687d35a74b15ec703910a63e0667692fb5e267be0Mark Fasheh};
80787d35a74b15ec703910a63e0667692fb5e267be0Mark Fasheh
8089b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh /*
8099b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh * A directory entry in the indexed tree. We don't store the full name here,
8109b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh * but instead provide a pointer to the full dirent in the unindexed tree.
8119b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh *
8129b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh * We also store name_len here so as to reduce the number of leaf blocks we
8139b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh * need to search in case of collisions.
8149b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh */
8159b7895efac906d66d19856194e1ba61f37e231a4Mark Fashehstruct ocfs2_dx_entry {
8169b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh	__le32		dx_major_hash;	/* Used to find logical
8179b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh					 * cluster in index */
8189b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh	__le32		dx_minor_hash;	/* Lower bits used to find
8199b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh					 * block in cluster */
8209b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh	__le64		dx_dirent_blk;	/* Physical block in unindexed
8219b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh					 * tree holding this dirent. */
8229b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh};
8239b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh
8249b7895efac906d66d19856194e1ba61f37e231a4Mark Fashehstruct ocfs2_dx_entry_list {
8259b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh	__le32		de_reserved;
8269b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh	__le16		de_count;	/* Maximum number of entries
8279b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh					 * possible in de_entries */
8289b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh	__le16		de_num_used;	/* Current number of
8299b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh					 * de_entries entries */
8309b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh	struct	ocfs2_dx_entry		de_entries[0];	/* Indexed dir entries
8319b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh							 * in a packed array of
8329b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh							 * length de_num_used */
8339b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh};
8349b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh
8354ed8a6bb083bfcc21f1ed66a474b03c0386e4b34Mark Fasheh#define OCFS2_DX_FLAG_INLINE	0x01
8364ed8a6bb083bfcc21f1ed66a474b03c0386e4b34Mark Fasheh
8379b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh/*
8389b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh * A directory indexing block. Each indexed directory has one of these,
8399b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh * pointed to by ocfs2_dinode.
8409b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh *
8419b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh * This block stores an indexed btree root, and a set of free space
8429b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh * start-of-list pointers.
8439b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh */
8449b7895efac906d66d19856194e1ba61f37e231a4Mark Fashehstruct ocfs2_dx_root_block {
8459b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh	__u8		dr_signature[8];	/* Signature for verification */
8469b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh	struct ocfs2_block_check dr_check;	/* Error checking */
8479b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh	__le16		dr_suballoc_slot;	/* Slot suballocator this
8489b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh						 * block belongs to. */
8499b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh	__le16		dr_suballoc_bit;	/* Bit offset in suballocator
8509b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh						 * block group */
8519b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh	__le32		dr_fs_generation;	/* Must match super block */
8529b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh	__le64		dr_blkno;		/* Offset on disk, in blocks */
8539b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh	__le64		dr_last_eb_blk;		/* Pointer to last
8549b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh						 * extent block */
8559b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh	__le32		dr_clusters;		/* Clusters allocated
8569b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh						 * to the indexed tree. */
8574ed8a6bb083bfcc21f1ed66a474b03c0386e4b34Mark Fasheh	__u8		dr_flags;		/* OCFS2_DX_FLAG_* flags */
8584ed8a6bb083bfcc21f1ed66a474b03c0386e4b34Mark Fasheh	__u8		dr_reserved0;
8594ed8a6bb083bfcc21f1ed66a474b03c0386e4b34Mark Fasheh	__le16		dr_reserved1;
8609b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh	__le64		dr_dir_blkno;		/* Pointer to parent inode */
861e3a93c2db6410822aa24295c3874b44ba21730a8Mark Fasheh	__le32		dr_num_entries;		/* Total number of
862e3a93c2db6410822aa24295c3874b44ba21730a8Mark Fasheh						 * names stored in
863e3a93c2db6410822aa24295c3874b44ba21730a8Mark Fasheh						 * this directory.*/
864e3a93c2db6410822aa24295c3874b44ba21730a8Mark Fasheh	__le32		dr_reserved2;
865e7c17e43090afe558c40bfb66637744c27bd2aebMark Fasheh	__le64		dr_free_blk;		/* Pointer to head of free
866e7c17e43090afe558c40bfb66637744c27bd2aebMark Fasheh						 * unindexed block list. */
8679cbc01231e82f9390edaea2b766abcb7165dc4b2Joel Becker	__le64		dr_suballoc_loc;	/* Suballocator block group
8689cbc01231e82f9390edaea2b766abcb7165dc4b2Joel Becker						   this root belongs to.
8699cbc01231e82f9390edaea2b766abcb7165dc4b2Joel Becker						   Only valid if allocated
8709cbc01231e82f9390edaea2b766abcb7165dc4b2Joel Becker						   from a discontiguous
8719cbc01231e82f9390edaea2b766abcb7165dc4b2Joel Becker						   block group */
8729cbc01231e82f9390edaea2b766abcb7165dc4b2Joel Becker	__le64		dr_reserved3[14];
8734ed8a6bb083bfcc21f1ed66a474b03c0386e4b34Mark Fasheh	union {
8744ed8a6bb083bfcc21f1ed66a474b03c0386e4b34Mark Fasheh		struct ocfs2_extent_list dr_list; /* Keep this aligned to 128
8754ed8a6bb083bfcc21f1ed66a474b03c0386e4b34Mark Fasheh						   * bits for maximum space
8764ed8a6bb083bfcc21f1ed66a474b03c0386e4b34Mark Fasheh						   * efficiency. */
8774ed8a6bb083bfcc21f1ed66a474b03c0386e4b34Mark Fasheh		struct ocfs2_dx_entry_list dr_entries; /* In-root-block list of
8784ed8a6bb083bfcc21f1ed66a474b03c0386e4b34Mark Fasheh							* entries. We grow out
8794ed8a6bb083bfcc21f1ed66a474b03c0386e4b34Mark Fasheh							* to extents if this
8804ed8a6bb083bfcc21f1ed66a474b03c0386e4b34Mark Fasheh							* gets too big. */
8814ed8a6bb083bfcc21f1ed66a474b03c0386e4b34Mark Fasheh	};
8829b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh};
8839b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh
8849b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh/*
8859b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh * The header of a leaf block in the indexed tree.
8869b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh */
8879b7895efac906d66d19856194e1ba61f37e231a4Mark Fashehstruct ocfs2_dx_leaf {
8889b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh	__u8		dl_signature[8];/* Signature for verification */
8899b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh	struct ocfs2_block_check dl_check;	/* Error checking */
8909b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh	__le64		dl_blkno;	/* Offset on disk, in blocks */
8919b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh	__le32		dl_fs_generation;/* Must match super block */
8929b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh	__le32		dl_reserved0;
8939b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh	__le64		dl_reserved1;
8949b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh	struct ocfs2_dx_entry_list	dl_list;
8959b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh};
8969b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh
89787d35a74b15ec703910a63e0667692fb5e267be0Mark Fasheh/*
8984cbe4249d6586d5d88ef271e07302407a14c8443Joel Becker * Largest bitmap for a block (suballocator) group in bytes.  This limit
8994cbe4249d6586d5d88ef271e07302407a14c8443Joel Becker * does not affect cluster groups (global allocator).  Cluster group
9004cbe4249d6586d5d88ef271e07302407a14c8443Joel Becker * bitmaps run to the end of the block.
9014cbe4249d6586d5d88ef271e07302407a14c8443Joel Becker */
9024cbe4249d6586d5d88ef271e07302407a14c8443Joel Becker#define OCFS2_MAX_BG_BITMAP_SIZE	256
9034cbe4249d6586d5d88ef271e07302407a14c8443Joel Becker
9044cbe4249d6586d5d88ef271e07302407a14c8443Joel Becker/*
905ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh * On disk allocator group structure for OCFS2
906ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh */
907ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fashehstruct ocfs2_group_desc
908ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh{
909ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/*00*/	__u8    bg_signature[8];        /* Signature for validation */
910ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	__le16   bg_size;                /* Size of included bitmap in
911ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh					   bytes. */
912ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	__le16   bg_bits;                /* Bits represented by this
913ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh					   group. */
914ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	__le16	bg_free_bits_count;     /* Free bits count */
915ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	__le16   bg_chain;               /* What chain I am in. */
916ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/*10*/	__le32   bg_generation;
917ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	__le32	bg_reserved1;
918ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	__le64   bg_next_group;          /* Next group in my list, in
919ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh					   blocks */
920ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh/*20*/	__le64   bg_parent_dinode;       /* dinode which owns me, in
921ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh					   blocks */
922ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	__le64   bg_blkno;               /* Offset on disk, in blocks */
923ab552d54673f262d7f70014003d3928d29270f22Joel Becker/*30*/	struct ocfs2_block_check bg_check;	/* Error checking */
924ab552d54673f262d7f70014003d3928d29270f22Joel Becker	__le64   bg_reserved2;
9254cbe4249d6586d5d88ef271e07302407a14c8443Joel Becker/*40*/	union {
9264cbe4249d6586d5d88ef271e07302407a14c8443Joel Becker		__u8    bg_bitmap[0];
9274cbe4249d6586d5d88ef271e07302407a14c8443Joel Becker		struct {
9284cbe4249d6586d5d88ef271e07302407a14c8443Joel Becker			/*
9294cbe4249d6586d5d88ef271e07302407a14c8443Joel Becker			 * Block groups may be discontiguous when
9304cbe4249d6586d5d88ef271e07302407a14c8443Joel Becker			 * OCFS2_FEATURE_INCOMPAT_DISCONTIG_BG is set.
9314cbe4249d6586d5d88ef271e07302407a14c8443Joel Becker			 * The extents of a discontigous block group are
9324cbe4249d6586d5d88ef271e07302407a14c8443Joel Becker			 * stored in bg_list.  It is a flat list.
9334cbe4249d6586d5d88ef271e07302407a14c8443Joel Becker			 * l_tree_depth must always be zero.  A
9344cbe4249d6586d5d88ef271e07302407a14c8443Joel Becker			 * discontiguous group is signified by a non-zero
9354cbe4249d6586d5d88ef271e07302407a14c8443Joel Becker			 * bg_list->l_next_free_rec.  Only block groups
9364cbe4249d6586d5d88ef271e07302407a14c8443Joel Becker			 * can be discontiguous; Cluster groups cannot.
9374cbe4249d6586d5d88ef271e07302407a14c8443Joel Becker			 * We've never made a block group with more than
9384cbe4249d6586d5d88ef271e07302407a14c8443Joel Becker			 * 2048 blocks (256 bytes of bg_bitmap).  This
9394cbe4249d6586d5d88ef271e07302407a14c8443Joel Becker			 * codifies that limit so that we can fit bg_list.
9404cbe4249d6586d5d88ef271e07302407a14c8443Joel Becker			 * bg_size of a discontiguous block group will
9414cbe4249d6586d5d88ef271e07302407a14c8443Joel Becker			 * be 256 to match bg_bitmap_filler.
9424cbe4249d6586d5d88ef271e07302407a14c8443Joel Becker			 */
9434cbe4249d6586d5d88ef271e07302407a14c8443Joel Becker			__u8 bg_bitmap_filler[OCFS2_MAX_BG_BITMAP_SIZE];
9444cbe4249d6586d5d88ef271e07302407a14c8443Joel Becker/*140*/			struct ocfs2_extent_list bg_list;
9454cbe4249d6586d5d88ef271e07302407a14c8443Joel Becker		};
9464cbe4249d6586d5d88ef271e07302407a14c8443Joel Becker	};
9474cbe4249d6586d5d88ef271e07302407a14c8443Joel Becker/* Actual on-disk size is one block */
948ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh};
949ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
950721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Mastruct ocfs2_refcount_rec {
951721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma/*00*/	__le64 r_cpos;		/* Physical offset, in clusters */
952721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma	__le32 r_clusters;	/* Clusters covered by this extent */
953721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma	__le32 r_refcount;	/* Reference count of this extent */
954721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma/*10*/
955721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma};
956e73a819db9c2d6c4065b7cab7374709b6939e8f1Tao Ma#define OCFS2_32BIT_POS_MASK		(0xffffffffULL)
957721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma
958721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma#define OCFS2_REFCOUNT_LEAF_FL          (0x00000001)
959721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma#define OCFS2_REFCOUNT_TREE_FL          (0x00000002)
960721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma
961721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Mastruct ocfs2_refcount_list {
962721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma/*00*/	__le16 rl_count;	/* Maximum number of entries possible
963721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma				   in rl_records */
964721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma	__le16 rl_used;		/* Current number of used records */
965721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma	__le32 rl_reserved2;
966721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma	__le64 rl_reserved1;	/* Pad to sizeof(ocfs2_refcount_record) */
967721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma/*10*/	struct ocfs2_refcount_rec rl_recs[0];	/* Refcount records */
968721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma};
969721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma
970721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma
971721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Mastruct ocfs2_refcount_block {
972721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma/*00*/	__u8 rf_signature[8];		/* Signature for verification */
973721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma	__le16 rf_suballoc_slot;	/* Slot suballocator this block
974721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma					   belongs to */
975721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma	__le16 rf_suballoc_bit;		/* Bit offset in suballocator
976721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma					   block group */
977721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma	__le32 rf_fs_generation;	/* Must match superblock */
978721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma/*10*/	__le64 rf_blkno;		/* Offset on disk, in blocks */
979721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma	__le64 rf_parent;		/* Parent block, only valid if
980721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma					   OCFS2_REFCOUNT_LEAF_FL is set in
981721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma					   rf_flags */
982721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma/*20*/	struct ocfs2_block_check rf_check;	/* Error checking */
983721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma	__le64 rf_last_eb_blk;		/* Pointer to last extent block */
984721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma/*30*/	__le32 rf_count;		/* Number of inodes sharing this
985721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma					   refcount tree */
986721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma	__le32 rf_flags;		/* See the flags above */
987721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma	__le32 rf_clusters;		/* clusters covered by refcount tree. */
988721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma	__le32 rf_cpos;			/* cluster offset in refcount tree.*/
989721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma/*40*/	__le32 rf_generation;		/* generation number. all be the same
990721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma					 * for the same refcount tree. */
991721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma	__le32 rf_reserved0;
9929cbc01231e82f9390edaea2b766abcb7165dc4b2Joel Becker	__le64 rf_suballoc_loc;		/* Suballocator block group this
9939cbc01231e82f9390edaea2b766abcb7165dc4b2Joel Becker					   refcount block belongs to. Only
9949cbc01231e82f9390edaea2b766abcb7165dc4b2Joel Becker					   valid if allocated from a
9959cbc01231e82f9390edaea2b766abcb7165dc4b2Joel Becker					   discontiguous block group */
9969cbc01231e82f9390edaea2b766abcb7165dc4b2Joel Becker/*50*/	__le64 rf_reserved1[6];
997721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma/*80*/	union {
998721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma		struct ocfs2_refcount_list rf_records;  /* List of refcount
999721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma							  records */
1000721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma		struct ocfs2_extent_list rf_list;	/* Extent record list,
1001721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma							only valid if
1002721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma							OCFS2_REFCOUNT_TREE_FL
1003721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma							is set in rf_flags */
1004721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma	};
1005721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma/* Actual on-disk size is one block */
1006721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma};
1007721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma
10085a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma/*
10095a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma * On disk extended attribute structure for OCFS2.
10105a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma */
10115a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma
10125a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma/*
10135a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma * ocfs2_xattr_entry indicates one extend attribute.
10145a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma *
10155a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma * Note that it can be stored in inode, one block or one xattr bucket.
10165a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma */
10175a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Mastruct ocfs2_xattr_entry {
10185a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma	__le32	xe_name_hash;    /* hash value of xattr prefix+suffix. */
10198573f79d30077875e2b6e83849b5245bfbb08685Tao Ma	__le16	xe_name_offset;  /* byte offset from the 1st entry in the
10205a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma				    local xattr storage(inode, xattr block or
10215a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma				    xattr bucket). */
1022e9c549998dc24209847007e1f209f3b6c88d21baLucas De Marchi	__u8	xe_name_len;	 /* xattr name len, doesn't include prefix. */
10238573f79d30077875e2b6e83849b5245bfbb08685Tao Ma	__u8	xe_type;         /* the low 7 bits indicate the name prefix
10248573f79d30077875e2b6e83849b5245bfbb08685Tao Ma				  * type and the highest bit indicates whether
10255a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma				  * the EA is stored in the local storage. */
10265a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma	__le64	xe_value_size;	 /* real xattr value length. */
10275a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma};
10285a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma
10295a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma/*
10305a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma * On disk structure for xattr header.
10315a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma *
10325a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma * One ocfs2_xattr_header describes how many ocfs2_xattr_entry records in
10335a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma * the local xattr storage.
10345a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma */
10355a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Mastruct ocfs2_xattr_header {
10365a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma	__le16	xh_count;                       /* contains the count of how
10375a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma						   many records are in the
10385a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma						   local xattr storage. */
10390c044f0b24b9128ba8c297149d88bd81f2e36af3Tao Ma	__le16	xh_free_start;                  /* current offset for storing
10400c044f0b24b9128ba8c297149d88bd81f2e36af3Tao Ma						   xattr. */
10410c044f0b24b9128ba8c297149d88bd81f2e36af3Tao Ma	__le16	xh_name_value_len;              /* total length of name/value
10420c044f0b24b9128ba8c297149d88bd81f2e36af3Tao Ma						   length in this bucket. */
10438573f79d30077875e2b6e83849b5245bfbb08685Tao Ma	__le16	xh_num_buckets;                 /* Number of xattr buckets
10448573f79d30077875e2b6e83849b5245bfbb08685Tao Ma						   in this extent record,
10458573f79d30077875e2b6e83849b5245bfbb08685Tao Ma						   only valid in the first
10468573f79d30077875e2b6e83849b5245bfbb08685Tao Ma						   bucket. */
1047ab552d54673f262d7f70014003d3928d29270f22Joel Becker	struct ocfs2_block_check xh_check;	/* Error checking
1048ab552d54673f262d7f70014003d3928d29270f22Joel Becker						   (Note, this is only
1049ab552d54673f262d7f70014003d3928d29270f22Joel Becker						    used for xattr
1050ab552d54673f262d7f70014003d3928d29270f22Joel Becker						    buckets.  A block uses
1051ab552d54673f262d7f70014003d3928d29270f22Joel Becker						    xb_check and sets
1052ab552d54673f262d7f70014003d3928d29270f22Joel Becker						    this field to zero.) */
10535a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma	struct ocfs2_xattr_entry xh_entries[0]; /* xattr entry list. */
10545a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma};
10555a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma
10565a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma/*
10575a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma * On disk structure for xattr value root.
10585a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma *
10598573f79d30077875e2b6e83849b5245bfbb08685Tao Ma * When an xattr's value is large enough, it is stored in an external
10608573f79d30077875e2b6e83849b5245bfbb08685Tao Ma * b-tree like file data.  The xattr value root points to this structure.
10615a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma */
10625a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Mastruct ocfs2_xattr_value_root {
10635a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma/*00*/	__le32	xr_clusters;              /* clusters covered by xattr value. */
10645a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma	__le32	xr_reserved0;
10655a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma	__le64	xr_last_eb_blk;           /* Pointer to last extent block */
10665a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma/*10*/	struct ocfs2_extent_list xr_list; /* Extent record list */
10675a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma};
10685a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma
10695a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma/*
10705a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma * On disk structure for xattr tree root.
10715a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma *
10725a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma * It is used when there are too many extended attributes for one file. These
10735a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma * attributes will be organized and stored in an indexed-btree.
10745a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma */
10755a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Mastruct ocfs2_xattr_tree_root {
10765a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma/*00*/	__le32	xt_clusters;              /* clusters covered by xattr. */
10775a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma	__le32	xt_reserved0;
10785a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma	__le64	xt_last_eb_blk;           /* Pointer to last extent block */
10795a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma/*10*/	struct ocfs2_extent_list xt_list; /* Extent record list */
10805a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma};
10815a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma
1082cf1d6c763fbcb115263114302485ad17e7933d87Tiger Yang#define OCFS2_XATTR_INDEXED	0x1
1083cf1d6c763fbcb115263114302485ad17e7933d87Tiger Yang#define OCFS2_HASH_SHIFT	5
1084cf1d6c763fbcb115263114302485ad17e7933d87Tiger Yang#define OCFS2_XATTR_ROUND	3
1085cf1d6c763fbcb115263114302485ad17e7933d87Tiger Yang#define OCFS2_XATTR_SIZE(size)	(((size) + OCFS2_XATTR_ROUND) & \
1086cf1d6c763fbcb115263114302485ad17e7933d87Tiger Yang				~(OCFS2_XATTR_ROUND))
10875a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma
10880c044f0b24b9128ba8c297149d88bd81f2e36af3Tao Ma#define OCFS2_XATTR_BUCKET_SIZE			4096
10890c044f0b24b9128ba8c297149d88bd81f2e36af3Tao Ma#define OCFS2_XATTR_MAX_BLOCKS_PER_BUCKET 	(OCFS2_XATTR_BUCKET_SIZE \
10900c044f0b24b9128ba8c297149d88bd81f2e36af3Tao Ma						 / OCFS2_MIN_BLOCKSIZE)
10910c044f0b24b9128ba8c297149d88bd81f2e36af3Tao Ma
10925a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma/*
10935a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma * On disk structure for xattr block.
10945a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma */
10955a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Mastruct ocfs2_xattr_block {
10965a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma/*00*/	__u8	xb_signature[8];     /* Signature for verification */
10975a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma	__le16	xb_suballoc_slot;    /* Slot suballocator this
10985a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma					block belongs to. */
10995a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma	__le16	xb_suballoc_bit;     /* Bit offset in suballocator
11005a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma					block group */
11015a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma	__le32	xb_fs_generation;    /* Must match super block */
11025a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma/*10*/	__le64	xb_blkno;            /* Offset on disk, in blocks */
1103ab552d54673f262d7f70014003d3928d29270f22Joel Becker	struct ocfs2_block_check xb_check;	/* Error checking */
11045a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma/*20*/	__le16	xb_flags;            /* Indicates whether this block contains
11055a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma					real xattr or a xattr tree. */
11065a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma	__le16	xb_reserved0;
11075a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma	__le32  xb_reserved1;
11089cbc01231e82f9390edaea2b766abcb7165dc4b2Joel Becker	__le64	xb_suballoc_loc;	/* Suballocator block group this
11099cbc01231e82f9390edaea2b766abcb7165dc4b2Joel Becker					   xattr block belongs to. Only
11109cbc01231e82f9390edaea2b766abcb7165dc4b2Joel Becker					   valid if allocated from a
11119cbc01231e82f9390edaea2b766abcb7165dc4b2Joel Becker					   discontiguous block group */
11125a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma/*30*/	union {
11135a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma		struct ocfs2_xattr_header xb_header; /* xattr header if this
11145a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma							block contains xattr */
11155a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma		struct ocfs2_xattr_tree_root xb_root;/* xattr tree root if this
11165a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma							block cotains xattr
11175a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma							tree. */
11185a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma	} xb_attrs;
11195a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma};
11205a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma
11215a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma#define OCFS2_XATTR_ENTRY_LOCAL		0x80
11225a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma#define OCFS2_XATTR_TYPE_MASK		0x7F
11235a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Mastatic inline void ocfs2_xattr_set_local(struct ocfs2_xattr_entry *xe,
11245a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma					 int local)
11255a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma{
11265a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma	if (local)
11275a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma		xe->xe_type |= OCFS2_XATTR_ENTRY_LOCAL;
11285a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma	else
11295a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma		xe->xe_type &= ~OCFS2_XATTR_ENTRY_LOCAL;
11305a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma}
11315a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma
11325a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Mastatic inline int ocfs2_xattr_is_local(struct ocfs2_xattr_entry *xe)
11335a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma{
11345a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma	return xe->xe_type & OCFS2_XATTR_ENTRY_LOCAL;
11355a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma}
11365a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma
11375a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Mastatic inline void ocfs2_xattr_set_type(struct ocfs2_xattr_entry *xe, int type)
11385a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma{
11395a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma	xe->xe_type |= type & OCFS2_XATTR_TYPE_MASK;
11405a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma}
11415a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma
11425a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Mastatic inline int ocfs2_xattr_get_type(struct ocfs2_xattr_entry *xe)
11435a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma{
11445a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma	return xe->xe_type & OCFS2_XATTR_TYPE_MASK;
11455a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma}
11465a7bc8eb29b8c759df374d97b6189e03d4ea71c5Tao Ma
11479e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara/*
11489e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara *  On disk structures for global quota file
11499e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara */
11509e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara
11519e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara/* Magic numbers and known versions for global quota files */
11529e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara#define OCFS2_GLOBAL_QMAGICS {\
11539e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara	0x0cf52470, /* USRQUOTA */ \
11549e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara	0x0cf52471  /* GRPQUOTA */ \
11559e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara}
11569e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara
11579e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara#define OCFS2_GLOBAL_QVERSIONS {\
11589e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara	0, \
11599e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara	0, \
11609e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara}
11619e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara
11629e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara
11639e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara/* Each block of each quota file has a certain fixed number of bytes reserved
11649e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara * for OCFS2 internal use at its end. OCFS2 can use it for things like
11659e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara * checksums, etc. */
11669e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara#define OCFS2_QBLK_RESERVED_SPACE 8
11679e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara
11689e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara/* Generic header of all quota files */
11699e33d69f553aaf11377307e8d6f82deb3385e351Jan Karastruct ocfs2_disk_dqheader {
11709e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara	__le32 dqh_magic;	/* Magic number identifying file */
11719e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara	__le32 dqh_version;	/* Quota format version */
11729e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara};
11739e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara
11749e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara#define OCFS2_GLOBAL_INFO_OFF (sizeof(struct ocfs2_disk_dqheader))
11759e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara
11769e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara/* Information header of global quota file (immediately follows the generic
11779e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara * header) */
11789e33d69f553aaf11377307e8d6f82deb3385e351Jan Karastruct ocfs2_global_disk_dqinfo {
11799e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara/*00*/	__le32 dqi_bgrace;	/* Grace time for space softlimit excess */
11809e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara	__le32 dqi_igrace;	/* Grace time for inode softlimit excess */
11819e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara	__le32 dqi_syncms;	/* Time after which we sync local changes to
11829e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara				 * global quota file */
11839e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara	__le32 dqi_blocks;	/* Number of blocks in quota file */
11849e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara/*10*/	__le32 dqi_free_blk;	/* First free block in quota file */
11859e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara	__le32 dqi_free_entry;	/* First block with free dquot entry in quota
11869e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara				 * file */
11879e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara};
11889e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara
11899e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara/* Structure with global user / group information. We reserve some space
11909e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara * for future use. */
11919e33d69f553aaf11377307e8d6f82deb3385e351Jan Karastruct ocfs2_global_disk_dqblk {
11929e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara/*00*/	__le32 dqb_id;          /* ID the structure belongs to */
11939e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara	__le32 dqb_use_count;   /* Number of nodes having reference to this structure */
11949e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara	__le64 dqb_ihardlimit;  /* absolute limit on allocated inodes */
11959e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara/*10*/	__le64 dqb_isoftlimit;  /* preferred inode limit */
11969e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara	__le64 dqb_curinodes;   /* current # allocated inodes */
11979e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara/*20*/	__le64 dqb_bhardlimit;  /* absolute limit on disk space */
11989e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara	__le64 dqb_bsoftlimit;  /* preferred limit on disk space */
11999e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara/*30*/	__le64 dqb_curspace;    /* current space occupied */
12009e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara	__le64 dqb_btime;       /* time limit for excessive disk use */
12019e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara/*40*/	__le64 dqb_itime;       /* time limit for excessive inode use */
12029e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara	__le64 dqb_pad1;
12039e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara/*50*/	__le64 dqb_pad2;
12049e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara};
12059e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara
12069e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara/*
12079e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara *  On-disk structures for local quota file
12089e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara */
12099e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara
12109e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara/* Magic numbers and known versions for local quota files */
12119e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara#define OCFS2_LOCAL_QMAGICS {\
12129e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara	0x0cf524c0, /* USRQUOTA */ \
12139e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara	0x0cf524c1  /* GRPQUOTA */ \
12149e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara}
12159e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara
12169e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara#define OCFS2_LOCAL_QVERSIONS {\
12179e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara	0, \
12189e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara	0, \
12199e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara}
12209e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara
12219e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara/* Quota flags in dqinfo header */
12229e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara#define OLQF_CLEAN	0x0001	/* Quota file is empty (this should be after\
12239e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara				 * quota has been cleanly turned off) */
12249e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara
12259e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara#define OCFS2_LOCAL_INFO_OFF (sizeof(struct ocfs2_disk_dqheader))
12269e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara
12279e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara/* Information header of local quota file (immediately follows the generic
12289e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara * header) */
12299e33d69f553aaf11377307e8d6f82deb3385e351Jan Karastruct ocfs2_local_disk_dqinfo {
12309e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara	__le32 dqi_flags;	/* Flags for quota file */
12319e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara	__le32 dqi_chunks;	/* Number of chunks of quota structures
12329e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara				 * with a bitmap */
12339e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara	__le32 dqi_blocks;	/* Number of blocks allocated for quota file */
12349e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara};
12359e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara
12369e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara/* Header of one chunk of a quota file */
12379e33d69f553aaf11377307e8d6f82deb3385e351Jan Karastruct ocfs2_local_disk_chunk {
12389e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara	__le32 dqc_free;	/* Number of free entries in the bitmap */
1239936545401624217955df4dd44bb71615900e5397Coly Li	__u8 dqc_bitmap[0];	/* Bitmap of entries in the corresponding
12409e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara				 * chunk of quota file */
12419e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara};
12429e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara
12439e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara/* One entry in local quota file */
12449e33d69f553aaf11377307e8d6f82deb3385e351Jan Karastruct ocfs2_local_disk_dqblk {
12459e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara/*00*/	__le64 dqb_id;		/* id this quota applies to */
12469e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara	__le64 dqb_spacemod;	/* Change in the amount of used space */
12479e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara/*10*/	__le64 dqb_inodemod;	/* Change in the amount of used inodes */
12489e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara};
12499e33d69f553aaf11377307e8d6f82deb3385e351Jan Kara
1250ab552d54673f262d7f70014003d3928d29270f22Joel Becker
1251ab552d54673f262d7f70014003d3928d29270f22Joel Becker/*
1252ab552d54673f262d7f70014003d3928d29270f22Joel Becker * The quota trailer lives at the end of each quota block.
1253ab552d54673f262d7f70014003d3928d29270f22Joel Becker */
1254ab552d54673f262d7f70014003d3928d29270f22Joel Becker
1255ab552d54673f262d7f70014003d3928d29270f22Joel Beckerstruct ocfs2_disk_dqtrailer {
1256ab552d54673f262d7f70014003d3928d29270f22Joel Becker/*00*/	struct ocfs2_block_check dq_check;	/* Error checking */
1257ab552d54673f262d7f70014003d3928d29270f22Joel Becker/*08*/	/* Cannot be larger than OCFS2_QBLK_RESERVED_SPACE */
1258ab552d54673f262d7f70014003d3928d29270f22Joel Becker};
1259ab552d54673f262d7f70014003d3928d29270f22Joel Becker
1260ab552d54673f262d7f70014003d3928d29270f22Joel Beckerstatic inline struct ocfs2_disk_dqtrailer *ocfs2_block_dqtrailer(int blocksize,
1261ab552d54673f262d7f70014003d3928d29270f22Joel Becker								 void *buf)
1262ab552d54673f262d7f70014003d3928d29270f22Joel Becker{
1263ab552d54673f262d7f70014003d3928d29270f22Joel Becker	char *ptr = buf;
1264ab552d54673f262d7f70014003d3928d29270f22Joel Becker	ptr += blocksize - OCFS2_QBLK_RESERVED_SPACE;
1265ab552d54673f262d7f70014003d3928d29270f22Joel Becker
1266ab552d54673f262d7f70014003d3928d29270f22Joel Becker	return (struct ocfs2_disk_dqtrailer *)ptr;
1267ab552d54673f262d7f70014003d3928d29270f22Joel Becker}
1268ab552d54673f262d7f70014003d3928d29270f22Joel Becker
1269ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#ifdef __KERNEL__
1270ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fashehstatic inline int ocfs2_fast_symlink_chars(struct super_block *sb)
1271ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh{
1272ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	return  sb->s_blocksize -
1273ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh		 offsetof(struct ocfs2_dinode, id2.i_symlink);
1274ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh}
1275ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
1276fdd77704a8b4666a32120fcd1e4a9fedaf3263d8Tiger Yangstatic inline int ocfs2_max_inline_data_with_xattr(struct super_block *sb,
1277fdd77704a8b4666a32120fcd1e4a9fedaf3263d8Tiger Yang						   struct ocfs2_dinode *di)
1278fdd77704a8b4666a32120fcd1e4a9fedaf3263d8Tiger Yang{
1279fdd77704a8b4666a32120fcd1e4a9fedaf3263d8Tiger Yang	unsigned int xattrsize = le16_to_cpu(di->i_xattr_inline_size);
1280fdd77704a8b4666a32120fcd1e4a9fedaf3263d8Tiger Yang
1281fdd77704a8b4666a32120fcd1e4a9fedaf3263d8Tiger Yang	if (le16_to_cpu(di->i_dyn_features) & OCFS2_INLINE_XATTR_FL)
1282fdd77704a8b4666a32120fcd1e4a9fedaf3263d8Tiger Yang		return sb->s_blocksize -
1283fdd77704a8b4666a32120fcd1e4a9fedaf3263d8Tiger Yang			offsetof(struct ocfs2_dinode, id2.i_data.id_data) -
1284fdd77704a8b4666a32120fcd1e4a9fedaf3263d8Tiger Yang			xattrsize;
1285fdd77704a8b4666a32120fcd1e4a9fedaf3263d8Tiger Yang	else
1286fdd77704a8b4666a32120fcd1e4a9fedaf3263d8Tiger Yang		return sb->s_blocksize -
1287fdd77704a8b4666a32120fcd1e4a9fedaf3263d8Tiger Yang			offsetof(struct ocfs2_dinode, id2.i_data.id_data);
1288fdd77704a8b4666a32120fcd1e4a9fedaf3263d8Tiger Yang}
1289fdd77704a8b4666a32120fcd1e4a9fedaf3263d8Tiger Yang
1290ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fashehstatic inline int ocfs2_extent_recs_per_inode(struct super_block *sb)
1291ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh{
1292ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	int size;
1293ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
1294ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	size = sb->s_blocksize -
1295ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh		offsetof(struct ocfs2_dinode, id2.i_list.l_recs);
1296ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
1297ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	return size / sizeof(struct ocfs2_extent_rec);
1298ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh}
1299ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
1300fdd77704a8b4666a32120fcd1e4a9fedaf3263d8Tiger Yangstatic inline int ocfs2_extent_recs_per_inode_with_xattr(
1301fdd77704a8b4666a32120fcd1e4a9fedaf3263d8Tiger Yang						struct super_block *sb,
1302fdd77704a8b4666a32120fcd1e4a9fedaf3263d8Tiger Yang						struct ocfs2_dinode *di)
1303fdd77704a8b4666a32120fcd1e4a9fedaf3263d8Tiger Yang{
1304fdd77704a8b4666a32120fcd1e4a9fedaf3263d8Tiger Yang	int size;
1305fdd77704a8b4666a32120fcd1e4a9fedaf3263d8Tiger Yang	unsigned int xattrsize = le16_to_cpu(di->i_xattr_inline_size);
1306fdd77704a8b4666a32120fcd1e4a9fedaf3263d8Tiger Yang
1307fdd77704a8b4666a32120fcd1e4a9fedaf3263d8Tiger Yang	if (le16_to_cpu(di->i_dyn_features) & OCFS2_INLINE_XATTR_FL)
1308fdd77704a8b4666a32120fcd1e4a9fedaf3263d8Tiger Yang		size = sb->s_blocksize -
1309fdd77704a8b4666a32120fcd1e4a9fedaf3263d8Tiger Yang			offsetof(struct ocfs2_dinode, id2.i_list.l_recs) -
1310fdd77704a8b4666a32120fcd1e4a9fedaf3263d8Tiger Yang			xattrsize;
1311fdd77704a8b4666a32120fcd1e4a9fedaf3263d8Tiger Yang	else
1312fdd77704a8b4666a32120fcd1e4a9fedaf3263d8Tiger Yang		size = sb->s_blocksize -
1313fdd77704a8b4666a32120fcd1e4a9fedaf3263d8Tiger Yang			offsetof(struct ocfs2_dinode, id2.i_list.l_recs);
1314fdd77704a8b4666a32120fcd1e4a9fedaf3263d8Tiger Yang
1315fdd77704a8b4666a32120fcd1e4a9fedaf3263d8Tiger Yang	return size / sizeof(struct ocfs2_extent_rec);
1316fdd77704a8b4666a32120fcd1e4a9fedaf3263d8Tiger Yang}
1317fdd77704a8b4666a32120fcd1e4a9fedaf3263d8Tiger Yang
13189b7895efac906d66d19856194e1ba61f37e231a4Mark Fashehstatic inline int ocfs2_extent_recs_per_dx_root(struct super_block *sb)
13199b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh{
13209b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh	int size;
13219b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh
13229b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh	size = sb->s_blocksize -
13239b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh		offsetof(struct ocfs2_dx_root_block, dr_list.l_recs);
13249b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh
13259b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh	return size / sizeof(struct ocfs2_extent_rec);
13269b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh}
13279b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh
1328ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fashehstatic inline int ocfs2_chain_recs_per_inode(struct super_block *sb)
1329ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh{
1330ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	int size;
1331ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
1332ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	size = sb->s_blocksize -
1333ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh		offsetof(struct ocfs2_dinode, id2.i_chain.cl_recs);
1334ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
1335ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	return size / sizeof(struct ocfs2_chain_rec);
1336ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh}
1337ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
1338ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fashehstatic inline u16 ocfs2_extent_recs_per_eb(struct super_block *sb)
1339ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh{
1340ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	int size;
1341ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
1342ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	size = sb->s_blocksize -
1343ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh		offsetof(struct ocfs2_extent_block, h_list.l_recs);
1344ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
1345ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	return size / sizeof(struct ocfs2_extent_rec);
1346ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh}
1347ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
1348798db35f4649eac2778381c390ed7d12de9ec767Joel Beckerstatic inline u16 ocfs2_extent_recs_per_gd(struct super_block *sb)
1349798db35f4649eac2778381c390ed7d12de9ec767Joel Becker{
1350798db35f4649eac2778381c390ed7d12de9ec767Joel Becker	int size;
1351798db35f4649eac2778381c390ed7d12de9ec767Joel Becker
1352798db35f4649eac2778381c390ed7d12de9ec767Joel Becker	size = sb->s_blocksize -
1353798db35f4649eac2778381c390ed7d12de9ec767Joel Becker		offsetof(struct ocfs2_group_desc, bg_list.l_recs);
1354798db35f4649eac2778381c390ed7d12de9ec767Joel Becker
1355798db35f4649eac2778381c390ed7d12de9ec767Joel Becker	return size / sizeof(struct ocfs2_extent_rec);
1356798db35f4649eac2778381c390ed7d12de9ec767Joel Becker}
1357798db35f4649eac2778381c390ed7d12de9ec767Joel Becker
13589b7895efac906d66d19856194e1ba61f37e231a4Mark Fashehstatic inline int ocfs2_dx_entries_per_leaf(struct super_block *sb)
13599b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh{
13609b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh	int size;
13619b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh
13629b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh	size = sb->s_blocksize -
13639b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh		offsetof(struct ocfs2_dx_leaf, dl_list.de_entries);
13649b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh
13659b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh	return size / sizeof(struct ocfs2_dx_entry);
13669b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh}
13679b7895efac906d66d19856194e1ba61f37e231a4Mark Fasheh
13684ed8a6bb083bfcc21f1ed66a474b03c0386e4b34Mark Fashehstatic inline int ocfs2_dx_entries_per_root(struct super_block *sb)
13694ed8a6bb083bfcc21f1ed66a474b03c0386e4b34Mark Fasheh{
13704ed8a6bb083bfcc21f1ed66a474b03c0386e4b34Mark Fasheh	int size;
13714ed8a6bb083bfcc21f1ed66a474b03c0386e4b34Mark Fasheh
13724ed8a6bb083bfcc21f1ed66a474b03c0386e4b34Mark Fasheh	size = sb->s_blocksize -
13734ed8a6bb083bfcc21f1ed66a474b03c0386e4b34Mark Fasheh		offsetof(struct ocfs2_dx_root_block, dr_entries.de_entries);
13744ed8a6bb083bfcc21f1ed66a474b03c0386e4b34Mark Fasheh
13754ed8a6bb083bfcc21f1ed66a474b03c0386e4b34Mark Fasheh	return size / sizeof(struct ocfs2_dx_entry);
13764ed8a6bb083bfcc21f1ed66a474b03c0386e4b34Mark Fasheh}
13774ed8a6bb083bfcc21f1ed66a474b03c0386e4b34Mark Fasheh
1378ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fashehstatic inline u16 ocfs2_local_alloc_size(struct super_block *sb)
1379ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh{
1380ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	u16 size;
1381ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
1382ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	size = sb->s_blocksize -
1383ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh		offsetof(struct ocfs2_dinode, id2.i_lab.la_bitmap);
1384ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
1385ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	return size;
1386ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh}
1387ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
13884cbe4249d6586d5d88ef271e07302407a14c8443Joel Beckerstatic inline int ocfs2_group_bitmap_size(struct super_block *sb,
13898571882c21e5073b2f96147ec4ff9b7042339e1bTao Ma					  int suballocator,
13908571882c21e5073b2f96147ec4ff9b7042339e1bTao Ma					  u32 feature_incompat)
1391ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh{
13928571882c21e5073b2f96147ec4ff9b7042339e1bTao Ma	int size = sb->s_blocksize -
13938571882c21e5073b2f96147ec4ff9b7042339e1bTao Ma		offsetof(struct ocfs2_group_desc, bg_bitmap);
1394ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
13958571882c21e5073b2f96147ec4ff9b7042339e1bTao Ma	/*
13968571882c21e5073b2f96147ec4ff9b7042339e1bTao Ma	 * The cluster allocator uses the entire block.  Suballocators have
13978571882c21e5073b2f96147ec4ff9b7042339e1bTao Ma	 * never used more than OCFS2_MAX_BG_BITMAP_SIZE.  Unfortunately, older
13988571882c21e5073b2f96147ec4ff9b7042339e1bTao Ma	 * code expects bg_size set to the maximum.  Thus we must keep
13998571882c21e5073b2f96147ec4ff9b7042339e1bTao Ma	 * bg_size as-is unless discontig_bg is enabled.
14008571882c21e5073b2f96147ec4ff9b7042339e1bTao Ma	 */
14018571882c21e5073b2f96147ec4ff9b7042339e1bTao Ma	if (suballocator &&
14028571882c21e5073b2f96147ec4ff9b7042339e1bTao Ma	    (feature_incompat & OCFS2_FEATURE_INCOMPAT_DISCONTIG_BG))
14034cbe4249d6586d5d88ef271e07302407a14c8443Joel Becker		size = OCFS2_MAX_BG_BITMAP_SIZE;
1404ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
1405ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	return size;
1406ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh}
1407ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
1408ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fashehstatic inline int ocfs2_truncate_recs_per_inode(struct super_block *sb)
1409ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh{
1410ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	int size;
1411ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
1412ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	size = sb->s_blocksize -
1413ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh		offsetof(struct ocfs2_dinode, id2.i_dealloc.tl_recs);
1414ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
1415ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	return size / sizeof(struct ocfs2_truncate_rec);
1416ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh}
141750af94b14c98f5769860a282a397c6f3b135c8a8Mark Fasheh
141850af94b14c98f5769860a282a397c6f3b135c8a8Mark Fashehstatic inline u64 ocfs2_backup_super_blkno(struct super_block *sb, int index)
141950af94b14c98f5769860a282a397c6f3b135c8a8Mark Fasheh{
142050af94b14c98f5769860a282a397c6f3b135c8a8Mark Fasheh	u64 offset = OCFS2_BACKUP_SB_START;
142150af94b14c98f5769860a282a397c6f3b135c8a8Mark Fasheh
142250af94b14c98f5769860a282a397c6f3b135c8a8Mark Fasheh	if (index >= 0 && index < OCFS2_MAX_BACKUP_SUPERBLOCKS) {
142350af94b14c98f5769860a282a397c6f3b135c8a8Mark Fasheh		offset <<= (2 * index);
1424a8a75a20e9a854685ac3e7af2e0e32f9b0be436bMark Fasheh		offset >>= sb->s_blocksize_bits;
142550af94b14c98f5769860a282a397c6f3b135c8a8Mark Fasheh		return offset;
142650af94b14c98f5769860a282a397c6f3b135c8a8Mark Fasheh	}
142750af94b14c98f5769860a282a397c6f3b135c8a8Mark Fasheh
142850af94b14c98f5769860a282a397c6f3b135c8a8Mark Fasheh	return 0;
142950af94b14c98f5769860a282a397c6f3b135c8a8Mark Fasheh
143050af94b14c98f5769860a282a397c6f3b135c8a8Mark Fasheh}
14310c044f0b24b9128ba8c297149d88bd81f2e36af3Tao Ma
14320c044f0b24b9128ba8c297149d88bd81f2e36af3Tao Mastatic inline u16 ocfs2_xattr_recs_per_xb(struct super_block *sb)
14330c044f0b24b9128ba8c297149d88bd81f2e36af3Tao Ma{
14340c044f0b24b9128ba8c297149d88bd81f2e36af3Tao Ma	int size;
14350c044f0b24b9128ba8c297149d88bd81f2e36af3Tao Ma
14360c044f0b24b9128ba8c297149d88bd81f2e36af3Tao Ma	size = sb->s_blocksize -
14370c044f0b24b9128ba8c297149d88bd81f2e36af3Tao Ma		offsetof(struct ocfs2_xattr_block,
14380c044f0b24b9128ba8c297149d88bd81f2e36af3Tao Ma			 xb_attrs.xb_root.xt_list.l_recs);
14390c044f0b24b9128ba8c297149d88bd81f2e36af3Tao Ma
14400c044f0b24b9128ba8c297149d88bd81f2e36af3Tao Ma	return size / sizeof(struct ocfs2_extent_rec);
14410c044f0b24b9128ba8c297149d88bd81f2e36af3Tao Ma}
1442721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma
1443721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Mastatic inline u16 ocfs2_extent_recs_per_rb(struct super_block *sb)
1444721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma{
1445721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma	int size;
1446721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma
1447721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma	size = sb->s_blocksize -
1448721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma		offsetof(struct ocfs2_refcount_block, rf_list.l_recs);
1449721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma
1450721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma	return size / sizeof(struct ocfs2_extent_rec);
1451721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma}
1452721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma
1453721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Mastatic inline u16 ocfs2_refcount_recs_per_rb(struct super_block *sb)
1454721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma{
1455721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma	int size;
1456721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma
1457721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma	size = sb->s_blocksize -
1458721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma		offsetof(struct ocfs2_refcount_block, rf_records.rl_recs);
1459721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma
1460721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma	return size / sizeof(struct ocfs2_refcount_rec);
1461721f69c404c51a5d1dc93fddb48ee936e8e23770Tao Ma}
1462e73a819db9c2d6c4065b7cab7374709b6939e8f1Tao Ma
1463e73a819db9c2d6c4065b7cab7374709b6939e8f1Tao Mastatic inline u32
1464e73a819db9c2d6c4065b7cab7374709b6939e8f1Tao Maocfs2_get_ref_rec_low_cpos(const struct ocfs2_refcount_rec *rec)
1465e73a819db9c2d6c4065b7cab7374709b6939e8f1Tao Ma{
1466e73a819db9c2d6c4065b7cab7374709b6939e8f1Tao Ma	return le64_to_cpu(rec->r_cpos) & OCFS2_32BIT_POS_MASK;
1467e73a819db9c2d6c4065b7cab7374709b6939e8f1Tao Ma}
1468ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#else
1469ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fashehstatic inline int ocfs2_fast_symlink_chars(int blocksize)
1470ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh{
1471ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	return blocksize - offsetof(struct ocfs2_dinode, id2.i_symlink);
1472ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh}
1473ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
14741097df3ffe855eb1476496fa5394816fb197af05Tao Mastatic inline int ocfs2_max_inline_data_with_xattr(int blocksize,
14751097df3ffe855eb1476496fa5394816fb197af05Tao Ma						   struct ocfs2_dinode *di)
147615b1e36bdb487d67ef924a37b0967453143be53aMark Fasheh{
14771097df3ffe855eb1476496fa5394816fb197af05Tao Ma	if (di && (di->i_dyn_features & OCFS2_INLINE_XATTR_FL))
14781097df3ffe855eb1476496fa5394816fb197af05Tao Ma		return blocksize -
14791097df3ffe855eb1476496fa5394816fb197af05Tao Ma			offsetof(struct ocfs2_dinode, id2.i_data.id_data) -
14801097df3ffe855eb1476496fa5394816fb197af05Tao Ma			di->i_xattr_inline_size;
14811097df3ffe855eb1476496fa5394816fb197af05Tao Ma	else
14821097df3ffe855eb1476496fa5394816fb197af05Tao Ma		return blocksize -
14831097df3ffe855eb1476496fa5394816fb197af05Tao Ma			offsetof(struct ocfs2_dinode, id2.i_data.id_data);
148415b1e36bdb487d67ef924a37b0967453143be53aMark Fasheh}
148515b1e36bdb487d67ef924a37b0967453143be53aMark Fasheh
1486ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fashehstatic inline int ocfs2_extent_recs_per_inode(int blocksize)
1487ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh{
1488ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	int size;
1489ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
1490ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	size = blocksize -
1491ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh		offsetof(struct ocfs2_dinode, id2.i_list.l_recs);
1492ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
1493ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	return size / sizeof(struct ocfs2_extent_rec);
1494ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh}
1495ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
1496ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fashehstatic inline int ocfs2_chain_recs_per_inode(int blocksize)
1497ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh{
1498ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	int size;
1499ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
1500ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	size = blocksize -
1501ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh		offsetof(struct ocfs2_dinode, id2.i_chain.cl_recs);
1502ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
1503ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	return size / sizeof(struct ocfs2_chain_rec);
1504ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh}
1505ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
1506ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fashehstatic inline int ocfs2_extent_recs_per_eb(int blocksize)
1507ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh{
1508ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	int size;
1509ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
1510ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	size = blocksize -
1511ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh		offsetof(struct ocfs2_extent_block, h_list.l_recs);
1512ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
1513ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	return size / sizeof(struct ocfs2_extent_rec);
1514ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh}
1515ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
1516798db35f4649eac2778381c390ed7d12de9ec767Joel Beckerstatic inline int ocfs2_extent_recs_per_gd(int blocksize)
1517798db35f4649eac2778381c390ed7d12de9ec767Joel Becker{
1518798db35f4649eac2778381c390ed7d12de9ec767Joel Becker	int size;
1519798db35f4649eac2778381c390ed7d12de9ec767Joel Becker
1520798db35f4649eac2778381c390ed7d12de9ec767Joel Becker	size = blocksize -
1521798db35f4649eac2778381c390ed7d12de9ec767Joel Becker		offsetof(struct ocfs2_group_desc, bg_list.l_recs);
1522798db35f4649eac2778381c390ed7d12de9ec767Joel Becker
1523798db35f4649eac2778381c390ed7d12de9ec767Joel Becker	return size / sizeof(struct ocfs2_extent_rec);
1524798db35f4649eac2778381c390ed7d12de9ec767Joel Becker}
1525798db35f4649eac2778381c390ed7d12de9ec767Joel Becker
1526ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fashehstatic inline int ocfs2_local_alloc_size(int blocksize)
1527ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh{
1528ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	int size;
1529ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
1530ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	size = blocksize -
1531ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh		offsetof(struct ocfs2_dinode, id2.i_lab.la_bitmap);
1532ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
1533ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	return size;
1534ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh}
1535ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
15368571882c21e5073b2f96147ec4ff9b7042339e1bTao Mastatic inline int ocfs2_group_bitmap_size(int blocksize,
15378571882c21e5073b2f96147ec4ff9b7042339e1bTao Ma					  int suballocator,
15388571882c21e5073b2f96147ec4ff9b7042339e1bTao Ma					  uint32_t feature_incompat)
1539ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh{
15408571882c21e5073b2f96147ec4ff9b7042339e1bTao Ma	int size = sb->s_blocksize -
15418571882c21e5073b2f96147ec4ff9b7042339e1bTao Ma		offsetof(struct ocfs2_group_desc, bg_bitmap);
1542ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
15438571882c21e5073b2f96147ec4ff9b7042339e1bTao Ma	/*
15448571882c21e5073b2f96147ec4ff9b7042339e1bTao Ma	 * The cluster allocator uses the entire block.  Suballocators have
15458571882c21e5073b2f96147ec4ff9b7042339e1bTao Ma	 * never used more than OCFS2_MAX_BG_BITMAP_SIZE.  Unfortunately, older
15468571882c21e5073b2f96147ec4ff9b7042339e1bTao Ma	 * code expects bg_size set to the maximum.  Thus we must keep
15478571882c21e5073b2f96147ec4ff9b7042339e1bTao Ma	 * bg_size as-is unless discontig_bg is enabled.
15488571882c21e5073b2f96147ec4ff9b7042339e1bTao Ma	 */
15498571882c21e5073b2f96147ec4ff9b7042339e1bTao Ma	if (suballocator &&
15508571882c21e5073b2f96147ec4ff9b7042339e1bTao Ma	    (feature_incompat & OCFS2_FEATURE_INCOMPAT_DISCONTIG_BG))
15514cbe4249d6586d5d88ef271e07302407a14c8443Joel Becker		size = OCFS2_MAX_BG_BITMAP_SIZE;
1552ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
1553ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	return size;
1554ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh}
1555ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
1556ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fashehstatic inline int ocfs2_truncate_recs_per_inode(int blocksize)
1557ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh{
1558ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	int size;
1559ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
1560ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	size = blocksize -
1561ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh		offsetof(struct ocfs2_dinode, id2.i_dealloc.tl_recs);
1562ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
1563ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	return size / sizeof(struct ocfs2_truncate_rec);
1564ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh}
156550af94b14c98f5769860a282a397c6f3b135c8a8Mark Fasheh
156650af94b14c98f5769860a282a397c6f3b135c8a8Mark Fashehstatic inline uint64_t ocfs2_backup_super_blkno(int blocksize, int index)
156750af94b14c98f5769860a282a397c6f3b135c8a8Mark Fasheh{
156850af94b14c98f5769860a282a397c6f3b135c8a8Mark Fasheh	uint64_t offset = OCFS2_BACKUP_SB_START;
156950af94b14c98f5769860a282a397c6f3b135c8a8Mark Fasheh
157050af94b14c98f5769860a282a397c6f3b135c8a8Mark Fasheh	if (index >= 0 && index < OCFS2_MAX_BACKUP_SUPERBLOCKS) {
157150af94b14c98f5769860a282a397c6f3b135c8a8Mark Fasheh		offset <<= (2 * index);
157250af94b14c98f5769860a282a397c6f3b135c8a8Mark Fasheh		offset /= blocksize;
157350af94b14c98f5769860a282a397c6f3b135c8a8Mark Fasheh		return offset;
157450af94b14c98f5769860a282a397c6f3b135c8a8Mark Fasheh	}
157550af94b14c98f5769860a282a397c6f3b135c8a8Mark Fasheh
157650af94b14c98f5769860a282a397c6f3b135c8a8Mark Fasheh	return 0;
157750af94b14c98f5769860a282a397c6f3b135c8a8Mark Fasheh}
15780c044f0b24b9128ba8c297149d88bd81f2e36af3Tao Ma
15790c044f0b24b9128ba8c297149d88bd81f2e36af3Tao Mastatic inline int ocfs2_xattr_recs_per_xb(int blocksize)
15800c044f0b24b9128ba8c297149d88bd81f2e36af3Tao Ma{
15810c044f0b24b9128ba8c297149d88bd81f2e36af3Tao Ma	int size;
15820c044f0b24b9128ba8c297149d88bd81f2e36af3Tao Ma
15830c044f0b24b9128ba8c297149d88bd81f2e36af3Tao Ma	size = blocksize -
15840c044f0b24b9128ba8c297149d88bd81f2e36af3Tao Ma		offsetof(struct ocfs2_xattr_block,
15850c044f0b24b9128ba8c297149d88bd81f2e36af3Tao Ma			 xb_attrs.xb_root.xt_list.l_recs);
15860c044f0b24b9128ba8c297149d88bd81f2e36af3Tao Ma
15870c044f0b24b9128ba8c297149d88bd81f2e36af3Tao Ma	return size / sizeof(struct ocfs2_extent_rec);
15880c044f0b24b9128ba8c297149d88bd81f2e36af3Tao Ma}
1589ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#endif  /* __KERNEL__ */
1590ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
1591ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
1592ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fashehstatic inline int ocfs2_system_inode_is_global(int type)
1593ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh{
1594ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	return ((type >= 0) &&
1595ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh		(type <= OCFS2_LAST_GLOBAL_SYSTEM_INODE));
1596ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh}
1597ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
1598ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fashehstatic inline int ocfs2_sprintf_system_inode_name(char *buf, int len,
1599ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh						  int type, int slot)
1600ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh{
1601ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	int chars;
1602ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
1603ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh        /*
1604ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh         * Global system inodes can only have one copy.  Everything
1605ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh         * after OCFS2_LAST_GLOBAL_SYSTEM_INODE in the system inode
1606ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh         * list has a copy per slot.
1607ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh         */
1608ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	if (type <= OCFS2_LAST_GLOBAL_SYSTEM_INODE)
1609fe9f387740ac7cb3b7c2fffa76807e997e6c6292Joel Becker		chars = snprintf(buf, len, "%s",
1610ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh				 ocfs2_system_inodes[type].si_name);
1611ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	else
1612ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh		chars = snprintf(buf, len,
1613ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh				 ocfs2_system_inodes[type].si_name,
1614ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh				 slot);
1615ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
1616ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	return chars;
1617ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh}
1618ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
1619ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fashehstatic inline void ocfs2_set_de_type(struct ocfs2_dir_entry *de,
1620ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh				    umode_t mode)
1621ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh{
1622ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh	de->file_type = ocfs2_type_by_mode[(mode & S_IFMT)>>S_SHIFT];
1623ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh}
1624ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
1625af2bf0d86019e0b0306965321096f8380b7ca830Tao Mastatic inline int ocfs2_gd_is_discontig(struct ocfs2_group_desc *gd)
1626af2bf0d86019e0b0306965321096f8380b7ca830Tao Ma{
1627af2bf0d86019e0b0306965321096f8380b7ca830Tao Ma	if ((offsetof(struct ocfs2_group_desc, bg_bitmap) +
1628af2bf0d86019e0b0306965321096f8380b7ca830Tao Ma	     le16_to_cpu(gd->bg_size)) !=
1629af2bf0d86019e0b0306965321096f8380b7ca830Tao Ma	    offsetof(struct ocfs2_group_desc, bg_list))
1630af2bf0d86019e0b0306965321096f8380b7ca830Tao Ma		return 0;
1631af2bf0d86019e0b0306965321096f8380b7ca830Tao Ma	/*
1632af2bf0d86019e0b0306965321096f8380b7ca830Tao Ma	 * Only valid to check l_next_free_rec if
1633af2bf0d86019e0b0306965321096f8380b7ca830Tao Ma	 * bg_bitmap + bg_size == bg_list.
1634af2bf0d86019e0b0306965321096f8380b7ca830Tao Ma	 */
1635af2bf0d86019e0b0306965321096f8380b7ca830Tao Ma	if (!gd->bg_list.l_next_free_rec)
1636af2bf0d86019e0b0306965321096f8380b7ca830Tao Ma		return 0;
1637af2bf0d86019e0b0306965321096f8380b7ca830Tao Ma	return 1;
1638af2bf0d86019e0b0306965321096f8380b7ca830Tao Ma}
1639ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh#endif  /* _OCFS2_FS_H */
1640ccd979bdbce9fba8412beb3f1de68a9d0171b12cMark Fasheh
1641