162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (C) Sistina Software, Inc.  1997-2003 All rights reserved.
462306a36Sopenharmony_ci * Copyright (C) 2004-2006 Red Hat, Inc.  All rights reserved.
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci * This copyrighted material is made available to anyone wishing to use,
762306a36Sopenharmony_ci * modify, copy, or redistribute it subject to the terms and conditions
862306a36Sopenharmony_ci * of the GNU General Public License v.2.
962306a36Sopenharmony_ci */
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#ifndef __GFS2_ONDISK_DOT_H__
1262306a36Sopenharmony_ci#define __GFS2_ONDISK_DOT_H__
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#include <linux/types.h>
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci#define GFS2_MAGIC		0x01161970
1762306a36Sopenharmony_ci#define GFS2_BASIC_BLOCK	512
1862306a36Sopenharmony_ci#define GFS2_BASIC_BLOCK_SHIFT	9
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci/* Lock numbers of the LM_TYPE_NONDISK type */
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci#define GFS2_MOUNT_LOCK		0
2362306a36Sopenharmony_ci#define GFS2_LIVE_LOCK		1
2462306a36Sopenharmony_ci#define GFS2_FREEZE_LOCK	2
2562306a36Sopenharmony_ci#define GFS2_RENAME_LOCK	3
2662306a36Sopenharmony_ci#define GFS2_CONTROL_LOCK	4
2762306a36Sopenharmony_ci#define GFS2_MOUNTED_LOCK	5
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci/* Format numbers for various metadata types */
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci#define GFS2_FORMAT_NONE	0
3262306a36Sopenharmony_ci#define GFS2_FORMAT_SB		100
3362306a36Sopenharmony_ci#define GFS2_FORMAT_RG		200
3462306a36Sopenharmony_ci#define GFS2_FORMAT_RB		300
3562306a36Sopenharmony_ci#define GFS2_FORMAT_DI		400
3662306a36Sopenharmony_ci#define GFS2_FORMAT_IN		500
3762306a36Sopenharmony_ci#define GFS2_FORMAT_LF		600
3862306a36Sopenharmony_ci#define GFS2_FORMAT_JD		700
3962306a36Sopenharmony_ci#define GFS2_FORMAT_LH		800
4062306a36Sopenharmony_ci#define GFS2_FORMAT_LD		900
4162306a36Sopenharmony_ci#define GFS2_FORMAT_LB		1000
4262306a36Sopenharmony_ci#define GFS2_FORMAT_EA		1600
4362306a36Sopenharmony_ci#define GFS2_FORMAT_ED		1700
4462306a36Sopenharmony_ci#define GFS2_FORMAT_QC		1400
4562306a36Sopenharmony_ci/* These are format numbers for entities contained in files */
4662306a36Sopenharmony_ci#define GFS2_FORMAT_RI		1100
4762306a36Sopenharmony_ci#define GFS2_FORMAT_DE		1200
4862306a36Sopenharmony_ci#define GFS2_FORMAT_QU		1500
4962306a36Sopenharmony_ci/* These are part of the superblock */
5062306a36Sopenharmony_ci#define GFS2_FORMAT_FS		1802
5162306a36Sopenharmony_ci#define GFS2_FORMAT_MULTI	1900
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci/*
5462306a36Sopenharmony_ci * An on-disk inode number
5562306a36Sopenharmony_ci */
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_cistruct gfs2_inum {
5862306a36Sopenharmony_ci	__be64 no_formal_ino;
5962306a36Sopenharmony_ci	__be64 no_addr;
6062306a36Sopenharmony_ci};
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci/*
6362306a36Sopenharmony_ci * Generic metadata head structure
6462306a36Sopenharmony_ci * Every inplace buffer logged in the journal must start with this.
6562306a36Sopenharmony_ci */
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ci#define GFS2_METATYPE_NONE	0
6862306a36Sopenharmony_ci#define GFS2_METATYPE_SB	1
6962306a36Sopenharmony_ci#define GFS2_METATYPE_RG	2
7062306a36Sopenharmony_ci#define GFS2_METATYPE_RB	3
7162306a36Sopenharmony_ci#define GFS2_METATYPE_DI	4
7262306a36Sopenharmony_ci#define GFS2_METATYPE_IN	5
7362306a36Sopenharmony_ci#define GFS2_METATYPE_LF	6
7462306a36Sopenharmony_ci#define GFS2_METATYPE_JD	7
7562306a36Sopenharmony_ci#define GFS2_METATYPE_LH	8
7662306a36Sopenharmony_ci#define GFS2_METATYPE_LD	9
7762306a36Sopenharmony_ci#define GFS2_METATYPE_LB	12
7862306a36Sopenharmony_ci#define GFS2_METATYPE_EA	10
7962306a36Sopenharmony_ci#define GFS2_METATYPE_ED	11
8062306a36Sopenharmony_ci#define GFS2_METATYPE_QC	14
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_cistruct gfs2_meta_header {
8362306a36Sopenharmony_ci	__be32 mh_magic;
8462306a36Sopenharmony_ci	__be32 mh_type;
8562306a36Sopenharmony_ci	__be64 __pad0;		/* Was generation number in gfs1 */
8662306a36Sopenharmony_ci	__be32 mh_format;
8762306a36Sopenharmony_ci	/* This union is to keep userspace happy */
8862306a36Sopenharmony_ci	union {
8962306a36Sopenharmony_ci		__be32 mh_jid;		/* Was incarnation number in gfs1 */
9062306a36Sopenharmony_ci		__be32 __pad1;
9162306a36Sopenharmony_ci	};
9262306a36Sopenharmony_ci};
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_ci/*
9562306a36Sopenharmony_ci * super-block structure
9662306a36Sopenharmony_ci *
9762306a36Sopenharmony_ci * It's probably good if SIZEOF_SB <= GFS2_BASIC_BLOCK (512 bytes)
9862306a36Sopenharmony_ci *
9962306a36Sopenharmony_ci * Order is important, need to be able to read old superblocks to do on-disk
10062306a36Sopenharmony_ci * version upgrades.
10162306a36Sopenharmony_ci */
10262306a36Sopenharmony_ci
10362306a36Sopenharmony_ci/* Address of superblock in GFS2 basic blocks */
10462306a36Sopenharmony_ci#define GFS2_SB_ADDR		128
10562306a36Sopenharmony_ci
10662306a36Sopenharmony_ci/* The lock number for the superblock (must be zero) */
10762306a36Sopenharmony_ci#define GFS2_SB_LOCK		0
10862306a36Sopenharmony_ci
10962306a36Sopenharmony_ci/* Requirement:  GFS2_LOCKNAME_LEN % 8 == 0
11062306a36Sopenharmony_ci   Includes: the fencing zero at the end */
11162306a36Sopenharmony_ci#define GFS2_LOCKNAME_LEN	64
11262306a36Sopenharmony_ci
11362306a36Sopenharmony_cistruct gfs2_sb {
11462306a36Sopenharmony_ci	struct gfs2_meta_header sb_header;
11562306a36Sopenharmony_ci
11662306a36Sopenharmony_ci	__be32 sb_fs_format;
11762306a36Sopenharmony_ci	__be32 sb_multihost_format;
11862306a36Sopenharmony_ci	__u32  __pad0;	/* Was superblock flags in gfs1 */
11962306a36Sopenharmony_ci
12062306a36Sopenharmony_ci	__be32 sb_bsize;
12162306a36Sopenharmony_ci	__be32 sb_bsize_shift;
12262306a36Sopenharmony_ci	__u32 __pad1;	/* Was journal segment size in gfs1 */
12362306a36Sopenharmony_ci
12462306a36Sopenharmony_ci	struct gfs2_inum sb_master_dir; /* Was jindex dinode in gfs1 */
12562306a36Sopenharmony_ci	struct gfs2_inum __pad2; /* Was rindex dinode in gfs1 */
12662306a36Sopenharmony_ci	struct gfs2_inum sb_root_dir;
12762306a36Sopenharmony_ci
12862306a36Sopenharmony_ci	char sb_lockproto[GFS2_LOCKNAME_LEN];
12962306a36Sopenharmony_ci	char sb_locktable[GFS2_LOCKNAME_LEN];
13062306a36Sopenharmony_ci
13162306a36Sopenharmony_ci	struct gfs2_inum __pad3; /* Was quota inode in gfs1 */
13262306a36Sopenharmony_ci	struct gfs2_inum __pad4; /* Was licence inode in gfs1 */
13362306a36Sopenharmony_ci#define GFS2_HAS_UUID 1
13462306a36Sopenharmony_ci	__u8 sb_uuid[16]; /* The UUID, maybe 0 for backwards compat */
13562306a36Sopenharmony_ci};
13662306a36Sopenharmony_ci
13762306a36Sopenharmony_ci/*
13862306a36Sopenharmony_ci * resource index structure
13962306a36Sopenharmony_ci */
14062306a36Sopenharmony_ci
14162306a36Sopenharmony_cistruct gfs2_rindex {
14262306a36Sopenharmony_ci	__be64 ri_addr;	/* grp block disk address */
14362306a36Sopenharmony_ci	__be32 ri_length;	/* length of rgrp header in fs blocks */
14462306a36Sopenharmony_ci	__u32 __pad;
14562306a36Sopenharmony_ci
14662306a36Sopenharmony_ci	__be64 ri_data0;	/* first data location */
14762306a36Sopenharmony_ci	__be32 ri_data;	/* num of data blocks in rgrp */
14862306a36Sopenharmony_ci
14962306a36Sopenharmony_ci	__be32 ri_bitbytes;	/* number of bytes in data bitmaps */
15062306a36Sopenharmony_ci
15162306a36Sopenharmony_ci	__u8 ri_reserved[64];
15262306a36Sopenharmony_ci};
15362306a36Sopenharmony_ci
15462306a36Sopenharmony_ci/*
15562306a36Sopenharmony_ci * resource group header structure
15662306a36Sopenharmony_ci */
15762306a36Sopenharmony_ci
15862306a36Sopenharmony_ci/* Number of blocks per byte in rgrp */
15962306a36Sopenharmony_ci#define GFS2_NBBY		4
16062306a36Sopenharmony_ci#define GFS2_BIT_SIZE		2
16162306a36Sopenharmony_ci#define GFS2_BIT_MASK		0x00000003
16262306a36Sopenharmony_ci
16362306a36Sopenharmony_ci#define GFS2_BLKST_FREE		0
16462306a36Sopenharmony_ci#define GFS2_BLKST_USED		1
16562306a36Sopenharmony_ci#define GFS2_BLKST_UNLINKED	2
16662306a36Sopenharmony_ci#define GFS2_BLKST_DINODE	3
16762306a36Sopenharmony_ci
16862306a36Sopenharmony_ci#define GFS2_RGF_JOURNAL	0x00000001
16962306a36Sopenharmony_ci#define GFS2_RGF_METAONLY	0x00000002
17062306a36Sopenharmony_ci#define GFS2_RGF_DATAONLY	0x00000004
17162306a36Sopenharmony_ci#define GFS2_RGF_NOALLOC	0x00000008
17262306a36Sopenharmony_ci#define GFS2_RGF_TRIMMED	0x00000010
17362306a36Sopenharmony_ci
17462306a36Sopenharmony_cistruct gfs2_inode_lvb {
17562306a36Sopenharmony_ci	__be32 ri_magic;
17662306a36Sopenharmony_ci	__be32 __pad;
17762306a36Sopenharmony_ci	__be64 ri_generation_deleted;
17862306a36Sopenharmony_ci};
17962306a36Sopenharmony_ci
18062306a36Sopenharmony_cistruct gfs2_rgrp_lvb {
18162306a36Sopenharmony_ci	__be32 rl_magic;
18262306a36Sopenharmony_ci	__be32 rl_flags;
18362306a36Sopenharmony_ci	__be32 rl_free;
18462306a36Sopenharmony_ci	__be32 rl_dinodes;
18562306a36Sopenharmony_ci	__be64 rl_igeneration;
18662306a36Sopenharmony_ci	__be32 rl_unlinked;
18762306a36Sopenharmony_ci	__be32 __pad;
18862306a36Sopenharmony_ci};
18962306a36Sopenharmony_ci
19062306a36Sopenharmony_cistruct gfs2_rgrp {
19162306a36Sopenharmony_ci	struct gfs2_meta_header rg_header;
19262306a36Sopenharmony_ci
19362306a36Sopenharmony_ci	__be32 rg_flags;
19462306a36Sopenharmony_ci	__be32 rg_free;
19562306a36Sopenharmony_ci	__be32 rg_dinodes;
19662306a36Sopenharmony_ci	union {
19762306a36Sopenharmony_ci		__be32 __pad;
19862306a36Sopenharmony_ci		__be32 rg_skip; /* Distance to the next rgrp in fs blocks */
19962306a36Sopenharmony_ci	};
20062306a36Sopenharmony_ci	__be64 rg_igeneration;
20162306a36Sopenharmony_ci	/* The following 3 fields are duplicated from gfs2_rindex to reduce
20262306a36Sopenharmony_ci	   reliance on the rindex */
20362306a36Sopenharmony_ci	__be64 rg_data0;     /* First data location */
20462306a36Sopenharmony_ci	__be32 rg_data;      /* Number of data blocks in rgrp */
20562306a36Sopenharmony_ci	__be32 rg_bitbytes;  /* Number of bytes in data bitmaps */
20662306a36Sopenharmony_ci	__be32 rg_crc;       /* crc32 of the structure with this field 0 */
20762306a36Sopenharmony_ci
20862306a36Sopenharmony_ci	__u8 rg_reserved[60]; /* Several fields from gfs1 now reserved */
20962306a36Sopenharmony_ci};
21062306a36Sopenharmony_ci
21162306a36Sopenharmony_ci/*
21262306a36Sopenharmony_ci * quota structure
21362306a36Sopenharmony_ci */
21462306a36Sopenharmony_ci
21562306a36Sopenharmony_cistruct gfs2_quota {
21662306a36Sopenharmony_ci	__be64 qu_limit;
21762306a36Sopenharmony_ci	__be64 qu_warn;
21862306a36Sopenharmony_ci	__be64 qu_value;
21962306a36Sopenharmony_ci	__u8 qu_reserved[64];
22062306a36Sopenharmony_ci};
22162306a36Sopenharmony_ci
22262306a36Sopenharmony_ci/*
22362306a36Sopenharmony_ci * dinode structure
22462306a36Sopenharmony_ci */
22562306a36Sopenharmony_ci
22662306a36Sopenharmony_ci#define GFS2_MAX_META_HEIGHT	10
22762306a36Sopenharmony_ci#define GFS2_DIR_MAX_DEPTH	17
22862306a36Sopenharmony_ci
22962306a36Sopenharmony_ci#define DT2IF(dt) (((dt) << 12) & S_IFMT)
23062306a36Sopenharmony_ci#define IF2DT(sif) (((sif) & S_IFMT) >> 12)
23162306a36Sopenharmony_ci
23262306a36Sopenharmony_cienum {
23362306a36Sopenharmony_ci	gfs2fl_Jdata		= 0,
23462306a36Sopenharmony_ci	gfs2fl_ExHash		= 1,
23562306a36Sopenharmony_ci	gfs2fl_Unused		= 2,
23662306a36Sopenharmony_ci	gfs2fl_EaIndirect	= 3,
23762306a36Sopenharmony_ci	gfs2fl_Directio		= 4,
23862306a36Sopenharmony_ci	gfs2fl_Immutable	= 5,
23962306a36Sopenharmony_ci	gfs2fl_AppendOnly	= 6,
24062306a36Sopenharmony_ci	gfs2fl_NoAtime		= 7,
24162306a36Sopenharmony_ci	gfs2fl_Sync		= 8,
24262306a36Sopenharmony_ci	gfs2fl_System		= 9,
24362306a36Sopenharmony_ci	gfs2fl_TopLevel		= 10,
24462306a36Sopenharmony_ci	gfs2fl_TruncInProg	= 29,
24562306a36Sopenharmony_ci	gfs2fl_InheritDirectio	= 30,
24662306a36Sopenharmony_ci	gfs2fl_InheritJdata	= 31,
24762306a36Sopenharmony_ci};
24862306a36Sopenharmony_ci
24962306a36Sopenharmony_ci/* Dinode flags */
25062306a36Sopenharmony_ci#define GFS2_DIF_JDATA			0x00000001
25162306a36Sopenharmony_ci#define GFS2_DIF_EXHASH			0x00000002
25262306a36Sopenharmony_ci#define GFS2_DIF_UNUSED			0x00000004  /* only in gfs1 */
25362306a36Sopenharmony_ci#define GFS2_DIF_EA_INDIRECT		0x00000008
25462306a36Sopenharmony_ci#define GFS2_DIF_DIRECTIO		0x00000010
25562306a36Sopenharmony_ci#define GFS2_DIF_IMMUTABLE		0x00000020
25662306a36Sopenharmony_ci#define GFS2_DIF_APPENDONLY		0x00000040
25762306a36Sopenharmony_ci#define GFS2_DIF_NOATIME		0x00000080
25862306a36Sopenharmony_ci#define GFS2_DIF_SYNC			0x00000100
25962306a36Sopenharmony_ci#define GFS2_DIF_SYSTEM			0x00000200 /* New in gfs2 */
26062306a36Sopenharmony_ci#define GFS2_DIF_TOPDIR			0x00000400 /* New in gfs2 */
26162306a36Sopenharmony_ci#define GFS2_DIF_TRUNC_IN_PROG		0x20000000 /* New in gfs2 */
26262306a36Sopenharmony_ci#define GFS2_DIF_INHERIT_DIRECTIO	0x40000000 /* only in gfs1 */
26362306a36Sopenharmony_ci#define GFS2_DIF_INHERIT_JDATA		0x80000000
26462306a36Sopenharmony_ci
26562306a36Sopenharmony_cistruct gfs2_dinode {
26662306a36Sopenharmony_ci	struct gfs2_meta_header di_header;
26762306a36Sopenharmony_ci
26862306a36Sopenharmony_ci	struct gfs2_inum di_num;
26962306a36Sopenharmony_ci
27062306a36Sopenharmony_ci	__be32 di_mode;	/* mode of file */
27162306a36Sopenharmony_ci	__be32 di_uid;	/* owner's user id */
27262306a36Sopenharmony_ci	__be32 di_gid;	/* owner's group id */
27362306a36Sopenharmony_ci	__be32 di_nlink;	/* number of links to this file */
27462306a36Sopenharmony_ci	__be64 di_size;	/* number of bytes in file */
27562306a36Sopenharmony_ci	__be64 di_blocks;	/* number of blocks in file */
27662306a36Sopenharmony_ci	__be64 di_atime;	/* time last accessed */
27762306a36Sopenharmony_ci	__be64 di_mtime;	/* time last modified */
27862306a36Sopenharmony_ci	__be64 di_ctime;	/* time last changed */
27962306a36Sopenharmony_ci	__be32 di_major;	/* device major number */
28062306a36Sopenharmony_ci	__be32 di_minor;	/* device minor number */
28162306a36Sopenharmony_ci
28262306a36Sopenharmony_ci	/* This section varies from gfs1. Padding added to align with
28362306a36Sopenharmony_ci         * remainder of dinode
28462306a36Sopenharmony_ci	 */
28562306a36Sopenharmony_ci	__be64 di_goal_meta;	/* rgrp to alloc from next */
28662306a36Sopenharmony_ci	__be64 di_goal_data;	/* data block goal */
28762306a36Sopenharmony_ci	__be64 di_generation;	/* generation number for NFS */
28862306a36Sopenharmony_ci
28962306a36Sopenharmony_ci	__be32 di_flags;	/* GFS2_DIF_... */
29062306a36Sopenharmony_ci	__be32 di_payload_format;  /* GFS2_FORMAT_... */
29162306a36Sopenharmony_ci	__u16 __pad1;	/* Was ditype in gfs1 */
29262306a36Sopenharmony_ci	__be16 di_height;	/* height of metadata */
29362306a36Sopenharmony_ci	__u32 __pad2;	/* Unused incarnation number from gfs1 */
29462306a36Sopenharmony_ci
29562306a36Sopenharmony_ci	/* These only apply to directories  */
29662306a36Sopenharmony_ci	__u16 __pad3;	/* Padding */
29762306a36Sopenharmony_ci	__be16 di_depth;	/* Number of bits in the table */
29862306a36Sopenharmony_ci	__be32 di_entries;	/* The number of entries in the directory */
29962306a36Sopenharmony_ci
30062306a36Sopenharmony_ci	struct gfs2_inum __pad4; /* Unused even in current gfs1 */
30162306a36Sopenharmony_ci
30262306a36Sopenharmony_ci	__be64 di_eattr;	/* extended attribute block number */
30362306a36Sopenharmony_ci	__be32 di_atime_nsec;   /* nsec portion of atime */
30462306a36Sopenharmony_ci	__be32 di_mtime_nsec;   /* nsec portion of mtime */
30562306a36Sopenharmony_ci	__be32 di_ctime_nsec;   /* nsec portion of ctime */
30662306a36Sopenharmony_ci
30762306a36Sopenharmony_ci	__u8 di_reserved[44];
30862306a36Sopenharmony_ci};
30962306a36Sopenharmony_ci
31062306a36Sopenharmony_ci/*
31162306a36Sopenharmony_ci * directory structure - many of these per directory file
31262306a36Sopenharmony_ci */
31362306a36Sopenharmony_ci
31462306a36Sopenharmony_ci#define GFS2_FNAMESIZE		255
31562306a36Sopenharmony_ci#define GFS2_DIRENT_SIZE(name_len) ((sizeof(struct gfs2_dirent) + (name_len) + 7) & ~7)
31662306a36Sopenharmony_ci#define GFS2_MIN_DIRENT_SIZE (GFS2_DIRENT_SIZE(1))
31762306a36Sopenharmony_ci
31862306a36Sopenharmony_ci
31962306a36Sopenharmony_cistruct gfs2_dirent {
32062306a36Sopenharmony_ci	struct gfs2_inum de_inum;
32162306a36Sopenharmony_ci	__be32 de_hash;
32262306a36Sopenharmony_ci	__be16 de_rec_len;
32362306a36Sopenharmony_ci	__be16 de_name_len;
32462306a36Sopenharmony_ci	__be16 de_type;
32562306a36Sopenharmony_ci	__be16 de_rahead;
32662306a36Sopenharmony_ci	union {
32762306a36Sopenharmony_ci		__u8 __pad[12];
32862306a36Sopenharmony_ci		struct {
32962306a36Sopenharmony_ci			__u32 de_cookie; /* ondisk value not used */
33062306a36Sopenharmony_ci			__u8 pad3[8];
33162306a36Sopenharmony_ci		};
33262306a36Sopenharmony_ci	};
33362306a36Sopenharmony_ci};
33462306a36Sopenharmony_ci
33562306a36Sopenharmony_ci/*
33662306a36Sopenharmony_ci * Header of leaf directory nodes
33762306a36Sopenharmony_ci */
33862306a36Sopenharmony_ci
33962306a36Sopenharmony_cistruct gfs2_leaf {
34062306a36Sopenharmony_ci	struct gfs2_meta_header lf_header;
34162306a36Sopenharmony_ci
34262306a36Sopenharmony_ci	__be16 lf_depth;		/* Depth of leaf */
34362306a36Sopenharmony_ci	__be16 lf_entries;		/* Number of dirents in leaf */
34462306a36Sopenharmony_ci	__be32 lf_dirent_format;	/* Format of the dirents */
34562306a36Sopenharmony_ci	__be64 lf_next;			/* Next leaf, if overflow */
34662306a36Sopenharmony_ci
34762306a36Sopenharmony_ci	union {
34862306a36Sopenharmony_ci		__u8 lf_reserved[64];
34962306a36Sopenharmony_ci		struct {
35062306a36Sopenharmony_ci			__be64 lf_inode;	/* Dir inode number */
35162306a36Sopenharmony_ci			__be32 lf_dist;		/* Dist from inode on chain */
35262306a36Sopenharmony_ci			__be32 lf_nsec;		/* Last ins/del usecs */
35362306a36Sopenharmony_ci			__be64 lf_sec;		/* Last ins/del in secs */
35462306a36Sopenharmony_ci			__u8 lf_reserved2[40];
35562306a36Sopenharmony_ci		};
35662306a36Sopenharmony_ci	};
35762306a36Sopenharmony_ci};
35862306a36Sopenharmony_ci
35962306a36Sopenharmony_ci/*
36062306a36Sopenharmony_ci * Extended attribute header format
36162306a36Sopenharmony_ci *
36262306a36Sopenharmony_ci * This works in a similar way to dirents. There is a fixed size header
36362306a36Sopenharmony_ci * followed by a variable length section made up of the name and the
36462306a36Sopenharmony_ci * associated data. In the case of a "stuffed" entry, the value is
36562306a36Sopenharmony_ci * inline directly after the name, the ea_num_ptrs entry will be
36662306a36Sopenharmony_ci * zero in that case. For non-"stuffed" entries, there will be
36762306a36Sopenharmony_ci * a set of pointers (aligned to 8 byte boundary) to the block(s)
36862306a36Sopenharmony_ci * containing the value.
36962306a36Sopenharmony_ci *
37062306a36Sopenharmony_ci * The blocks containing the values and the blocks containing the
37162306a36Sopenharmony_ci * extended attribute headers themselves all start with the common
37262306a36Sopenharmony_ci * metadata header. Each inode, if it has extended attributes, will
37362306a36Sopenharmony_ci * have either a single block containing the extended attribute headers
37462306a36Sopenharmony_ci * or a single indirect block pointing to blocks containing the
37562306a36Sopenharmony_ci * extended attribute headers.
37662306a36Sopenharmony_ci *
37762306a36Sopenharmony_ci * The maximum size of the data part of an extended attribute is 64k
37862306a36Sopenharmony_ci * so the number of blocks required depends upon block size. Since the
37962306a36Sopenharmony_ci * block size also determines the number of pointers in an indirect
38062306a36Sopenharmony_ci * block, its a fairly complicated calculation to work out the maximum
38162306a36Sopenharmony_ci * number of blocks that an inode may have relating to extended attributes.
38262306a36Sopenharmony_ci *
38362306a36Sopenharmony_ci */
38462306a36Sopenharmony_ci
38562306a36Sopenharmony_ci#define GFS2_EA_MAX_NAME_LEN	255
38662306a36Sopenharmony_ci#define GFS2_EA_MAX_DATA_LEN	65536
38762306a36Sopenharmony_ci
38862306a36Sopenharmony_ci#define GFS2_EATYPE_UNUSED	0
38962306a36Sopenharmony_ci#define GFS2_EATYPE_USR		1
39062306a36Sopenharmony_ci#define GFS2_EATYPE_SYS		2
39162306a36Sopenharmony_ci#define GFS2_EATYPE_SECURITY	3
39262306a36Sopenharmony_ci#define GFS2_EATYPE_TRUSTED	4
39362306a36Sopenharmony_ci
39462306a36Sopenharmony_ci#define GFS2_EATYPE_LAST	4
39562306a36Sopenharmony_ci#define GFS2_EATYPE_VALID(x)	((x) <= GFS2_EATYPE_LAST)
39662306a36Sopenharmony_ci
39762306a36Sopenharmony_ci#define GFS2_EAFLAG_LAST	0x01	/* last ea in block */
39862306a36Sopenharmony_ci
39962306a36Sopenharmony_cistruct gfs2_ea_header {
40062306a36Sopenharmony_ci	__be32 ea_rec_len;
40162306a36Sopenharmony_ci	__be32 ea_data_len;
40262306a36Sopenharmony_ci	__u8 ea_name_len;	/* no NULL pointer after the string */
40362306a36Sopenharmony_ci	__u8 ea_type;		/* GFS2_EATYPE_... */
40462306a36Sopenharmony_ci	__u8 ea_flags;		/* GFS2_EAFLAG_... */
40562306a36Sopenharmony_ci	__u8 ea_num_ptrs;
40662306a36Sopenharmony_ci	__u32 __pad;
40762306a36Sopenharmony_ci};
40862306a36Sopenharmony_ci
40962306a36Sopenharmony_ci/*
41062306a36Sopenharmony_ci * Log header structure
41162306a36Sopenharmony_ci */
41262306a36Sopenharmony_ci
41362306a36Sopenharmony_ci#define GFS2_LOG_HEAD_UNMOUNT		0x00000001 /* log is clean */
41462306a36Sopenharmony_ci#define GFS2_LOG_HEAD_FLUSH_NORMAL	0x00000002 /* normal log flush */
41562306a36Sopenharmony_ci#define GFS2_LOG_HEAD_FLUSH_SYNC	0x00000004 /* Sync log flush */
41662306a36Sopenharmony_ci#define GFS2_LOG_HEAD_FLUSH_SHUTDOWN	0x00000008 /* Shutdown log flush */
41762306a36Sopenharmony_ci#define GFS2_LOG_HEAD_FLUSH_FREEZE	0x00000010 /* Freeze flush */
41862306a36Sopenharmony_ci#define GFS2_LOG_HEAD_RECOVERY		0x00000020 /* Journal recovery */
41962306a36Sopenharmony_ci#define GFS2_LOG_HEAD_USERSPACE		0x80000000 /* Written by gfs2-utils */
42062306a36Sopenharmony_ci
42162306a36Sopenharmony_ci/* Log flush callers */
42262306a36Sopenharmony_ci#define GFS2_LFC_SHUTDOWN		0x00000100
42362306a36Sopenharmony_ci#define GFS2_LFC_JDATA_WPAGES		0x00000200
42462306a36Sopenharmony_ci#define GFS2_LFC_SET_FLAGS		0x00000400
42562306a36Sopenharmony_ci#define GFS2_LFC_AIL_EMPTY_GL		0x00000800
42662306a36Sopenharmony_ci#define GFS2_LFC_AIL_FLUSH		0x00001000
42762306a36Sopenharmony_ci#define GFS2_LFC_RGRP_GO_SYNC		0x00002000
42862306a36Sopenharmony_ci#define GFS2_LFC_INODE_GO_SYNC		0x00004000
42962306a36Sopenharmony_ci#define GFS2_LFC_INODE_GO_INVAL		0x00008000
43062306a36Sopenharmony_ci#define GFS2_LFC_FREEZE_GO_SYNC		0x00010000
43162306a36Sopenharmony_ci#define GFS2_LFC_KILL_SB		0x00020000
43262306a36Sopenharmony_ci#define GFS2_LFC_DO_SYNC		0x00040000
43362306a36Sopenharmony_ci#define GFS2_LFC_INPLACE_RESERVE	0x00080000
43462306a36Sopenharmony_ci#define GFS2_LFC_WRITE_INODE		0x00100000
43562306a36Sopenharmony_ci#define GFS2_LFC_MAKE_FS_RO		0x00200000
43662306a36Sopenharmony_ci#define GFS2_LFC_SYNC_FS		0x00400000
43762306a36Sopenharmony_ci#define GFS2_LFC_EVICT_INODE		0x00800000
43862306a36Sopenharmony_ci#define GFS2_LFC_TRANS_END		0x01000000
43962306a36Sopenharmony_ci#define GFS2_LFC_LOGD_JFLUSH_REQD	0x02000000
44062306a36Sopenharmony_ci#define GFS2_LFC_LOGD_AIL_FLUSH_REQD	0x04000000
44162306a36Sopenharmony_ci
44262306a36Sopenharmony_ci#define LH_V1_SIZE (offsetofend(struct gfs2_log_header, lh_hash))
44362306a36Sopenharmony_ci
44462306a36Sopenharmony_cistruct gfs2_log_header {
44562306a36Sopenharmony_ci	struct gfs2_meta_header lh_header;
44662306a36Sopenharmony_ci
44762306a36Sopenharmony_ci	__be64 lh_sequence;	/* Sequence number of this transaction */
44862306a36Sopenharmony_ci	__be32 lh_flags;	/* GFS2_LOG_HEAD_... */
44962306a36Sopenharmony_ci	__be32 lh_tail;		/* Block number of log tail */
45062306a36Sopenharmony_ci	__be32 lh_blkno;
45162306a36Sopenharmony_ci	__be32 lh_hash;		/* crc up to here with this field 0 */
45262306a36Sopenharmony_ci
45362306a36Sopenharmony_ci	/* Version 2 additional fields start here */
45462306a36Sopenharmony_ci	__be32 lh_crc;		/* crc32c from lh_nsec to end of block */
45562306a36Sopenharmony_ci	__be32 lh_nsec;		/* Nanoseconds of timestamp */
45662306a36Sopenharmony_ci	__be64 lh_sec;		/* Seconds of timestamp */
45762306a36Sopenharmony_ci	__be64 lh_addr;		/* Block addr of this log header (absolute) */
45862306a36Sopenharmony_ci	__be64 lh_jinode;	/* Journal inode number */
45962306a36Sopenharmony_ci	__be64 lh_statfs_addr;	/* Local statfs inode number */
46062306a36Sopenharmony_ci	__be64 lh_quota_addr;	/* Local quota change inode number */
46162306a36Sopenharmony_ci
46262306a36Sopenharmony_ci	/* Statfs local changes (i.e. diff from global statfs) */
46362306a36Sopenharmony_ci	__be64 lh_local_total;
46462306a36Sopenharmony_ci	__be64 lh_local_free;
46562306a36Sopenharmony_ci	__be64 lh_local_dinodes;
46662306a36Sopenharmony_ci};
46762306a36Sopenharmony_ci
46862306a36Sopenharmony_ci/*
46962306a36Sopenharmony_ci * Log type descriptor
47062306a36Sopenharmony_ci */
47162306a36Sopenharmony_ci
47262306a36Sopenharmony_ci#define GFS2_LOG_DESC_METADATA	300
47362306a36Sopenharmony_ci/* ld_data1 is the number of metadata blocks in the descriptor.
47462306a36Sopenharmony_ci   ld_data2 is unused. */
47562306a36Sopenharmony_ci
47662306a36Sopenharmony_ci#define GFS2_LOG_DESC_REVOKE	301
47762306a36Sopenharmony_ci/* ld_data1 is the number of revoke blocks in the descriptor.
47862306a36Sopenharmony_ci   ld_data2 is unused. */
47962306a36Sopenharmony_ci
48062306a36Sopenharmony_ci#define GFS2_LOG_DESC_JDATA	302
48162306a36Sopenharmony_ci/* ld_data1 is the number of data blocks in the descriptor.
48262306a36Sopenharmony_ci   ld_data2 is unused. */
48362306a36Sopenharmony_ci
48462306a36Sopenharmony_cistruct gfs2_log_descriptor {
48562306a36Sopenharmony_ci	struct gfs2_meta_header ld_header;
48662306a36Sopenharmony_ci
48762306a36Sopenharmony_ci	__be32 ld_type;		/* GFS2_LOG_DESC_... */
48862306a36Sopenharmony_ci	__be32 ld_length;	/* Number of buffers in this chunk */
48962306a36Sopenharmony_ci	__be32 ld_data1;	/* descriptor-specific field */
49062306a36Sopenharmony_ci	__be32 ld_data2;	/* descriptor-specific field */
49162306a36Sopenharmony_ci
49262306a36Sopenharmony_ci	__u8 ld_reserved[32];
49362306a36Sopenharmony_ci};
49462306a36Sopenharmony_ci
49562306a36Sopenharmony_ci/*
49662306a36Sopenharmony_ci * Inum Range
49762306a36Sopenharmony_ci * Describe a range of formal inode numbers allocated to
49862306a36Sopenharmony_ci * one machine to assign to inodes.
49962306a36Sopenharmony_ci */
50062306a36Sopenharmony_ci
50162306a36Sopenharmony_ci#define GFS2_INUM_QUANTUM	1048576
50262306a36Sopenharmony_ci
50362306a36Sopenharmony_cistruct gfs2_inum_range {
50462306a36Sopenharmony_ci	__be64 ir_start;
50562306a36Sopenharmony_ci	__be64 ir_length;
50662306a36Sopenharmony_ci};
50762306a36Sopenharmony_ci
50862306a36Sopenharmony_ci/*
50962306a36Sopenharmony_ci * Statfs change
51062306a36Sopenharmony_ci * Describes an change to the pool of free and allocated
51162306a36Sopenharmony_ci * blocks.
51262306a36Sopenharmony_ci */
51362306a36Sopenharmony_ci
51462306a36Sopenharmony_cistruct gfs2_statfs_change {
51562306a36Sopenharmony_ci	__be64 sc_total;
51662306a36Sopenharmony_ci	__be64 sc_free;
51762306a36Sopenharmony_ci	__be64 sc_dinodes;
51862306a36Sopenharmony_ci};
51962306a36Sopenharmony_ci
52062306a36Sopenharmony_ci/*
52162306a36Sopenharmony_ci * Quota change
52262306a36Sopenharmony_ci * Describes an allocation change for a particular
52362306a36Sopenharmony_ci * user or group.
52462306a36Sopenharmony_ci */
52562306a36Sopenharmony_ci
52662306a36Sopenharmony_ci#define GFS2_QCF_USER		0x00000001
52762306a36Sopenharmony_ci
52862306a36Sopenharmony_cistruct gfs2_quota_change {
52962306a36Sopenharmony_ci	__be64 qc_change;
53062306a36Sopenharmony_ci	__be32 qc_flags;	/* GFS2_QCF_... */
53162306a36Sopenharmony_ci	__be32 qc_id;
53262306a36Sopenharmony_ci};
53362306a36Sopenharmony_ci
53462306a36Sopenharmony_cistruct gfs2_quota_lvb {
53562306a36Sopenharmony_ci        __be32 qb_magic;
53662306a36Sopenharmony_ci        __u32 __pad;
53762306a36Sopenharmony_ci        __be64 qb_limit;      /* Hard limit of # blocks to alloc */
53862306a36Sopenharmony_ci        __be64 qb_warn;       /* Warn user when alloc is above this # */
53962306a36Sopenharmony_ci        __be64 qb_value;       /* Current # blocks allocated */
54062306a36Sopenharmony_ci};
54162306a36Sopenharmony_ci
54262306a36Sopenharmony_ci#endif /* __GFS2_ONDISK_DOT_H__ */
543