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