1/* 2 * Copyright 2001-2017, Axel D��rfler, axeld@pinc-software.de. 3 * Copyright 2020, Shubham Bhagat, shubhambhagat111@yahoo.com 4 * All rights reserved. Distributed under the terms of the MIT License. 5 */ 6 7/* 8 *Important: 9 *All fields in XFS metadata structures are in big-endian byte order 10 *except for log items which are formatted in host order. 11 * 12 *This file contains all global structure definitions. 13 */ 14#ifndef _XFS_SB_H_ 15#define _XFS_SB_H_ 16 17 18#include "system_dependencies.h" 19#include "xfs_types.h" 20 21 22extern fs_vnode_ops gxfsVnodeOps; 23extern fs_volume_ops gxfsVolumeOps; 24 25 26#define XFS_SB_MAGIC 0x58465342 27#define XFS_MIN_BLOCKSIZE_LOG 9 28#define XFS_MAX_BLOCKSIZE_LOG 16 29#define XFS_MIN_BLOCKSIZE (1 << XFS_MIN_BLOCKSIZE_LOG) 30#define XFS_MAX_BLOCKSIZE (1 << XFS_MAX_BLOCKSIZE_LOG) 31#define XFS_MIN_CRC_BLOCKSIZE (1 << (XFS_MIN_BLOCKSIZE_LOG + 1)) 32#define XFS_MIN_SECTORSIZE_LOG 9 33#define XFS_MAX_SECTORSIZE_LOG 15 34#define XFS_MIN_SECTORSIZE (1 << XFS_MIN_SECTORSIZE_LOG) 35#define XFS_MAX_SECTORSIZE (1 << XFS_MAX_SECTORSIZE_LOG) 36#define XFS_SB_MAXSIZE 512 37 38 39#define XFS_OPEN_MODE_USER_MASK 0x7fffffff 40#define XFS_SB_VERSION_NUMBITS 0x000f 41#define XFS_SB_VERSION_ALLFBITS 0xfff0 42 43 44/* B+Tree related macros 45*/ 46#define XFS_BMAP_MAGIC 0x424d4150 47#define XFS_BMAP_CRC_MAGIC 0x424d4133 48#define MAX_TREE_DEPTH 5 49#define XFS_KEY_SIZE sizeof(xfs_fileoff_t) 50#define XFS_PTR_SIZE sizeof(xfs_fsblock_t) 51 52 53struct file_cookie { 54 bigtime_t last_notification; 55 off_t last_size; 56 int open_mode; 57}; 58 59 60class XfsSuperBlock { 61public: 62 63 bool IsValid() const; 64 bool IsValidVersion() const; 65 bool IsValidFeatureMask() const; 66 bool IsVersion5() const; 67 bool XfsHasIncompatFeature() const; 68 bool UuidEquals(const uuid_t& u1); 69 const char* Name() const; 70 uint32 BlockSize() const; 71 uint8 BlockLog() const; 72 uint32 DirBlockSize() const; 73 // maximum 65536 74 uint32 DirBlockLog() const; 75 uint8 AgInodeBits() const; 76 uint8 InodesPerBlkLog() const; 77 uint8 AgBlocksLog() const; 78 xfs_rfsblock_t TotalBlocks() const; 79 xfs_rfsblock_t TotalBlocksWithLog() const; 80 uint64 FreeBlocks() const; 81 uint64 UsedBlocks() const; 82 uint32 Size() const; 83 uint16 InodeSize() const; 84 void SwapEndian(); 85 xfs_ino_t Root() const; 86 xfs_agnumber_t AgCount() const; 87 xfs_agblock_t AgBlocks() const; 88 uint8 Flags() const; 89 uint16 Version() const; 90 uint32 Features2() const; 91 uint32 Crc() const; 92 uint32 MagicNum() const; 93 static size_t Offset_crc() 94 { return offsetof(XfsSuperBlock, sb_crc);} 95private: 96 97 uint32 sb_magicnum; 98 uint32 sb_blocksize; 99 xfs_rfsblock_t sb_dblocks; 100 xfs_rfsblock_t sb_rblocks; 101 xfs_rtblock_t sb_rextents; 102 uuid_t sb_uuid; 103 xfs_fsblock_t sb_logstart; 104 xfs_ino_t sb_rootino; 105 xfs_ino_t sb_rbmino; 106 xfs_ino_t sb_rsumino; 107 xfs_agblock_t sb_rextsize; 108 xfs_agblock_t sb_agblocks; 109 xfs_agnumber_t sb_agcount; 110 xfs_extlen_t sb_rbmblocks; 111 xfs_extlen_t sb_logblocks; 112 uint16 sb_versionnum; 113 uint16 sb_sectsize; 114 uint16 sb_inodesize; 115 uint16 sb_inopblock; 116 char sb_fname[12]; 117 uint8 sb_blocklog; 118 uint8 sb_sectlog; 119 uint8 sb_inodelog; 120 uint8 sb_inopblog; 121 uint8 sb_agblklog; 122 uint8 sb_rextslog; 123 uint8 sb_inprogress; 124 uint8 sb_imax_pct; 125 uint64 sb_icount; 126 uint64 sb_ifree; 127 uint64 sb_fdblocks; 128 uint64 sb_frextents; 129 xfs_ino_t sb_uquotino; 130 xfs_ino_t sb_gquotino; 131 uint16 sb_qflags; 132 uint8 sb_flags; 133 uint8 sb_shared_vn; 134 xfs_extlen_t sb_inoalignmt; 135 uint32 sb_unit; 136 uint32 sb_width; 137 uint8 sb_dirblklog; 138 uint8 sb_logsectlog; 139 uint16 sb_logsectsize; 140 uint32 sb_logsunit; 141 uint32 sb_features2; 142 uint32 sb_bad_features2; 143 144 // version 5 145 146 uint32 sb_features_compat; 147 uint32 sb_features_ro_compat; 148 uint32 sb_features_incompat; 149 uint32 sb_features_log_incompat; 150 uint32 sb_crc; 151private: 152 xfs_extlen_t sb_spino_align; 153 154 xfs_ino_t sb_pquotino; 155 xfs_lsn_t sb_lsn; 156 uuid_t sb_meta_uuid; 157}; 158 159 160/* 161*These flags indicate features introduced over time. 162* 163*If the lower nibble of sb_versionnum >=4 then the following features are 164*checked. If it's equal to 5, it's version 5. 165*/ 166 167 168#define XFS_SB_VERSION_SHAREDBIT 0x0200 169#define XFS_SB_VERSION_EXTFLGBIT 0x1000 170#define XFS_SB_VERSION_DIRV2BIT 0x2000 171#define XFS_SB_VERSION_MOREBITSBIT 0x4000 172 173#define XFS_SB_VERSION_OKBITS \ 174 ((XFS_SB_VERSION_NUMBITS | XFS_SB_VERSION_ALLFBITS) & \ 175 ~XFS_SB_VERSION_SHAREDBIT) 176 177 178/* 179Superblock quota flags - sb_qflags 180*/ 181#define XFS_OQUOTA_ENFD 0x0010 182#define XFS_OQUOTA_CHKD 0x0020 183#define XFS_GQUOTA_ENFD 0x0080 184#define XFS_GQUOTA_CHKD 0x0100 185#define XFS_PQUOTA_ENFD 0x0200 186#define XFS_PQUOTA_CHKD 0x0400 187 188 189/* 190 Extended v4 Superblock flags - sb_features2 191*/ 192 193#define XFS_SB_VERSION2_LAZYSBCOUNTBIT 0x00000001 194 // update global free space and inode on clean unmount 195#define XFS_SB_VERSION2_ATTR2BIT 0x00000002 196 // optimises the inode layout of ext-attr 197#define XFS_SB_VERSION2_PROJID32BIT 0x00000080 /* 32-bit project id */ 198#define XFS_SB_VERSION2_FTYPE 0x00000200 199 200#define XFS_SB_VERSION2_OKBITS \ 201 (XFS_SB_VERSION2_LAZYSBCOUNTBIT | \ 202 XFS_SB_VERSION2_ATTR2BIT | \ 203 XFS_SB_VERSION2_PROJID32BIT | \ 204 XFS_SB_VERSION2_FTYPE) 205 206/* 207 Extended Version 5 Superblock Read-Only compatibility flags 208*/ 209 210#define XFS_SB_FEAT_RO_COMPAT_FINOBT (1 << 0) /* free inode btree */ 211#define XFS_SB_FEAT_RO_COMPAT_RMAPBT (1 << 1) /* reverse map btree */ 212#define XFS_SB_FEAT_RO_COMPAT_REFLINK (1 << 2) /* reflinked files */ 213#define XFS_SB_FEAT_RO_COMPAT_INOBTCNT (1 << 3) /* inobt block counts */ 214 215/* 216 Extended Version 5 Superblock Read-Write incompatibility flags 217*/ 218 219#define XFS_SB_FEAT_INCOMPAT_FTYPE (1 << 0) /* filetype in dirent */ 220#define XFS_SB_FEAT_INCOMPAT_SPINODES (1 << 1) /* sparse inode chunks */ 221#define XFS_SB_FEAT_INCOMPAT_META_UUID (1 << 2) /* metadata UUID */ 222#define XFS_SB_FEAT_INCOMPAT_BIGTIME (1 << 3) /* large timestamps */ 223 224/* 225 Extended v5 superblock feature masks. These are to be used for new v5 226 superblock features only. 227*/ 228 229#define XFS_SB_FEAT_COMPAT_ALL 0 230#define XFS_SB_FEAT_COMPAT_UNKNOWN ~XFS_SB_FEAT_COMPAT_ALL 231 232#define XFS_SB_FEAT_RO_COMPAT_ALL \ 233 (XFS_SB_FEAT_RO_COMPAT_FINOBT | \ 234 XFS_SB_FEAT_RO_COMPAT_RMAPBT | \ 235 XFS_SB_FEAT_RO_COMPAT_REFLINK| \ 236 XFS_SB_FEAT_RO_COMPAT_INOBTCNT) 237#define XFS_SB_FEAT_RO_COMPAT_UNKNOWN ~XFS_SB_FEAT_RO_COMPAT_ALL 238 239#define XFS_SB_FEAT_INCOMPAT_ALL \ 240 (XFS_SB_FEAT_INCOMPAT_FTYPE| \ 241 XFS_SB_FEAT_INCOMPAT_SPINODES| \ 242 XFS_SB_FEAT_INCOMPAT_META_UUID| \ 243 XFS_SB_FEAT_INCOMPAT_BIGTIME) 244 245#define XFS_SB_FEAT_INCOMPAT_UNKNOWN ~XFS_SB_FEAT_INCOMPAT_ALL 246 247#endif