root/include/uapi/linux/gfs2_ondisk.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


   1 /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
   2 /*
   3  * Copyright (C) Sistina Software, Inc.  1997-2003 All rights reserved.
   4  * Copyright (C) 2004-2006 Red Hat, Inc.  All rights reserved.
   5  *
   6  * This copyrighted material is made available to anyone wishing to use,
   7  * modify, copy, or redistribute it subject to the terms and conditions
   8  * of the GNU General Public License v.2.
   9  */
  10 
  11 #ifndef __GFS2_ONDISK_DOT_H__
  12 #define __GFS2_ONDISK_DOT_H__
  13 
  14 #include <linux/types.h>
  15 
  16 #define GFS2_MAGIC              0x01161970
  17 #define GFS2_BASIC_BLOCK        512
  18 #define GFS2_BASIC_BLOCK_SHIFT  9
  19 
  20 /* Lock numbers of the LM_TYPE_NONDISK type */
  21 
  22 #define GFS2_MOUNT_LOCK         0
  23 #define GFS2_LIVE_LOCK          1
  24 #define GFS2_FREEZE_LOCK        2
  25 #define GFS2_RENAME_LOCK        3
  26 #define GFS2_CONTROL_LOCK       4
  27 #define GFS2_MOUNTED_LOCK       5
  28 
  29 /* Format numbers for various metadata types */
  30 
  31 #define GFS2_FORMAT_NONE        0
  32 #define GFS2_FORMAT_SB          100
  33 #define GFS2_FORMAT_RG          200
  34 #define GFS2_FORMAT_RB          300
  35 #define GFS2_FORMAT_DI          400
  36 #define GFS2_FORMAT_IN          500
  37 #define GFS2_FORMAT_LF          600
  38 #define GFS2_FORMAT_JD          700
  39 #define GFS2_FORMAT_LH          800
  40 #define GFS2_FORMAT_LD          900
  41 #define GFS2_FORMAT_LB          1000
  42 #define GFS2_FORMAT_EA          1600
  43 #define GFS2_FORMAT_ED          1700
  44 #define GFS2_FORMAT_QC          1400
  45 /* These are format numbers for entities contained in files */
  46 #define GFS2_FORMAT_RI          1100
  47 #define GFS2_FORMAT_DE          1200
  48 #define GFS2_FORMAT_QU          1500
  49 /* These are part of the superblock */
  50 #define GFS2_FORMAT_FS          1801
  51 #define GFS2_FORMAT_MULTI       1900
  52 
  53 /*
  54  * An on-disk inode number
  55  */
  56 
  57 struct gfs2_inum {
  58         __be64 no_formal_ino;
  59         __be64 no_addr;
  60 };
  61 
  62 /*
  63  * Generic metadata head structure
  64  * Every inplace buffer logged in the journal must start with this.
  65  */
  66 
  67 #define GFS2_METATYPE_NONE      0
  68 #define GFS2_METATYPE_SB        1
  69 #define GFS2_METATYPE_RG        2
  70 #define GFS2_METATYPE_RB        3
  71 #define GFS2_METATYPE_DI        4
  72 #define GFS2_METATYPE_IN        5
  73 #define GFS2_METATYPE_LF        6
  74 #define GFS2_METATYPE_JD        7
  75 #define GFS2_METATYPE_LH        8
  76 #define GFS2_METATYPE_LD        9
  77 #define GFS2_METATYPE_LB        12
  78 #define GFS2_METATYPE_EA        10
  79 #define GFS2_METATYPE_ED        11
  80 #define GFS2_METATYPE_QC        14
  81 
  82 struct gfs2_meta_header {
  83         __be32 mh_magic;
  84         __be32 mh_type;
  85         __be64 __pad0;          /* Was generation number in gfs1 */
  86         __be32 mh_format;
  87         /* This union is to keep userspace happy */
  88         union {
  89                 __be32 mh_jid;          /* Was incarnation number in gfs1 */
  90                 __be32 __pad1;
  91         };
  92 };
  93 
  94 /*
  95  * super-block structure
  96  *
  97  * It's probably good if SIZEOF_SB <= GFS2_BASIC_BLOCK (512 bytes)
  98  *
  99  * Order is important, need to be able to read old superblocks to do on-disk
 100  * version upgrades.
 101  */
 102 
 103 /* Address of superblock in GFS2 basic blocks */
 104 #define GFS2_SB_ADDR            128
 105 
 106 /* The lock number for the superblock (must be zero) */
 107 #define GFS2_SB_LOCK            0
 108 
 109 /* Requirement:  GFS2_LOCKNAME_LEN % 8 == 0
 110    Includes: the fencing zero at the end */
 111 #define GFS2_LOCKNAME_LEN       64
 112 
 113 struct gfs2_sb {
 114         struct gfs2_meta_header sb_header;
 115 
 116         __be32 sb_fs_format;
 117         __be32 sb_multihost_format;
 118         __u32  __pad0;  /* Was superblock flags in gfs1 */
 119 
 120         __be32 sb_bsize;
 121         __be32 sb_bsize_shift;
 122         __u32 __pad1;   /* Was journal segment size in gfs1 */
 123 
 124         struct gfs2_inum sb_master_dir; /* Was jindex dinode in gfs1 */
 125         struct gfs2_inum __pad2; /* Was rindex dinode in gfs1 */
 126         struct gfs2_inum sb_root_dir;
 127 
 128         char sb_lockproto[GFS2_LOCKNAME_LEN];
 129         char sb_locktable[GFS2_LOCKNAME_LEN];
 130 
 131         struct gfs2_inum __pad3; /* Was quota inode in gfs1 */
 132         struct gfs2_inum __pad4; /* Was licence inode in gfs1 */
 133 #define GFS2_HAS_UUID 1
 134         __u8 sb_uuid[16]; /* The UUID, maybe 0 for backwards compat */
 135 };
 136 
 137 /*
 138  * resource index structure
 139  */
 140 
 141 struct gfs2_rindex {
 142         __be64 ri_addr; /* grp block disk address */
 143         __be32 ri_length;       /* length of rgrp header in fs blocks */
 144         __u32 __pad;
 145 
 146         __be64 ri_data0;        /* first data location */
 147         __be32 ri_data; /* num of data blocks in rgrp */
 148 
 149         __be32 ri_bitbytes;     /* number of bytes in data bitmaps */
 150 
 151         __u8 ri_reserved[64];
 152 };
 153 
 154 /*
 155  * resource group header structure
 156  */
 157 
 158 /* Number of blocks per byte in rgrp */
 159 #define GFS2_NBBY               4
 160 #define GFS2_BIT_SIZE           2
 161 #define GFS2_BIT_MASK           0x00000003
 162 
 163 #define GFS2_BLKST_FREE         0
 164 #define GFS2_BLKST_USED         1
 165 #define GFS2_BLKST_UNLINKED     2
 166 #define GFS2_BLKST_DINODE       3
 167 
 168 #define GFS2_RGF_JOURNAL        0x00000001
 169 #define GFS2_RGF_METAONLY       0x00000002
 170 #define GFS2_RGF_DATAONLY       0x00000004
 171 #define GFS2_RGF_NOALLOC        0x00000008
 172 #define GFS2_RGF_TRIMMED        0x00000010
 173 
 174 struct gfs2_rgrp_lvb {
 175         __be32 rl_magic;
 176         __be32 rl_flags;
 177         __be32 rl_free;
 178         __be32 rl_dinodes;
 179         __be64 rl_igeneration;
 180         __be32 rl_unlinked;
 181         __be32 __pad;
 182 };
 183 
 184 struct gfs2_rgrp {
 185         struct gfs2_meta_header rg_header;
 186 
 187         __be32 rg_flags;
 188         __be32 rg_free;
 189         __be32 rg_dinodes;
 190         union {
 191                 __be32 __pad;
 192                 __be32 rg_skip; /* Distance to the next rgrp in fs blocks */
 193         };
 194         __be64 rg_igeneration;
 195         /* The following 3 fields are duplicated from gfs2_rindex to reduce
 196            reliance on the rindex */
 197         __be64 rg_data0;     /* First data location */
 198         __be32 rg_data;      /* Number of data blocks in rgrp */
 199         __be32 rg_bitbytes;  /* Number of bytes in data bitmaps */
 200         __be32 rg_crc;       /* crc32 of the structure with this field 0 */
 201 
 202         __u8 rg_reserved[60]; /* Several fields from gfs1 now reserved */
 203 };
 204 
 205 /*
 206  * quota structure
 207  */
 208 
 209 struct gfs2_quota {
 210         __be64 qu_limit;
 211         __be64 qu_warn;
 212         __be64 qu_value;
 213         __u8 qu_reserved[64];
 214 };
 215 
 216 /*
 217  * dinode structure
 218  */
 219 
 220 #define GFS2_MAX_META_HEIGHT    10
 221 #define GFS2_DIR_MAX_DEPTH      17
 222 
 223 #define DT2IF(dt) (((dt) << 12) & S_IFMT)
 224 #define IF2DT(sif) (((sif) & S_IFMT) >> 12)
 225 
 226 enum {
 227         gfs2fl_Jdata            = 0,
 228         gfs2fl_ExHash           = 1,
 229         gfs2fl_Unused           = 2,
 230         gfs2fl_EaIndirect       = 3,
 231         gfs2fl_Directio         = 4,
 232         gfs2fl_Immutable        = 5,
 233         gfs2fl_AppendOnly       = 6,
 234         gfs2fl_NoAtime          = 7,
 235         gfs2fl_Sync             = 8,
 236         gfs2fl_System           = 9,
 237         gfs2fl_TopLevel         = 10,
 238         gfs2fl_TruncInProg      = 29,
 239         gfs2fl_InheritDirectio  = 30,
 240         gfs2fl_InheritJdata     = 31,
 241 };
 242 
 243 /* Dinode flags */
 244 #define GFS2_DIF_JDATA                  0x00000001
 245 #define GFS2_DIF_EXHASH                 0x00000002
 246 #define GFS2_DIF_UNUSED                 0x00000004  /* only in gfs1 */
 247 #define GFS2_DIF_EA_INDIRECT            0x00000008
 248 #define GFS2_DIF_DIRECTIO               0x00000010
 249 #define GFS2_DIF_IMMUTABLE              0x00000020
 250 #define GFS2_DIF_APPENDONLY             0x00000040
 251 #define GFS2_DIF_NOATIME                0x00000080
 252 #define GFS2_DIF_SYNC                   0x00000100
 253 #define GFS2_DIF_SYSTEM                 0x00000200 /* New in gfs2 */
 254 #define GFS2_DIF_TOPDIR                 0x00000400 /* New in gfs2 */
 255 #define GFS2_DIF_TRUNC_IN_PROG          0x20000000 /* New in gfs2 */
 256 #define GFS2_DIF_INHERIT_DIRECTIO       0x40000000 /* only in gfs1 */
 257 #define GFS2_DIF_INHERIT_JDATA          0x80000000
 258 
 259 struct gfs2_dinode {
 260         struct gfs2_meta_header di_header;
 261 
 262         struct gfs2_inum di_num;
 263 
 264         __be32 di_mode; /* mode of file */
 265         __be32 di_uid;  /* owner's user id */
 266         __be32 di_gid;  /* owner's group id */
 267         __be32 di_nlink;        /* number of links to this file */
 268         __be64 di_size; /* number of bytes in file */
 269         __be64 di_blocks;       /* number of blocks in file */
 270         __be64 di_atime;        /* time last accessed */
 271         __be64 di_mtime;        /* time last modified */
 272         __be64 di_ctime;        /* time last changed */
 273         __be32 di_major;        /* device major number */
 274         __be32 di_minor;        /* device minor number */
 275 
 276         /* This section varies from gfs1. Padding added to align with
 277          * remainder of dinode
 278          */
 279         __be64 di_goal_meta;    /* rgrp to alloc from next */
 280         __be64 di_goal_data;    /* data block goal */
 281         __be64 di_generation;   /* generation number for NFS */
 282 
 283         __be32 di_flags;        /* GFS2_DIF_... */
 284         __be32 di_payload_format;  /* GFS2_FORMAT_... */
 285         __u16 __pad1;   /* Was ditype in gfs1 */
 286         __be16 di_height;       /* height of metadata */
 287         __u32 __pad2;   /* Unused incarnation number from gfs1 */
 288 
 289         /* These only apply to directories  */
 290         __u16 __pad3;   /* Padding */
 291         __be16 di_depth;        /* Number of bits in the table */
 292         __be32 di_entries;      /* The number of entries in the directory */
 293 
 294         struct gfs2_inum __pad4; /* Unused even in current gfs1 */
 295 
 296         __be64 di_eattr;        /* extended attribute block number */
 297         __be32 di_atime_nsec;   /* nsec portion of atime */
 298         __be32 di_mtime_nsec;   /* nsec portion of mtime */
 299         __be32 di_ctime_nsec;   /* nsec portion of ctime */
 300 
 301         __u8 di_reserved[44];
 302 };
 303 
 304 /*
 305  * directory structure - many of these per directory file
 306  */
 307 
 308 #define GFS2_FNAMESIZE          255
 309 #define GFS2_DIRENT_SIZE(name_len) ((sizeof(struct gfs2_dirent) + (name_len) + 7) & ~7)
 310 #define GFS2_MIN_DIRENT_SIZE (GFS2_DIRENT_SIZE(1))
 311 
 312 
 313 struct gfs2_dirent {
 314         struct gfs2_inum de_inum;
 315         __be32 de_hash;
 316         __be16 de_rec_len;
 317         __be16 de_name_len;
 318         __be16 de_type;
 319         __be16 de_rahead;
 320         union {
 321                 __u8 __pad[12];
 322                 struct {
 323                         __u32 de_cookie; /* ondisk value not used */
 324                         __u8 pad3[8];
 325                 };
 326         };
 327 };
 328 
 329 /*
 330  * Header of leaf directory nodes
 331  */
 332 
 333 struct gfs2_leaf {
 334         struct gfs2_meta_header lf_header;
 335 
 336         __be16 lf_depth;                /* Depth of leaf */
 337         __be16 lf_entries;              /* Number of dirents in leaf */
 338         __be32 lf_dirent_format;        /* Format of the dirents */
 339         __be64 lf_next;                 /* Next leaf, if overflow */
 340 
 341         union {
 342                 __u8 lf_reserved[64];
 343                 struct {
 344                         __be64 lf_inode;        /* Dir inode number */
 345                         __be32 lf_dist;         /* Dist from inode on chain */
 346                         __be32 lf_nsec;         /* Last ins/del usecs */
 347                         __be64 lf_sec;          /* Last ins/del in secs */
 348                         __u8 lf_reserved2[40];
 349                 };
 350         };
 351 };
 352 
 353 /*
 354  * Extended attribute header format
 355  *
 356  * This works in a similar way to dirents. There is a fixed size header
 357  * followed by a variable length section made up of the name and the
 358  * associated data. In the case of a "stuffed" entry, the value is
 359  * inline directly after the name, the ea_num_ptrs entry will be
 360  * zero in that case. For non-"stuffed" entries, there will be
 361  * a set of pointers (aligned to 8 byte boundary) to the block(s)
 362  * containing the value.
 363  *
 364  * The blocks containing the values and the blocks containing the
 365  * extended attribute headers themselves all start with the common
 366  * metadata header. Each inode, if it has extended attributes, will
 367  * have either a single block containing the extended attribute headers
 368  * or a single indirect block pointing to blocks containing the
 369  * extended attribute headers.
 370  *
 371  * The maximum size of the data part of an extended attribute is 64k
 372  * so the number of blocks required depends upon block size. Since the
 373  * block size also determines the number of pointers in an indirect
 374  * block, its a fairly complicated calculation to work out the maximum
 375  * number of blocks that an inode may have relating to extended attributes.
 376  *
 377  */
 378 
 379 #define GFS2_EA_MAX_NAME_LEN    255
 380 #define GFS2_EA_MAX_DATA_LEN    65536
 381 
 382 #define GFS2_EATYPE_UNUSED      0
 383 #define GFS2_EATYPE_USR         1
 384 #define GFS2_EATYPE_SYS         2
 385 #define GFS2_EATYPE_SECURITY    3
 386 
 387 #define GFS2_EATYPE_LAST        3
 388 #define GFS2_EATYPE_VALID(x)    ((x) <= GFS2_EATYPE_LAST)
 389 
 390 #define GFS2_EAFLAG_LAST        0x01    /* last ea in block */
 391 
 392 struct gfs2_ea_header {
 393         __be32 ea_rec_len;
 394         __be32 ea_data_len;
 395         __u8 ea_name_len;       /* no NULL pointer after the string */
 396         __u8 ea_type;           /* GFS2_EATYPE_... */
 397         __u8 ea_flags;          /* GFS2_EAFLAG_... */
 398         __u8 ea_num_ptrs;
 399         __u32 __pad;
 400 };
 401 
 402 /*
 403  * Log header structure
 404  */
 405 
 406 #define GFS2_LOG_HEAD_UNMOUNT           0x00000001 /* log is clean */
 407 #define GFS2_LOG_HEAD_FLUSH_NORMAL      0x00000002 /* normal log flush */
 408 #define GFS2_LOG_HEAD_FLUSH_SYNC        0x00000004 /* Sync log flush */
 409 #define GFS2_LOG_HEAD_FLUSH_SHUTDOWN    0x00000008 /* Shutdown log flush */
 410 #define GFS2_LOG_HEAD_FLUSH_FREEZE      0x00000010 /* Freeze flush */
 411 #define GFS2_LOG_HEAD_RECOVERY          0x00000020 /* Journal recovery */
 412 #define GFS2_LOG_HEAD_USERSPACE         0x80000000 /* Written by gfs2-utils */
 413 
 414 /* Log flush callers */
 415 #define GFS2_LFC_SHUTDOWN               0x00000100
 416 #define GFS2_LFC_JDATA_WPAGES           0x00000200
 417 #define GFS2_LFC_SET_FLAGS              0x00000400
 418 #define GFS2_LFC_AIL_EMPTY_GL           0x00000800
 419 #define GFS2_LFC_AIL_FLUSH              0x00001000
 420 #define GFS2_LFC_RGRP_GO_SYNC           0x00002000
 421 #define GFS2_LFC_INODE_GO_SYNC          0x00004000
 422 #define GFS2_LFC_INODE_GO_INVAL         0x00008000
 423 #define GFS2_LFC_FREEZE_GO_SYNC         0x00010000
 424 #define GFS2_LFC_KILL_SB                0x00020000
 425 #define GFS2_LFC_DO_SYNC                0x00040000
 426 #define GFS2_LFC_INPLACE_RESERVE        0x00080000
 427 #define GFS2_LFC_WRITE_INODE            0x00100000
 428 #define GFS2_LFC_MAKE_FS_RO             0x00200000
 429 #define GFS2_LFC_SYNC_FS                0x00400000
 430 #define GFS2_LFC_EVICT_INODE            0x00800000
 431 #define GFS2_LFC_TRANS_END              0x01000000
 432 #define GFS2_LFC_LOGD_JFLUSH_REQD       0x02000000
 433 #define GFS2_LFC_LOGD_AIL_FLUSH_REQD    0x04000000
 434 
 435 #define LH_V1_SIZE (offsetofend(struct gfs2_log_header, lh_hash))
 436 
 437 struct gfs2_log_header {
 438         struct gfs2_meta_header lh_header;
 439 
 440         __be64 lh_sequence;     /* Sequence number of this transaction */
 441         __be32 lh_flags;        /* GFS2_LOG_HEAD_... */
 442         __be32 lh_tail;         /* Block number of log tail */
 443         __be32 lh_blkno;
 444         __be32 lh_hash;         /* crc up to here with this field 0 */
 445 
 446         /* Version 2 additional fields start here */
 447         __be32 lh_crc;          /* crc32c from lh_nsec to end of block */
 448         __be32 lh_nsec;         /* Nanoseconds of timestamp */
 449         __be64 lh_sec;          /* Seconds of timestamp */
 450         __be64 lh_addr;         /* Block addr of this log header (absolute) */
 451         __be64 lh_jinode;       /* Journal inode number */
 452         __be64 lh_statfs_addr;  /* Local statfs inode number */
 453         __be64 lh_quota_addr;   /* Local quota change inode number */
 454 
 455         /* Statfs local changes (i.e. diff from global statfs) */
 456         __be64 lh_local_total;
 457         __be64 lh_local_free;
 458         __be64 lh_local_dinodes;
 459 };
 460 
 461 /*
 462  * Log type descriptor
 463  */
 464 
 465 #define GFS2_LOG_DESC_METADATA  300
 466 /* ld_data1 is the number of metadata blocks in the descriptor.
 467    ld_data2 is unused. */
 468 
 469 #define GFS2_LOG_DESC_REVOKE    301
 470 /* ld_data1 is the number of revoke blocks in the descriptor.
 471    ld_data2 is unused. */
 472 
 473 #define GFS2_LOG_DESC_JDATA     302
 474 /* ld_data1 is the number of data blocks in the descriptor.
 475    ld_data2 is unused. */
 476 
 477 struct gfs2_log_descriptor {
 478         struct gfs2_meta_header ld_header;
 479 
 480         __be32 ld_type;         /* GFS2_LOG_DESC_... */
 481         __be32 ld_length;       /* Number of buffers in this chunk */
 482         __be32 ld_data1;        /* descriptor-specific field */
 483         __be32 ld_data2;        /* descriptor-specific field */
 484 
 485         __u8 ld_reserved[32];
 486 };
 487 
 488 /*
 489  * Inum Range
 490  * Describe a range of formal inode numbers allocated to
 491  * one machine to assign to inodes.
 492  */
 493 
 494 #define GFS2_INUM_QUANTUM       1048576
 495 
 496 struct gfs2_inum_range {
 497         __be64 ir_start;
 498         __be64 ir_length;
 499 };
 500 
 501 /*
 502  * Statfs change
 503  * Describes an change to the pool of free and allocated
 504  * blocks.
 505  */
 506 
 507 struct gfs2_statfs_change {
 508         __be64 sc_total;
 509         __be64 sc_free;
 510         __be64 sc_dinodes;
 511 };
 512 
 513 /*
 514  * Quota change
 515  * Describes an allocation change for a particular
 516  * user or group.
 517  */
 518 
 519 #define GFS2_QCF_USER           0x00000001
 520 
 521 struct gfs2_quota_change {
 522         __be64 qc_change;
 523         __be32 qc_flags;        /* GFS2_QCF_... */
 524         __be32 qc_id;
 525 };
 526 
 527 struct gfs2_quota_lvb {
 528         __be32 qb_magic;
 529         __u32 __pad;
 530         __be64 qb_limit;      /* Hard limit of # blocks to alloc */
 531         __be64 qb_warn;       /* Warn user when alloc is above this # */
 532         __be64 qb_value;       /* Current # blocks allocated */
 533 };
 534 
 535 #endif /* __GFS2_ONDISK_DOT_H__ */

/* [<][>][^][v][top][bottom][index][help] */