1*53ee8cc1Swenshuai.xi /* 2*53ee8cc1Swenshuai.xi * Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved. 3*53ee8cc1Swenshuai.xi * Copyright (C) 2004-2006 Red Hat, Inc. All rights reserved. 4*53ee8cc1Swenshuai.xi * 5*53ee8cc1Swenshuai.xi * This copyrighted material is made available to anyone wishing to use, 6*53ee8cc1Swenshuai.xi * modify, copy, or redistribute it subject to the terms and conditions 7*53ee8cc1Swenshuai.xi * of the GNU General Public License v.2. 8*53ee8cc1Swenshuai.xi */ 9*53ee8cc1Swenshuai.xi 10*53ee8cc1Swenshuai.xi #ifndef __GFS2_ONDISK_DOT_H__ 11*53ee8cc1Swenshuai.xi #define __GFS2_ONDISK_DOT_H__ 12*53ee8cc1Swenshuai.xi 13*53ee8cc1Swenshuai.xi #define GFS2_MAGIC 0x01161970 14*53ee8cc1Swenshuai.xi #define GFS2_BASIC_BLOCK 512 15*53ee8cc1Swenshuai.xi #define GFS2_BASIC_BLOCK_SHIFT 9 16*53ee8cc1Swenshuai.xi 17*53ee8cc1Swenshuai.xi /* Lock numbers of the LM_TYPE_NONDISK type */ 18*53ee8cc1Swenshuai.xi 19*53ee8cc1Swenshuai.xi #define GFS2_MOUNT_LOCK 0 20*53ee8cc1Swenshuai.xi #define GFS2_LIVE_LOCK 1 21*53ee8cc1Swenshuai.xi #define GFS2_TRANS_LOCK 2 22*53ee8cc1Swenshuai.xi #define GFS2_RENAME_LOCK 3 23*53ee8cc1Swenshuai.xi 24*53ee8cc1Swenshuai.xi /* Format numbers for various metadata types */ 25*53ee8cc1Swenshuai.xi 26*53ee8cc1Swenshuai.xi #define GFS2_FORMAT_NONE 0 27*53ee8cc1Swenshuai.xi #define GFS2_FORMAT_SB 100 28*53ee8cc1Swenshuai.xi #define GFS2_FORMAT_RG 200 29*53ee8cc1Swenshuai.xi #define GFS2_FORMAT_RB 300 30*53ee8cc1Swenshuai.xi #define GFS2_FORMAT_DI 400 31*53ee8cc1Swenshuai.xi #define GFS2_FORMAT_IN 500 32*53ee8cc1Swenshuai.xi #define GFS2_FORMAT_LF 600 33*53ee8cc1Swenshuai.xi #define GFS2_FORMAT_JD 700 34*53ee8cc1Swenshuai.xi #define GFS2_FORMAT_LH 800 35*53ee8cc1Swenshuai.xi #define GFS2_FORMAT_LD 900 36*53ee8cc1Swenshuai.xi #define GFS2_FORMAT_LB 1000 37*53ee8cc1Swenshuai.xi #define GFS2_FORMAT_EA 1600 38*53ee8cc1Swenshuai.xi #define GFS2_FORMAT_ED 1700 39*53ee8cc1Swenshuai.xi #define GFS2_FORMAT_QC 1400 40*53ee8cc1Swenshuai.xi /* These are format numbers for entities contained in files */ 41*53ee8cc1Swenshuai.xi #define GFS2_FORMAT_RI 1100 42*53ee8cc1Swenshuai.xi #define GFS2_FORMAT_DE 1200 43*53ee8cc1Swenshuai.xi #define GFS2_FORMAT_QU 1500 44*53ee8cc1Swenshuai.xi /* These are part of the superblock */ 45*53ee8cc1Swenshuai.xi #define GFS2_FORMAT_FS 1801 46*53ee8cc1Swenshuai.xi #define GFS2_FORMAT_MULTI 1900 47*53ee8cc1Swenshuai.xi 48*53ee8cc1Swenshuai.xi /* 49*53ee8cc1Swenshuai.xi * An on-disk inode number 50*53ee8cc1Swenshuai.xi */ 51*53ee8cc1Swenshuai.xi 52*53ee8cc1Swenshuai.xi struct gfs2_inum { 53*53ee8cc1Swenshuai.xi __be64 no_formal_ino; 54*53ee8cc1Swenshuai.xi __be64 no_addr; 55*53ee8cc1Swenshuai.xi }; 56*53ee8cc1Swenshuai.xi 57*53ee8cc1Swenshuai.xi /* 58*53ee8cc1Swenshuai.xi * Generic metadata head structure 59*53ee8cc1Swenshuai.xi * Every inplace buffer logged in the journal must start with this. 60*53ee8cc1Swenshuai.xi */ 61*53ee8cc1Swenshuai.xi 62*53ee8cc1Swenshuai.xi #define GFS2_METATYPE_NONE 0 63*53ee8cc1Swenshuai.xi #define GFS2_METATYPE_SB 1 64*53ee8cc1Swenshuai.xi #define GFS2_METATYPE_RG 2 65*53ee8cc1Swenshuai.xi #define GFS2_METATYPE_RB 3 66*53ee8cc1Swenshuai.xi #define GFS2_METATYPE_DI 4 67*53ee8cc1Swenshuai.xi #define GFS2_METATYPE_IN 5 68*53ee8cc1Swenshuai.xi #define GFS2_METATYPE_LF 6 69*53ee8cc1Swenshuai.xi #define GFS2_METATYPE_JD 7 70*53ee8cc1Swenshuai.xi #define GFS2_METATYPE_LH 8 71*53ee8cc1Swenshuai.xi #define GFS2_METATYPE_LD 9 72*53ee8cc1Swenshuai.xi #define GFS2_METATYPE_LB 12 73*53ee8cc1Swenshuai.xi #define GFS2_METATYPE_EA 10 74*53ee8cc1Swenshuai.xi #define GFS2_METATYPE_ED 11 75*53ee8cc1Swenshuai.xi #define GFS2_METATYPE_QC 14 76*53ee8cc1Swenshuai.xi 77*53ee8cc1Swenshuai.xi struct gfs2_meta_header { 78*53ee8cc1Swenshuai.xi __be32 mh_magic; 79*53ee8cc1Swenshuai.xi __be32 mh_type; 80*53ee8cc1Swenshuai.xi __be64 __pad0; /* Was generation number in gfs1 */ 81*53ee8cc1Swenshuai.xi __be32 mh_format; 82*53ee8cc1Swenshuai.xi __be32 __pad1; /* Was incarnation number in gfs1 */ 83*53ee8cc1Swenshuai.xi }; 84*53ee8cc1Swenshuai.xi 85*53ee8cc1Swenshuai.xi /* 86*53ee8cc1Swenshuai.xi * super-block structure 87*53ee8cc1Swenshuai.xi * 88*53ee8cc1Swenshuai.xi * It's probably good if SIZEOF_SB <= GFS2_BASIC_BLOCK (512 bytes) 89*53ee8cc1Swenshuai.xi * 90*53ee8cc1Swenshuai.xi * Order is important, need to be able to read old superblocks to do on-disk 91*53ee8cc1Swenshuai.xi * version upgrades. 92*53ee8cc1Swenshuai.xi */ 93*53ee8cc1Swenshuai.xi 94*53ee8cc1Swenshuai.xi /* Address of superblock in GFS2 basic blocks */ 95*53ee8cc1Swenshuai.xi #define GFS2_SB_ADDR 128 96*53ee8cc1Swenshuai.xi 97*53ee8cc1Swenshuai.xi /* The lock number for the superblock (must be zero) */ 98*53ee8cc1Swenshuai.xi #define GFS2_SB_LOCK 0 99*53ee8cc1Swenshuai.xi 100*53ee8cc1Swenshuai.xi /* Requirement: GFS2_LOCKNAME_LEN % 8 == 0 101*53ee8cc1Swenshuai.xi Includes: the fencing zero at the end */ 102*53ee8cc1Swenshuai.xi #define GFS2_LOCKNAME_LEN 64 103*53ee8cc1Swenshuai.xi 104*53ee8cc1Swenshuai.xi struct gfs2_sb { 105*53ee8cc1Swenshuai.xi struct gfs2_meta_header sb_header; 106*53ee8cc1Swenshuai.xi 107*53ee8cc1Swenshuai.xi __be32 sb_fs_format; 108*53ee8cc1Swenshuai.xi __be32 sb_multihost_format; 109*53ee8cc1Swenshuai.xi __u32 __pad0; /* Was superblock flags in gfs1 */ 110*53ee8cc1Swenshuai.xi 111*53ee8cc1Swenshuai.xi __be32 sb_bsize; 112*53ee8cc1Swenshuai.xi __be32 sb_bsize_shift; 113*53ee8cc1Swenshuai.xi __u32 __pad1; /* Was journal segment size in gfs1 */ 114*53ee8cc1Swenshuai.xi 115*53ee8cc1Swenshuai.xi struct gfs2_inum sb_master_dir; /* Was jindex dinode in gfs1 */ 116*53ee8cc1Swenshuai.xi struct gfs2_inum __pad2; /* Was rindex dinode in gfs1 */ 117*53ee8cc1Swenshuai.xi struct gfs2_inum sb_root_dir; 118*53ee8cc1Swenshuai.xi 119*53ee8cc1Swenshuai.xi char sb_lockproto[GFS2_LOCKNAME_LEN]; 120*53ee8cc1Swenshuai.xi char sb_locktable[GFS2_LOCKNAME_LEN]; 121*53ee8cc1Swenshuai.xi /* In gfs1, quota and license dinodes followed */ 122*53ee8cc1Swenshuai.xi }; 123*53ee8cc1Swenshuai.xi 124*53ee8cc1Swenshuai.xi /* 125*53ee8cc1Swenshuai.xi * resource index structure 126*53ee8cc1Swenshuai.xi */ 127*53ee8cc1Swenshuai.xi 128*53ee8cc1Swenshuai.xi struct gfs2_rindex { 129*53ee8cc1Swenshuai.xi __be64 ri_addr; /* grp block disk address */ 130*53ee8cc1Swenshuai.xi __be32 ri_length; /* length of rgrp header in fs blocks */ 131*53ee8cc1Swenshuai.xi __u32 __pad; 132*53ee8cc1Swenshuai.xi 133*53ee8cc1Swenshuai.xi __be64 ri_data0; /* first data location */ 134*53ee8cc1Swenshuai.xi __be32 ri_data; /* num of data blocks in rgrp */ 135*53ee8cc1Swenshuai.xi 136*53ee8cc1Swenshuai.xi __be32 ri_bitbytes; /* number of bytes in data bitmaps */ 137*53ee8cc1Swenshuai.xi 138*53ee8cc1Swenshuai.xi __u8 ri_reserved[64]; 139*53ee8cc1Swenshuai.xi }; 140*53ee8cc1Swenshuai.xi 141*53ee8cc1Swenshuai.xi /* 142*53ee8cc1Swenshuai.xi * resource group header structure 143*53ee8cc1Swenshuai.xi */ 144*53ee8cc1Swenshuai.xi 145*53ee8cc1Swenshuai.xi /* Number of blocks per byte in rgrp */ 146*53ee8cc1Swenshuai.xi #define GFS2_NBBY 4 147*53ee8cc1Swenshuai.xi #define GFS2_BIT_SIZE 2 148*53ee8cc1Swenshuai.xi #define GFS2_BIT_MASK 0x00000003 149*53ee8cc1Swenshuai.xi 150*53ee8cc1Swenshuai.xi #define GFS2_BLKST_FREE 0 151*53ee8cc1Swenshuai.xi #define GFS2_BLKST_USED 1 152*53ee8cc1Swenshuai.xi #define GFS2_BLKST_UNLINKED 2 153*53ee8cc1Swenshuai.xi #define GFS2_BLKST_DINODE 3 154*53ee8cc1Swenshuai.xi 155*53ee8cc1Swenshuai.xi #define GFS2_RGF_JOURNAL 0x00000001 156*53ee8cc1Swenshuai.xi #define GFS2_RGF_METAONLY 0x00000002 157*53ee8cc1Swenshuai.xi #define GFS2_RGF_DATAONLY 0x00000004 158*53ee8cc1Swenshuai.xi #define GFS2_RGF_NOALLOC 0x00000008 159*53ee8cc1Swenshuai.xi 160*53ee8cc1Swenshuai.xi struct gfs2_rgrp { 161*53ee8cc1Swenshuai.xi struct gfs2_meta_header rg_header; 162*53ee8cc1Swenshuai.xi 163*53ee8cc1Swenshuai.xi __be32 rg_flags; 164*53ee8cc1Swenshuai.xi __be32 rg_free; 165*53ee8cc1Swenshuai.xi __be32 rg_dinodes; 166*53ee8cc1Swenshuai.xi __be32 __pad; 167*53ee8cc1Swenshuai.xi __be64 rg_igeneration; 168*53ee8cc1Swenshuai.xi 169*53ee8cc1Swenshuai.xi __u8 rg_reserved[80]; /* Several fields from gfs1 now reserved */ 170*53ee8cc1Swenshuai.xi }; 171*53ee8cc1Swenshuai.xi 172*53ee8cc1Swenshuai.xi /* 173*53ee8cc1Swenshuai.xi * quota linked list: user quotas and group quotas form two separate 174*53ee8cc1Swenshuai.xi * singly linked lists. ll_next stores uids or gids of next quotas in the 175*53ee8cc1Swenshuai.xi * linked list. 176*53ee8cc1Swenshuai.xi 177*53ee8cc1Swenshuai.xi Given the uid/gid, how to calculate the quota file offsets for the corresponding 178*53ee8cc1Swenshuai.xi gfs2_quota structures on disk: 179*53ee8cc1Swenshuai.xi 180*53ee8cc1Swenshuai.xi for user quotas, given uid, 181*53ee8cc1Swenshuai.xi offset = uid * sizeof(struct gfs2_quota); 182*53ee8cc1Swenshuai.xi 183*53ee8cc1Swenshuai.xi for group quotas, given gid, 184*53ee8cc1Swenshuai.xi offset = (gid * sizeof(struct gfs2_quota)) + sizeof(struct gfs2_quota); 185*53ee8cc1Swenshuai.xi 186*53ee8cc1Swenshuai.xi 187*53ee8cc1Swenshuai.xi uid:0 gid:0 uid:12 gid:12 uid:17 gid:17 uid:5142 gid:5142 188*53ee8cc1Swenshuai.xi +-------+-------+ +-------+-------+ +-------+- - - -+ +- - - -+-------+ 189*53ee8cc1Swenshuai.xi | valid | valid | :: | valid | valid | :: | valid | inval | :: | inval | valid | 190*53ee8cc1Swenshuai.xi +-------+-------+ +-------+-------+ +-------+- - - -+ +- - - -+-------+ 191*53ee8cc1Swenshuai.xi next:12 next:12 next:17 next:5142 next:NULL next:NULL 192*53ee8cc1Swenshuai.xi | | | | |<-- user quota list | 193*53ee8cc1Swenshuai.xi \______|___________/ \______|___________/ group quota list -->| 194*53ee8cc1Swenshuai.xi | | | 195*53ee8cc1Swenshuai.xi \__________________/ \_______________________________________/ 196*53ee8cc1Swenshuai.xi 197*53ee8cc1Swenshuai.xi */ 198*53ee8cc1Swenshuai.xi 199*53ee8cc1Swenshuai.xi /* 200*53ee8cc1Swenshuai.xi * quota structure 201*53ee8cc1Swenshuai.xi */ 202*53ee8cc1Swenshuai.xi 203*53ee8cc1Swenshuai.xi struct gfs2_quota { 204*53ee8cc1Swenshuai.xi __be64 qu_limit; 205*53ee8cc1Swenshuai.xi __be64 qu_warn; 206*53ee8cc1Swenshuai.xi __be64 qu_value; 207*53ee8cc1Swenshuai.xi __be32 qu_ll_next; /* location of next quota in list */ 208*53ee8cc1Swenshuai.xi __u8 qu_reserved[60]; 209*53ee8cc1Swenshuai.xi }; 210*53ee8cc1Swenshuai.xi 211*53ee8cc1Swenshuai.xi /* 212*53ee8cc1Swenshuai.xi * dinode structure 213*53ee8cc1Swenshuai.xi */ 214*53ee8cc1Swenshuai.xi 215*53ee8cc1Swenshuai.xi #define GFS2_MAX_META_HEIGHT 10 216*53ee8cc1Swenshuai.xi #define GFS2_DIR_MAX_DEPTH 17 217*53ee8cc1Swenshuai.xi 218*53ee8cc1Swenshuai.xi #define DT2IF(dt) (((dt) << 12) & S_IFMT) 219*53ee8cc1Swenshuai.xi #define IF2DT(sif) (((sif) & S_IFMT) >> 12) 220*53ee8cc1Swenshuai.xi 221*53ee8cc1Swenshuai.xi enum { 222*53ee8cc1Swenshuai.xi gfs2fl_Jdata = 0, 223*53ee8cc1Swenshuai.xi gfs2fl_ExHash = 1, 224*53ee8cc1Swenshuai.xi gfs2fl_Unused = 2, 225*53ee8cc1Swenshuai.xi gfs2fl_EaIndirect = 3, 226*53ee8cc1Swenshuai.xi gfs2fl_Directio = 4, 227*53ee8cc1Swenshuai.xi gfs2fl_Immutable = 5, 228*53ee8cc1Swenshuai.xi gfs2fl_AppendOnly = 6, 229*53ee8cc1Swenshuai.xi gfs2fl_NoAtime = 7, 230*53ee8cc1Swenshuai.xi gfs2fl_Sync = 8, 231*53ee8cc1Swenshuai.xi gfs2fl_System = 9, 232*53ee8cc1Swenshuai.xi gfs2fl_TruncInProg = 29, 233*53ee8cc1Swenshuai.xi gfs2fl_InheritDirectio = 30, 234*53ee8cc1Swenshuai.xi gfs2fl_InheritJdata = 31, 235*53ee8cc1Swenshuai.xi }; 236*53ee8cc1Swenshuai.xi 237*53ee8cc1Swenshuai.xi /* Dinode flags */ 238*53ee8cc1Swenshuai.xi #define GFS2_DIF_JDATA 0x00000001 239*53ee8cc1Swenshuai.xi #define GFS2_DIF_EXHASH 0x00000002 240*53ee8cc1Swenshuai.xi #define GFS2_DIF_UNUSED 0x00000004 /* only in gfs1 */ 241*53ee8cc1Swenshuai.xi #define GFS2_DIF_EA_INDIRECT 0x00000008 242*53ee8cc1Swenshuai.xi #define GFS2_DIF_DIRECTIO 0x00000010 243*53ee8cc1Swenshuai.xi #define GFS2_DIF_IMMUTABLE 0x00000020 244*53ee8cc1Swenshuai.xi #define GFS2_DIF_APPENDONLY 0x00000040 245*53ee8cc1Swenshuai.xi #define GFS2_DIF_NOATIME 0x00000080 246*53ee8cc1Swenshuai.xi #define GFS2_DIF_SYNC 0x00000100 247*53ee8cc1Swenshuai.xi #define GFS2_DIF_SYSTEM 0x00000200 /* New in gfs2 */ 248*53ee8cc1Swenshuai.xi #define GFS2_DIF_TRUNC_IN_PROG 0x20000000 /* New in gfs2 */ 249*53ee8cc1Swenshuai.xi #define GFS2_DIF_INHERIT_DIRECTIO 0x40000000 250*53ee8cc1Swenshuai.xi #define GFS2_DIF_INHERIT_JDATA 0x80000000 251*53ee8cc1Swenshuai.xi 252*53ee8cc1Swenshuai.xi struct gfs2_dinode { 253*53ee8cc1Swenshuai.xi struct gfs2_meta_header di_header; 254*53ee8cc1Swenshuai.xi 255*53ee8cc1Swenshuai.xi struct gfs2_inum di_num; 256*53ee8cc1Swenshuai.xi 257*53ee8cc1Swenshuai.xi __be32 di_mode; /* mode of file */ 258*53ee8cc1Swenshuai.xi __be32 di_uid; /* owner's user id */ 259*53ee8cc1Swenshuai.xi __be32 di_gid; /* owner's group id */ 260*53ee8cc1Swenshuai.xi __be32 di_nlink; /* number of links to this file */ 261*53ee8cc1Swenshuai.xi __be64 di_size; /* number of bytes in file */ 262*53ee8cc1Swenshuai.xi __be64 di_blocks; /* number of blocks in file */ 263*53ee8cc1Swenshuai.xi __be64 di_atime; /* time last accessed */ 264*53ee8cc1Swenshuai.xi __be64 di_mtime; /* time last modified */ 265*53ee8cc1Swenshuai.xi __be64 di_ctime; /* time last changed */ 266*53ee8cc1Swenshuai.xi __be32 di_major; /* device major number */ 267*53ee8cc1Swenshuai.xi __be32 di_minor; /* device minor number */ 268*53ee8cc1Swenshuai.xi 269*53ee8cc1Swenshuai.xi /* This section varies from gfs1. Padding added to align with 270*53ee8cc1Swenshuai.xi * remainder of dinode 271*53ee8cc1Swenshuai.xi */ 272*53ee8cc1Swenshuai.xi __be64 di_goal_meta; /* rgrp to alloc from next */ 273*53ee8cc1Swenshuai.xi __be64 di_goal_data; /* data block goal */ 274*53ee8cc1Swenshuai.xi __be64 di_generation; /* generation number for NFS */ 275*53ee8cc1Swenshuai.xi 276*53ee8cc1Swenshuai.xi __be32 di_flags; /* GFS2_DIF_... */ 277*53ee8cc1Swenshuai.xi __be32 di_payload_format; /* GFS2_FORMAT_... */ 278*53ee8cc1Swenshuai.xi __u16 __pad1; /* Was ditype in gfs1 */ 279*53ee8cc1Swenshuai.xi __be16 di_height; /* height of metadata */ 280*53ee8cc1Swenshuai.xi __u32 __pad2; /* Unused incarnation number from gfs1 */ 281*53ee8cc1Swenshuai.xi 282*53ee8cc1Swenshuai.xi /* These only apply to directories */ 283*53ee8cc1Swenshuai.xi __u16 __pad3; /* Padding */ 284*53ee8cc1Swenshuai.xi __be16 di_depth; /* Number of bits in the table */ 285*53ee8cc1Swenshuai.xi __be32 di_entries; /* The number of entries in the directory */ 286*53ee8cc1Swenshuai.xi 287*53ee8cc1Swenshuai.xi struct gfs2_inum __pad4; /* Unused even in current gfs1 */ 288*53ee8cc1Swenshuai.xi 289*53ee8cc1Swenshuai.xi __be64 di_eattr; /* extended attribute block number */ 290*53ee8cc1Swenshuai.xi __be32 di_atime_nsec; /* nsec portion of atime */ 291*53ee8cc1Swenshuai.xi __be32 di_mtime_nsec; /* nsec portion of mtime */ 292*53ee8cc1Swenshuai.xi __be32 di_ctime_nsec; /* nsec portion of ctime */ 293*53ee8cc1Swenshuai.xi 294*53ee8cc1Swenshuai.xi __u8 di_reserved[44]; 295*53ee8cc1Swenshuai.xi }; 296*53ee8cc1Swenshuai.xi 297*53ee8cc1Swenshuai.xi /* 298*53ee8cc1Swenshuai.xi * directory structure - many of these per directory file 299*53ee8cc1Swenshuai.xi */ 300*53ee8cc1Swenshuai.xi 301*53ee8cc1Swenshuai.xi #define GFS2_FNAMESIZE 255 302*53ee8cc1Swenshuai.xi #define GFS2_DIRENT_SIZE(name_len) ((sizeof(struct gfs2_dirent) + (name_len) + 7) & ~7) 303*53ee8cc1Swenshuai.xi 304*53ee8cc1Swenshuai.xi struct gfs2_dirent { 305*53ee8cc1Swenshuai.xi struct gfs2_inum de_inum; 306*53ee8cc1Swenshuai.xi __be32 de_hash; 307*53ee8cc1Swenshuai.xi __be16 de_rec_len; 308*53ee8cc1Swenshuai.xi __be16 de_name_len; 309*53ee8cc1Swenshuai.xi __be16 de_type; 310*53ee8cc1Swenshuai.xi __u8 __pad[14]; 311*53ee8cc1Swenshuai.xi }; 312*53ee8cc1Swenshuai.xi 313*53ee8cc1Swenshuai.xi /* 314*53ee8cc1Swenshuai.xi * Header of leaf directory nodes 315*53ee8cc1Swenshuai.xi */ 316*53ee8cc1Swenshuai.xi 317*53ee8cc1Swenshuai.xi struct gfs2_leaf { 318*53ee8cc1Swenshuai.xi struct gfs2_meta_header lf_header; 319*53ee8cc1Swenshuai.xi 320*53ee8cc1Swenshuai.xi __be16 lf_depth; /* Depth of leaf */ 321*53ee8cc1Swenshuai.xi __be16 lf_entries; /* Number of dirents in leaf */ 322*53ee8cc1Swenshuai.xi __be32 lf_dirent_format; /* Format of the dirents */ 323*53ee8cc1Swenshuai.xi __be64 lf_next; /* Next leaf, if overflow */ 324*53ee8cc1Swenshuai.xi 325*53ee8cc1Swenshuai.xi __u8 lf_reserved[64]; 326*53ee8cc1Swenshuai.xi }; 327*53ee8cc1Swenshuai.xi 328*53ee8cc1Swenshuai.xi /* 329*53ee8cc1Swenshuai.xi * Extended attribute header format 330*53ee8cc1Swenshuai.xi */ 331*53ee8cc1Swenshuai.xi 332*53ee8cc1Swenshuai.xi #define GFS2_EA_MAX_NAME_LEN 255 333*53ee8cc1Swenshuai.xi #define GFS2_EA_MAX_DATA_LEN 65536 334*53ee8cc1Swenshuai.xi 335*53ee8cc1Swenshuai.xi #define GFS2_EATYPE_UNUSED 0 336*53ee8cc1Swenshuai.xi #define GFS2_EATYPE_USR 1 337*53ee8cc1Swenshuai.xi #define GFS2_EATYPE_SYS 2 338*53ee8cc1Swenshuai.xi #define GFS2_EATYPE_SECURITY 3 339*53ee8cc1Swenshuai.xi 340*53ee8cc1Swenshuai.xi #define GFS2_EATYPE_LAST 3 341*53ee8cc1Swenshuai.xi #define GFS2_EATYPE_VALID(x) ((x) <= GFS2_EATYPE_LAST) 342*53ee8cc1Swenshuai.xi 343*53ee8cc1Swenshuai.xi #define GFS2_EAFLAG_LAST 0x01 /* last ea in block */ 344*53ee8cc1Swenshuai.xi 345*53ee8cc1Swenshuai.xi struct gfs2_ea_header { 346*53ee8cc1Swenshuai.xi __be32 ea_rec_len; 347*53ee8cc1Swenshuai.xi __be32 ea_data_len; 348*53ee8cc1Swenshuai.xi __u8 ea_name_len; /* no NULL pointer after the string */ 349*53ee8cc1Swenshuai.xi __u8 ea_type; /* GFS2_EATYPE_... */ 350*53ee8cc1Swenshuai.xi __u8 ea_flags; /* GFS2_EAFLAG_... */ 351*53ee8cc1Swenshuai.xi __u8 ea_num_ptrs; 352*53ee8cc1Swenshuai.xi __u32 __pad; 353*53ee8cc1Swenshuai.xi }; 354*53ee8cc1Swenshuai.xi 355*53ee8cc1Swenshuai.xi /* 356*53ee8cc1Swenshuai.xi * Log header structure 357*53ee8cc1Swenshuai.xi */ 358*53ee8cc1Swenshuai.xi 359*53ee8cc1Swenshuai.xi #define GFS2_LOG_HEAD_UNMOUNT 0x00000001 /* log is clean */ 360*53ee8cc1Swenshuai.xi 361*53ee8cc1Swenshuai.xi struct gfs2_log_header { 362*53ee8cc1Swenshuai.xi struct gfs2_meta_header lh_header; 363*53ee8cc1Swenshuai.xi 364*53ee8cc1Swenshuai.xi __be64 lh_sequence; /* Sequence number of this transaction */ 365*53ee8cc1Swenshuai.xi __be32 lh_flags; /* GFS2_LOG_HEAD_... */ 366*53ee8cc1Swenshuai.xi __be32 lh_tail; /* Block number of log tail */ 367*53ee8cc1Swenshuai.xi __be32 lh_blkno; 368*53ee8cc1Swenshuai.xi __be32 lh_hash; 369*53ee8cc1Swenshuai.xi }; 370*53ee8cc1Swenshuai.xi 371*53ee8cc1Swenshuai.xi /* 372*53ee8cc1Swenshuai.xi * Log type descriptor 373*53ee8cc1Swenshuai.xi */ 374*53ee8cc1Swenshuai.xi 375*53ee8cc1Swenshuai.xi #define GFS2_LOG_DESC_METADATA 300 376*53ee8cc1Swenshuai.xi /* ld_data1 is the number of metadata blocks in the descriptor. 377*53ee8cc1Swenshuai.xi ld_data2 is unused. */ 378*53ee8cc1Swenshuai.xi 379*53ee8cc1Swenshuai.xi #define GFS2_LOG_DESC_REVOKE 301 380*53ee8cc1Swenshuai.xi /* ld_data1 is the number of revoke blocks in the descriptor. 381*53ee8cc1Swenshuai.xi ld_data2 is unused. */ 382*53ee8cc1Swenshuai.xi 383*53ee8cc1Swenshuai.xi #define GFS2_LOG_DESC_JDATA 302 384*53ee8cc1Swenshuai.xi /* ld_data1 is the number of data blocks in the descriptor. 385*53ee8cc1Swenshuai.xi ld_data2 is unused. */ 386*53ee8cc1Swenshuai.xi 387*53ee8cc1Swenshuai.xi struct gfs2_log_descriptor { 388*53ee8cc1Swenshuai.xi struct gfs2_meta_header ld_header; 389*53ee8cc1Swenshuai.xi 390*53ee8cc1Swenshuai.xi __be32 ld_type; /* GFS2_LOG_DESC_... */ 391*53ee8cc1Swenshuai.xi __be32 ld_length; /* Number of buffers in this chunk */ 392*53ee8cc1Swenshuai.xi __be32 ld_data1; /* descriptor-specific field */ 393*53ee8cc1Swenshuai.xi __be32 ld_data2; /* descriptor-specific field */ 394*53ee8cc1Swenshuai.xi 395*53ee8cc1Swenshuai.xi __u8 ld_reserved[32]; 396*53ee8cc1Swenshuai.xi }; 397*53ee8cc1Swenshuai.xi 398*53ee8cc1Swenshuai.xi /* 399*53ee8cc1Swenshuai.xi * Inum Range 400*53ee8cc1Swenshuai.xi * Describe a range of formal inode numbers allocated to 401*53ee8cc1Swenshuai.xi * one machine to assign to inodes. 402*53ee8cc1Swenshuai.xi */ 403*53ee8cc1Swenshuai.xi 404*53ee8cc1Swenshuai.xi #define GFS2_INUM_QUANTUM 1048576 405*53ee8cc1Swenshuai.xi 406*53ee8cc1Swenshuai.xi struct gfs2_inum_range { 407*53ee8cc1Swenshuai.xi __be64 ir_start; 408*53ee8cc1Swenshuai.xi __be64 ir_length; 409*53ee8cc1Swenshuai.xi }; 410*53ee8cc1Swenshuai.xi 411*53ee8cc1Swenshuai.xi /* 412*53ee8cc1Swenshuai.xi * Statfs change 413*53ee8cc1Swenshuai.xi * Describes an change to the pool of free and allocated 414*53ee8cc1Swenshuai.xi * blocks. 415*53ee8cc1Swenshuai.xi */ 416*53ee8cc1Swenshuai.xi 417*53ee8cc1Swenshuai.xi struct gfs2_statfs_change { 418*53ee8cc1Swenshuai.xi __be64 sc_total; 419*53ee8cc1Swenshuai.xi __be64 sc_free; 420*53ee8cc1Swenshuai.xi __be64 sc_dinodes; 421*53ee8cc1Swenshuai.xi }; 422*53ee8cc1Swenshuai.xi 423*53ee8cc1Swenshuai.xi /* 424*53ee8cc1Swenshuai.xi * Quota change 425*53ee8cc1Swenshuai.xi * Describes an allocation change for a particular 426*53ee8cc1Swenshuai.xi * user or group. 427*53ee8cc1Swenshuai.xi */ 428*53ee8cc1Swenshuai.xi 429*53ee8cc1Swenshuai.xi #define GFS2_QCF_USER 0x00000001 430*53ee8cc1Swenshuai.xi 431*53ee8cc1Swenshuai.xi struct gfs2_quota_change { 432*53ee8cc1Swenshuai.xi __be64 qc_change; 433*53ee8cc1Swenshuai.xi __be32 qc_flags; /* GFS2_QCF_... */ 434*53ee8cc1Swenshuai.xi __be32 qc_id; 435*53ee8cc1Swenshuai.xi }; 436*53ee8cc1Swenshuai.xi 437*53ee8cc1Swenshuai.xi struct gfs2_quota_lvb { 438*53ee8cc1Swenshuai.xi __be32 qb_magic; 439*53ee8cc1Swenshuai.xi __u32 __pad; 440*53ee8cc1Swenshuai.xi __be64 qb_limit; /* Hard limit of # blocks to alloc */ 441*53ee8cc1Swenshuai.xi __be64 qb_warn; /* Warn user when alloc is above this # */ 442*53ee8cc1Swenshuai.xi __be64 qb_value; /* Current # blocks allocated */ 443*53ee8cc1Swenshuai.xi }; 444*53ee8cc1Swenshuai.xi 445*53ee8cc1Swenshuai.xi #endif /* __GFS2_ONDISK_DOT_H__ */ 446