Blame gfs2/libgfs2/meta.c

Packit Service 360c39
#include <stdint.h>
Packit Service 360c39
#include <string.h>
Packit Service 360c39
#include "libgfs2.h"
Packit Service 360c39
#include "clusterautoconfig.h"
Packit Service 360c39
Packit Service 360c39
#ifdef GFS2_HAS_UUID
Packit Service 360c39
#include <uuid.h>
Packit Service 360c39
#endif
Packit Service 360c39
Packit Service 360c39
#define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0]))
Packit Service 360c39
#define SYM(x) { x, #x },
Packit Service 360c39
Packit Service 360c39
const struct lgfs2_symbolic lgfs2_metatypes[] = {
Packit Service 360c39
SYM(GFS2_METATYPE_NONE)
Packit Service 360c39
SYM(GFS2_METATYPE_SB)
Packit Service 360c39
SYM(GFS2_METATYPE_RG)
Packit Service 360c39
SYM(GFS2_METATYPE_RB)
Packit Service 360c39
SYM(GFS2_METATYPE_DI)
Packit Service 360c39
SYM(GFS2_METATYPE_IN)
Packit Service 360c39
SYM(GFS2_METATYPE_LF)
Packit Service 360c39
SYM(GFS2_METATYPE_JD)
Packit Service 360c39
SYM(GFS2_METATYPE_LH)
Packit Service 360c39
SYM(GFS2_METATYPE_LD)
Packit Service 360c39
SYM(GFS2_METATYPE_LB)
Packit Service 360c39
SYM(GFS2_METATYPE_EA)
Packit Service 360c39
SYM(GFS2_METATYPE_ED)
Packit Service 360c39
SYM(GFS2_METATYPE_QC)
Packit Service 360c39
};
Packit Service 360c39
Packit Service 360c39
const unsigned lgfs2_metatype_size = ARRAY_SIZE(lgfs2_metatypes);
Packit Service 360c39
Packit Service 360c39
const struct lgfs2_symbolic lgfs2_metaformats[] = {
Packit Service 360c39
SYM(GFS2_FORMAT_NONE)
Packit Service 360c39
SYM(GFS2_FORMAT_SB)
Packit Service 360c39
SYM(GFS2_FORMAT_RG)
Packit Service 360c39
SYM(GFS2_FORMAT_RB)
Packit Service 360c39
SYM(GFS2_FORMAT_DI)
Packit Service 360c39
SYM(GFS2_FORMAT_IN)
Packit Service 360c39
SYM(GFS2_FORMAT_LF)
Packit Service 360c39
SYM(GFS2_FORMAT_JD)
Packit Service 360c39
SYM(GFS2_FORMAT_LH)
Packit Service 360c39
SYM(GFS2_FORMAT_LD)
Packit Service 360c39
SYM(GFS2_FORMAT_LB)
Packit Service 360c39
SYM(GFS2_FORMAT_EA)
Packit Service 360c39
SYM(GFS2_FORMAT_ED)
Packit Service 360c39
SYM(GFS2_FORMAT_QC)
Packit Service 360c39
SYM(GFS2_FORMAT_RI)
Packit Service 360c39
SYM(GFS2_FORMAT_DE)
Packit Service 360c39
SYM(GFS2_FORMAT_QU)
Packit Service 360c39
};
Packit Service 360c39
Packit Service 360c39
const unsigned lgfs2_metaformat_size = ARRAY_SIZE(lgfs2_metaformats);
Packit Service 360c39
Packit Service 360c39
const struct lgfs2_symbolic lgfs2_di_flags[] = {
Packit Service 360c39
SYM(GFS2_DIF_JDATA)
Packit Service 360c39
SYM(GFS2_DIF_EXHASH)
Packit Service 360c39
SYM(GFS2_DIF_UNUSED)
Packit Service 360c39
SYM(GFS2_DIF_EA_INDIRECT)
Packit Service 360c39
SYM(GFS2_DIF_DIRECTIO)
Packit Service 360c39
SYM(GFS2_DIF_IMMUTABLE)
Packit Service 360c39
SYM(GFS2_DIF_APPENDONLY)
Packit Service 360c39
SYM(GFS2_DIF_NOATIME)
Packit Service 360c39
SYM(GFS2_DIF_SYNC)
Packit Service 360c39
SYM(GFS2_DIF_SYSTEM)
Packit Service 360c39
SYM(GFS2_DIF_TRUNC_IN_PROG)
Packit Service 360c39
SYM(GFS2_DIF_INHERIT_DIRECTIO)
Packit Service 360c39
SYM(GFS2_DIF_INHERIT_JDATA)
Packit Service 360c39
};
Packit Service 360c39
Packit Service 360c39
const unsigned lgfs2_di_flag_size = ARRAY_SIZE(lgfs2_di_flags);
Packit Service 360c39
Packit Service 360c39
const struct lgfs2_symbolic lgfs2_lh_flags[] = {
Packit Service 360c39
SYM(GFS2_LOG_HEAD_UNMOUNT)
Packit Service 360c39
};
Packit Service 360c39
Packit Service 360c39
const unsigned int lgfs2_lh_flag_size = ARRAY_SIZE(lgfs2_lh_flags);
Packit Service 360c39
Packit Service 360c39
const struct lgfs2_symbolic lgfs2_ld_types[] = {
Packit Service 360c39
SYM(GFS2_LOG_DESC_METADATA)
Packit Service 360c39
SYM(GFS2_LOG_DESC_REVOKE)
Packit Service 360c39
SYM(GFS2_LOG_DESC_JDATA)
Packit Service 360c39
};
Packit Service 360c39
Packit Service 360c39
const unsigned int lgfs2_ld_type_size = ARRAY_SIZE(lgfs2_ld_types);
Packit Service 360c39
Packit Service 360c39
const struct lgfs2_symbolic lgfs2_ld1_types[] = {
Packit Service 360c39
SYM(GFS_LOG_DESC_METADATA)
Packit Service 360c39
SYM(GFS_LOG_DESC_IUL)
Packit Service 360c39
SYM(GFS_LOG_DESC_IDA)
Packit Service 360c39
SYM(GFS_LOG_DESC_Q)
Packit Service 360c39
SYM(GFS_LOG_DESC_LAST)
Packit Service 360c39
};
Packit Service 360c39
Packit Service 360c39
const unsigned int lgfs2_ld1_type_size = ARRAY_SIZE(lgfs2_ld1_types);
Packit Service 360c39
Packit Service 360c39
#undef SYM
Packit Service 360c39
Packit Service 360c39
Packit Service 360c39
Packit Service 360c39
Packit Service 360c39
#define F(f,...)  { .name = #f, \
Packit Service 360c39
		    .offset = offsetof(struct STRUCT, f), \
Packit Service 360c39
		    .length = sizeof(((struct STRUCT *)(0))->f), \
Packit Service 360c39
		    __VA_ARGS__ },
Packit Service 360c39
#define FP(f,...) F(f, .flags = LGFS2_MFF_POINTER, __VA_ARGS__)
Packit Service 360c39
#define RF(f) F(f, .flags = LGFS2_MFF_RESERVED)
Packit Service 360c39
#define RFP(f,...) F(f, .flags = LGFS2_MFF_POINTER|LGFS2_MFF_RESERVED, __VA_ARGS__)
Packit Service 360c39
Packit Service 360c39
Packit Service 360c39
#define MH(f) F(f.mh_magic) \
Packit Service 360c39
	      F(f.mh_type, .flags = LGFS2_MFF_ENUM, .symtab=lgfs2_metatypes, .nsyms=ARRAY_SIZE(lgfs2_metatypes)) \
Packit Service 360c39
	      RF(f.__pad0) \
Packit Service 360c39
	      F(f.mh_format, .flags = LGFS2_MFF_ENUM, .symtab=lgfs2_metaformats, .nsyms=ARRAY_SIZE(lgfs2_metaformats)) \
Packit Service 360c39
	      F(f.mh_jid)
Packit Service 360c39
Packit Service 360c39
#define IN(f,...) F(f.no_formal_ino) \
Packit Service 360c39
		  FP(f.no_addr, __VA_ARGS__)
Packit Service 360c39
Packit Service 360c39
#define INR(f,...) RF(f.no_formal_ino) \
Packit Service 360c39
		   RFP(f.no_addr, __VA_ARGS__)
Packit Service 360c39
#define ANY_COMMON_BLOCK (1 << LGFS2_MT_DIR_LEAF) | \
Packit Service 360c39
			 (1 << LGFS2_MT_JRNL_DATA) | \
Packit Service 360c39
			 (1 << LGFS2_MT_EA_ATTR) | \
Packit Service 360c39
			 (1 << LGFS2_MT_EA_DATA) | \
Packit Service 360c39
			 (1 << LGFS2_MT_DATA)
Packit Service 360c39
Packit Service 360c39
#define ANY_GFS2_BLOCK (1 << LGFS2_MT_GFS2_DINODE) | \
Packit Service 360c39
		       (1 << LGFS2_MT_GFS2_INDIRECT) | \
Packit Service 360c39
		       (1 << LGFS2_MT_GFS2_LOG_HEADER) | \
Packit Service 360c39
		       (1 << LGFS2_MT_GFS2_LOG_DESC) | \
Packit Service 360c39
		       (1 << LGFS2_MT_GFS2_LOG_BLOCK) | \
Packit Service 360c39
		       ANY_COMMON_BLOCK
Packit Service 360c39
Packit Service 360c39
#define ANY_GFS_BLOCK (1 << LGFS2_MT_GFS_DINODE) | \
Packit Service 360c39
		      (1 << LGFS2_MT_GFS_INDIRECT) | \
Packit Service 360c39
		      ANY_COMMON_BLOCK
Packit Service 360c39
Packit Service 360c39
#undef STRUCT
Packit Service 360c39
#define STRUCT gfs2_sb
Packit Service 360c39
Packit Service 360c39
static const struct lgfs2_metafield gfs2_sb_fields[] = {
Packit Service 360c39
MH(sb_header)
Packit Service 360c39
F(sb_fs_format)
Packit Service 360c39
F(sb_multihost_format)
Packit Service 360c39
RF(__pad0)
Packit Service 360c39
F(sb_bsize, .flags = LGFS2_MFF_BYTES)
Packit Service 360c39
F(sb_bsize_shift, .flags = LGFS2_MFF_BYTES|LGFS2_MFF_SHIFT)
Packit Service 360c39
RF(__pad1)
Packit Service 360c39
IN(sb_master_dir, .points_to = (1 << LGFS2_MT_GFS2_DINODE))
Packit Service 360c39
INR(__pad2, .points_to = (1 << LGFS2_MT_GFS2_DINODE))
Packit Service 360c39
IN(sb_root_dir, .points_to = (1 << LGFS2_MT_GFS2_DINODE))
Packit Service 360c39
F(sb_lockproto, .flags = LGFS2_MFF_STRING)
Packit Service 360c39
F(sb_locktable, .flags = LGFS2_MFF_STRING)
Packit Service 360c39
INR(__pad3, .points_to = (1 << LGFS2_MT_GFS2_DINODE))
Packit Service 360c39
INR(__pad4, .points_to = (1 << LGFS2_MT_GFS2_DINODE))
Packit Service 360c39
#ifdef GFS2_HAS_UUID
Packit Service 360c39
F(sb_uuid, .flags = LGFS2_MFF_UUID)
Packit Service 360c39
#endif
Packit Service 360c39
};
Packit Service 360c39
Packit Service 360c39
#undef STRUCT
Packit Service 360c39
#define STRUCT gfs_sb
Packit Service 360c39
Packit Service 360c39
static const struct lgfs2_metafield gfs_sb_fields[] = {
Packit Service 360c39
MH(sb_header)
Packit Service 360c39
F(sb_fs_format)
Packit Service 360c39
F(sb_multihost_format)
Packit Service 360c39
F(sb_flags)
Packit Service 360c39
F(sb_bsize, .flags = LGFS2_MFF_BYTES)
Packit Service 360c39
F(sb_bsize_shift, .flags = LGFS2_MFF_BYTES|LGFS2_MFF_SHIFT)
Packit Service 360c39
F(sb_seg_size, .flags = LGFS2_MFF_FSBLOCKS)
Packit Service 360c39
IN(sb_jindex_di, .points_to = (1 << LGFS2_MT_GFS_DINODE))
Packit Service 360c39
IN(sb_rindex_di, .points_to = (1 << LGFS2_MT_GFS_DINODE))
Packit Service 360c39
IN(sb_root_di, .points_to = (1 << LGFS2_MT_GFS_DINODE))
Packit Service 360c39
F(sb_lockproto, .flags = LGFS2_MFF_STRING)
Packit Service 360c39
F(sb_locktable, .flags = LGFS2_MFF_STRING)
Packit Service 360c39
IN(sb_quota_di, .points_to = (1 << LGFS2_MT_GFS_DINODE))
Packit Service 360c39
IN(sb_license_di, .points_to = (1 << LGFS2_MT_GFS_DINODE))
Packit Service 360c39
RF(sb_reserved)
Packit Service 360c39
};
Packit Service 360c39
Packit Service 360c39
#undef STRUCT
Packit Service 360c39
#define STRUCT gfs2_rindex
Packit Service 360c39
Packit Service 360c39
static const struct lgfs2_metafield gfs2_rindex_fields[] = {
Packit Service 360c39
FP(ri_addr, .points_to = (1 << LGFS2_MT_GFS2_RGRP))
Packit Service 360c39
F(ri_length, .flags = LGFS2_MFF_FSBLOCKS)
Packit Service 360c39
RF(__pad)
Packit Service 360c39
FP(ri_data0, .points_to = ANY_GFS2_BLOCK|(1 << LGFS2_MT_FREE))
Packit Service 360c39
F(ri_data, .flags = LGFS2_MFF_FSBLOCKS)
Packit Service 360c39
F(ri_bitbytes, .flags = LGFS2_MFF_BYTES)
Packit Service 360c39
F(ri_reserved)
Packit Service 360c39
};
Packit Service 360c39
Packit Service 360c39
#undef STRUCT
Packit Service 360c39
#define STRUCT gfs2_rgrp
Packit Service 360c39
Packit Service 360c39
static const struct lgfs2_metafield gfs2_rgrp_fields[] = {
Packit Service 360c39
MH(rg_header)
Packit Service 360c39
F(rg_flags)
Packit Service 360c39
F(rg_free, .flags = LGFS2_MFF_FSBLOCKS)
Packit Service 360c39
F(rg_dinodes, .flags = LGFS2_MFF_FSBLOCKS)
Packit Service 360c39
#ifdef GFS2_HAS_RG_SKIP
Packit Service 360c39
FP(rg_skip, .points_to = (1 << LGFS2_MT_GFS2_RGRP))
Packit Service 360c39
#else
Packit Service 360c39
RF(__pad)
Packit Service 360c39
#endif
Packit Service 360c39
F(rg_igeneration)
Packit Service 360c39
#ifdef GFS2_HAS_RG_RI_FIELDS
Packit Service 360c39
FP(rg_data0, .points_to = ANY_GFS2_BLOCK|(1 << LGFS2_MT_FREE))
Packit Service 360c39
F(rg_data, .flags = LGFS2_MFF_FSBLOCKS)
Packit Service 360c39
F(rg_bitbytes, .flags = LGFS2_MFF_BYTES)
Packit Service 360c39
F(rg_crc, .flags = LGFS2_MFF_CHECK)
Packit Service 360c39
#endif
Packit Service 360c39
RF(rg_reserved)
Packit Service 360c39
};
Packit Service 360c39
Packit Service 360c39
#undef STRUCT
Packit Service 360c39
#define STRUCT gfs_rgrp
Packit Service 360c39
Packit Service 360c39
static const struct lgfs2_metafield gfs_rgrp_fields[] = {
Packit Service 360c39
MH(rg_header)
Packit Service 360c39
F(rg_flags)
Packit Service 360c39
F(rg_free, .flags = LGFS2_MFF_FSBLOCKS)
Packit Service 360c39
F(rg_useddi, .flags = LGFS2_MFF_FSBLOCKS)
Packit Service 360c39
F(rg_freedi, .flags = LGFS2_MFF_FSBLOCKS)
Packit Service 360c39
IN(rg_freedi_list, .points_to = (1 << LGFS2_MT_GFS_DINODE))
Packit Service 360c39
F(rg_usedmeta, .flags = LGFS2_MFF_FSBLOCKS)
Packit Service 360c39
F(rg_freemeta, .flags = LGFS2_MFF_FSBLOCKS)
Packit Service 360c39
RF(rg_reserved)
Packit Service 360c39
};
Packit Service 360c39
Packit Service 360c39
#undef STRUCT
Packit Service 360c39
struct gfs2_rgrp_bitmap { struct gfs2_meta_header rb_header; };
Packit Service 360c39
#define STRUCT gfs2_rgrp_bitmap
Packit Service 360c39
Packit Service 360c39
static const struct lgfs2_metafield gfs2_rgrp_bitmap_fields[] = {
Packit Service 360c39
MH(rb_header)
Packit Service 360c39
};
Packit Service 360c39
Packit Service 360c39
#undef STRUCT
Packit Service 360c39
#define STRUCT gfs2_dinode
Packit Service 360c39
Packit Service 360c39
static const struct lgfs2_metafield gfs2_dinode_fields[] = {
Packit Service 360c39
MH(di_header)
Packit Service 360c39
IN(di_num, .points_to = (1 << LGFS2_MT_GFS2_DINODE))
Packit Service 360c39
F(di_mode, .flags = LGFS2_MFF_MODE)
Packit Service 360c39
F(di_uid, .flags = LGFS2_MFF_UID)
Packit Service 360c39
F(di_gid, .flags = LGFS2_MFF_GID)
Packit Service 360c39
F(di_nlink)
Packit Service 360c39
F(di_size, .flags = LGFS2_MFF_BYTES)
Packit Service 360c39
F(di_blocks, .flags = LGFS2_MFF_FSBLOCKS)
Packit Service 360c39
F(di_atime, .flags = LGFS2_MFF_SECS)
Packit Service 360c39
F(di_mtime, .flags = LGFS2_MFF_SECS)
Packit Service 360c39
F(di_ctime, .flags = LGFS2_MFF_SECS)
Packit Service 360c39
F(di_major, .flags = LGFS2_MFF_MAJOR)
Packit Service 360c39
F(di_minor, .flags = LGFS2_MFF_MINOR)
Packit Service 360c39
FP(di_goal_meta, .points_to = ANY_GFS2_BLOCK | (1 << LGFS2_MT_FREE))
Packit Service 360c39
FP(di_goal_data, .points_to = ANY_GFS2_BLOCK | (1 << LGFS2_MT_FREE))
Packit Service 360c39
F(di_generation)
Packit Service 360c39
F(di_flags, .flags = LGFS2_MFF_MASK, .symtab=lgfs2_di_flags, .nsyms=ARRAY_SIZE(lgfs2_di_flags))
Packit Service 360c39
F(di_payload_format)
Packit Service 360c39
RF(__pad1)
Packit Service 360c39
F(di_height)
Packit Service 360c39
RF(__pad2)
Packit Service 360c39
RF(__pad3)
Packit Service 360c39
F(di_depth)
Packit Service 360c39
F(di_entries)
Packit Service 360c39
INR(__pad4, .points_to = (1 << LGFS2_MT_GFS2_DINODE))
Packit Service 360c39
FP(di_eattr, .points_to = (1 << LGFS2_MT_EA_ATTR)|(1 << LGFS2_MT_GFS2_INDIRECT))
Packit Service 360c39
F(di_atime_nsec, .flags = LGFS2_MFF_NSECS)
Packit Service 360c39
F(di_mtime_nsec, .flags = LGFS2_MFF_NSECS)
Packit Service 360c39
F(di_ctime_nsec, .flags = LGFS2_MFF_NSECS)
Packit Service 360c39
RF(di_reserved)
Packit Service 360c39
};
Packit Service 360c39
Packit Service 360c39
#undef STRUCT
Packit Service 360c39
#define STRUCT gfs_dinode
Packit Service 360c39
Packit Service 360c39
static const struct lgfs2_metafield gfs_dinode_fields[] = {
Packit Service 360c39
MH(di_header)
Packit Service 360c39
IN(di_num, .points_to = (1 << LGFS2_MT_GFS_DINODE))
Packit Service 360c39
F(di_mode, .flags = LGFS2_MFF_MODE)
Packit Service 360c39
F(di_uid, .flags = LGFS2_MFF_UID)
Packit Service 360c39
F(di_gid, .flags = LGFS2_MFF_GID)
Packit Service 360c39
F(di_nlink)
Packit Service 360c39
F(di_size, .flags = LGFS2_MFF_BYTES)
Packit Service 360c39
F(di_blocks, .flags = LGFS2_MFF_FSBLOCKS)
Packit Service 360c39
F(di_atime, .flags = LGFS2_MFF_SECS)
Packit Service 360c39
F(di_mtime, .flags = LGFS2_MFF_SECS)
Packit Service 360c39
F(di_ctime, .flags = LGFS2_MFF_SECS)
Packit Service 360c39
F(di_major, .flags = LGFS2_MFF_MAJOR)
Packit Service 360c39
F(di_minor, .flags = LGFS2_MFF_MINOR)
Packit Service 360c39
FP(di_rgrp, .points_to = LGFS2_MT_GFS_RGRP)
Packit Service 360c39
FP(di_goal_rgrp, .points_to = LGFS2_MT_GFS_RGRP)
Packit Service 360c39
F(di_goal_dblk)
Packit Service 360c39
F(di_goal_mblk)
Packit Service 360c39
F(di_flags, .flags = LGFS2_MFF_MASK, .symtab=lgfs2_di_flags, .nsyms=ARRAY_SIZE(lgfs2_di_flags))
Packit Service 360c39
F(di_payload_format)
Packit Service 360c39
F(di_type)
Packit Service 360c39
F(di_height)
Packit Service 360c39
F(di_incarn)
Packit Service 360c39
F(di_pad)
Packit Service 360c39
F(di_depth)
Packit Service 360c39
F(di_entries)
Packit Service 360c39
INR(di_next_unused, .points_to = (1 << LGFS2_MT_GFS_DINODE))
Packit Service 360c39
FP(di_eattr, .points_to = (1 << LGFS2_MT_EA_ATTR)|(1 << LGFS2_MT_GFS_INDIRECT))
Packit Service 360c39
F(di_reserved)
Packit Service 360c39
};
Packit Service 360c39
Packit Service 360c39
#undef STRUCT
Packit Service 360c39
struct gfs2_indirect { struct gfs2_meta_header in_header; };
Packit Service 360c39
#define STRUCT gfs2_indirect
Packit Service 360c39
Packit Service 360c39
static const struct lgfs2_metafield gfs2_indirect_fields[] = {
Packit Service 360c39
MH(in_header)
Packit Service 360c39
};
Packit Service 360c39
Packit Service 360c39
#undef STRUCT
Packit Service 360c39
#define STRUCT gfs_indirect
Packit Service 360c39
Packit Service 360c39
static const struct lgfs2_metafield gfs_indirect_fields[] = {
Packit Service 360c39
MH(in_header)
Packit Service 360c39
RF(in_reserved)
Packit Service 360c39
};
Packit Service 360c39
Packit Service 360c39
#undef STRUCT
Packit Service 360c39
#define STRUCT gfs2_leaf
Packit Service 360c39
Packit Service 360c39
static const struct lgfs2_metafield gfs2_leaf_fields[] = {
Packit Service 360c39
MH(lf_header)
Packit Service 360c39
F(lf_depth)
Packit Service 360c39
F(lf_entries)
Packit Service 360c39
F(lf_dirent_format)
Packit Service 360c39
F(lf_next)
Packit Service 360c39
#ifdef GFS2_HAS_LEAF_HINTS
Packit Service 360c39
FP(lf_inode, .points_to = (1 << LGFS2_MT_GFS2_DINODE))
Packit Service 360c39
F(lf_dist)
Packit Service 360c39
F(lf_nsec, .flags = LGFS2_MFF_NSECS)
Packit Service 360c39
F(lf_sec, .flags = LGFS2_MFF_SECS)
Packit Service 360c39
RF(lf_reserved2)
Packit Service 360c39
#else
Packit Service 360c39
RF(lf_reserved)
Packit Service 360c39
#endif
Packit Service 360c39
};
Packit Service 360c39
Packit Service 360c39
#undef STRUCT
Packit Service 360c39
struct gfs2_jrnl_data { struct gfs2_meta_header jd_header; };
Packit Service 360c39
#define STRUCT gfs2_jrnl_data
Packit Service 360c39
Packit Service 360c39
static const struct lgfs2_metafield gfs2_jdata_fields[] = {
Packit Service 360c39
MH(jd_header)
Packit Service 360c39
};
Packit Service 360c39
Packit Service 360c39
#undef STRUCT
Packit Service 360c39
#define STRUCT gfs2_log_header
Packit Service 360c39
Packit Service 360c39
static const struct lgfs2_metafield gfs2_log_header_fields[] = {
Packit Service 360c39
MH(lh_header)
Packit Service 360c39
F(lh_sequence)
Packit Service 360c39
F(lh_flags)
Packit Service 360c39
F(lh_tail)
Packit Service 360c39
F(lh_blkno)
Packit Service 360c39
F(lh_hash, .flags = LGFS2_MFF_CHECK)
Packit Service 360c39
#ifdef GFS2_HAS_LH_V2
Packit Service 360c39
F(lh_crc, .flags = LGFS2_MFF_CHECK)
Packit Service 360c39
F(lh_nsec, .flags = LGFS2_MFF_NSECS)
Packit Service 360c39
F(lh_sec, .flags = LGFS2_MFF_SECS)
Packit Service 360c39
FP(lh_addr, .points_to = (1 << LGFS2_MT_GFS2_LOG_BLOCK))
Packit Service 360c39
FP(lh_jinode, .points_to = (1 << LGFS2_MT_GFS2_DINODE))
Packit Service 360c39
FP(lh_statfs_addr, .points_to = (1 << LGFS2_MT_GFS2_DINODE))
Packit Service 360c39
FP(lh_quota_addr, .points_to = (1 << LGFS2_MT_GFS2_DINODE))
Packit Service 360c39
F(lh_local_total, .flags = LGFS2_MFF_FSBLOCKS)
Packit Service 360c39
F(lh_local_free, .flags = LGFS2_MFF_FSBLOCKS)
Packit Service 360c39
F(lh_local_dinodes, .flags = LGFS2_MFF_FSBLOCKS)
Packit Service 360c39
#endif
Packit Service 360c39
};
Packit Service 360c39
Packit Service 360c39
#undef STRUCT
Packit Service 360c39
#define STRUCT gfs_log_header
Packit Service 360c39
Packit Service 360c39
static const struct lgfs2_metafield gfs_log_header_fields[] = {
Packit Service 360c39
MH(lh_header)
Packit Service 360c39
F(lh_flags, .flags = LGFS2_MFF_MASK, .symtab = lgfs2_lh_flags, .nsyms = ARRAY_SIZE(lgfs2_lh_flags))
Packit Service 360c39
RF(lh_pad)
Packit Service 360c39
F(lh_first)
Packit Service 360c39
F(lh_sequence)
Packit Service 360c39
F(lh_tail)
Packit Service 360c39
F(lh_last_dump)
Packit Service 360c39
RF(lh_reserved)
Packit Service 360c39
};
Packit Service 360c39
Packit Service 360c39
#undef STRUCT
Packit Service 360c39
#define STRUCT gfs2_log_descriptor
Packit Service 360c39
Packit Service 360c39
static const struct lgfs2_metafield gfs2_log_desc_fields[] = {
Packit Service 360c39
MH(ld_header)
Packit Service 360c39
F(ld_type, .flags = LGFS2_MFF_ENUM, .symtab = lgfs2_ld_types, .nsyms = ARRAY_SIZE(lgfs2_ld_types))
Packit Service 360c39
F(ld_length, .flags = LGFS2_MFF_FSBLOCKS)
Packit Service 360c39
F(ld_data1)
Packit Service 360c39
F(ld_data2)
Packit Service 360c39
RF(ld_reserved)
Packit Service 360c39
};
Packit Service 360c39
Packit Service 360c39
#undef STRUCT
Packit Service 360c39
#define STRUCT gfs_log_descriptor
Packit Service 360c39
Packit Service 360c39
static const struct lgfs2_metafield gfs_log_desc_fields[] = {
Packit Service 360c39
MH(ld_header)
Packit Service 360c39
F(ld_type, .flags = LGFS2_MFF_ENUM, .symtab = lgfs2_ld1_types, .nsyms = ARRAY_SIZE(lgfs2_ld1_types))
Packit Service 360c39
F(ld_length, .flags = LGFS2_MFF_FSBLOCKS)
Packit Service 360c39
F(ld_data1)
Packit Service 360c39
F(ld_data2)
Packit Service 360c39
RF(ld_reserved)
Packit Service 360c39
};
Packit Service 360c39
Packit Service 360c39
#undef STRUCT
Packit Service 360c39
struct gfs2_log_block { struct gfs2_meta_header lb_header; };
Packit Service 360c39
#define STRUCT gfs2_log_block
Packit Service 360c39
Packit Service 360c39
static const struct lgfs2_metafield gfs2_log_block_fields[] = {
Packit Service 360c39
MH(lb_header)
Packit Service 360c39
};
Packit Service 360c39
Packit Service 360c39
#undef STRUCT
Packit Service 360c39
struct gfs2_ea_attr { struct gfs2_meta_header ea_header; };
Packit Service 360c39
#define STRUCT gfs2_ea_attr
Packit Service 360c39
Packit Service 360c39
static const struct lgfs2_metafield gfs2_ea_attr_fields[] = {
Packit Service 360c39
MH(ea_header)
Packit Service 360c39
};
Packit Service 360c39
Packit Service 360c39
#undef STRUCT
Packit Service 360c39
struct gfs2_ea_data { struct gfs2_meta_header ed_header; };
Packit Service 360c39
#define STRUCT gfs2_ea_data
Packit Service 360c39
Packit Service 360c39
static const struct lgfs2_metafield gfs2_ea_data_fields[] = {
Packit Service 360c39
MH(ed_header)
Packit Service 360c39
};
Packit Service 360c39
Packit Service 360c39
#undef STRUCT
Packit Service 360c39
#define STRUCT gfs2_quota_change
Packit Service 360c39
Packit Service 360c39
static const struct lgfs2_metafield gfs2_quota_change_fields[] = {
Packit Service 360c39
F(qc_change, .flags = LGFS2_MFF_FSBLOCKS)
Packit Service 360c39
F(qc_flags)
Packit Service 360c39
F(qc_id)
Packit Service 360c39
};
Packit Service 360c39
Packit Service 360c39
#undef STRUCT
Packit Service 360c39
#define STRUCT gfs2_dirent
Packit Service 360c39
Packit Service 360c39
static const struct lgfs2_metafield gfs2_dirent_fields[] = {
Packit Service 360c39
IN(de_inum, .points_to = (1 << LGFS2_MT_GFS_DINODE)|(1 << LGFS2_MT_GFS2_DINODE))
Packit Service 360c39
F(de_hash, .flags = LGFS2_MFF_CHECK)
Packit Service 360c39
F(de_rec_len, .flags = LGFS2_MFF_BYTES)
Packit Service 360c39
F(de_name_len, .flags = LGFS2_MFF_BYTES)
Packit Service 360c39
F(de_type)
Packit Service 360c39
#ifdef GFS2_HAS_DE_RAHEAD
Packit Service 360c39
F(de_rahead)
Packit Service 360c39
#ifdef GFS2_HAS_DE_COOKIE
Packit Service 360c39
F(de_cookie)
Packit Service 360c39
RF(pad3)
Packit Service 360c39
#else
Packit Service 360c39
RF(pad2)
Packit Service 360c39
#endif /* GFS2_HAS_DE_COOKIE */
Packit Service 360c39
#else
Packit Service 360c39
RF(__pad)
Packit Service 360c39
#endif /* GFS2_HAS_DE_RAHEAD */
Packit Service 360c39
};
Packit Service 360c39
Packit Service 360c39
#undef STRUCT
Packit Service 360c39
#define STRUCT gfs2_ea_header
Packit Service 360c39
Packit Service 360c39
static const struct lgfs2_metafield gfs2_ea_header_fields[] = {
Packit Service 360c39
F(ea_rec_len, .flags = LGFS2_MFF_BYTES)
Packit Service 360c39
F(ea_data_len, .flags = LGFS2_MFF_BYTES)
Packit Service 360c39
F(ea_name_len, .flags = LGFS2_MFF_BYTES)
Packit Service 360c39
F(ea_type)
Packit Service 360c39
F(ea_flags)
Packit Service 360c39
F(ea_num_ptrs)
Packit Service 360c39
RF(__pad)
Packit Service 360c39
};
Packit Service 360c39
Packit Service 360c39
#undef STRUCT
Packit Service 360c39
#define STRUCT gfs2_inum_range
Packit Service 360c39
Packit Service 360c39
static const struct lgfs2_metafield gfs2_inum_range_fields[] = {
Packit Service 360c39
F(ir_start)
Packit Service 360c39
F(ir_length)
Packit Service 360c39
};
Packit Service 360c39
Packit Service 360c39
#undef STRUCT
Packit Service 360c39
#define STRUCT gfs2_statfs_change
Packit Service 360c39
Packit Service 360c39
static const struct lgfs2_metafield gfs2_statfs_change_fields[] = {
Packit Service 360c39
F(sc_total, .flags = LGFS2_MFF_FSBLOCKS)
Packit Service 360c39
F(sc_free, .flags = LGFS2_MFF_FSBLOCKS)
Packit Service 360c39
F(sc_dinodes, .flags = LGFS2_MFF_FSBLOCKS)
Packit Service 360c39
};
Packit Service 360c39
Packit Service 360c39
#undef STRUCT
Packit Service 360c39
#define STRUCT gfs_jindex
Packit Service 360c39
Packit Service 360c39
static const struct lgfs2_metafield gfs_jindex_fields[] = {
Packit Service 360c39
FP(ji_addr, .points_to = (1 << LGFS2_MT_DATA))
Packit Service 360c39
F(ji_nsegment)
Packit Service 360c39
RF(ji_pad)
Packit Service 360c39
RF(ji_reserved)
Packit Service 360c39
};
Packit Service 360c39
Packit Service 360c39
#undef STRUCT
Packit Service 360c39
struct gfs_block_tag {
Packit Service 360c39
	uint64_t bt_blkno;      /* inplace block number */
Packit Service 360c39
	uint32_t bt_flags;      /* ?? */
Packit Service 360c39
	uint32_t bt_pad;
Packit Service 360c39
};
Packit Service 360c39
#define STRUCT gfs_block_tag
Packit Service 360c39
Packit Service 360c39
static const struct lgfs2_metafield gfs_block_tag_fields[] = {
Packit Service 360c39
FP(bt_blkno, .points_to = ANY_GFS_BLOCK)
Packit Service 360c39
RF(bt_flags)
Packit Service 360c39
RF(bt_pad)
Packit Service 360c39
};
Packit Service 360c39
Packit Service 360c39
const struct lgfs2_metadata lgfs2_metadata[] = {
Packit Service 360c39
	[LGFS2_MT_GFS2_SB] = {
Packit Service 360c39
		.versions = LGFS2_MD_GFS2,
Packit Service 360c39
		.header = 1,
Packit Service 360c39
		.mh_type = GFS2_METATYPE_SB,
Packit Service 360c39
		.mh_format = GFS2_FORMAT_SB,
Packit Service 360c39
		.name = "gfs2_sb",
Packit Service 360c39
		.fields = gfs2_sb_fields,
Packit Service 360c39
		.nfields = ARRAY_SIZE(gfs2_sb_fields),
Packit Service 360c39
		.size = sizeof(struct gfs2_sb),
Packit Service 360c39
	},
Packit Service 360c39
	[LGFS2_MT_GFS_SB] = {
Packit Service 360c39
		.versions = LGFS2_MD_GFS1,
Packit Service 360c39
		.header = 1,
Packit Service 360c39
		.mh_type = GFS2_METATYPE_SB,
Packit Service 360c39
		.mh_format = GFS_FORMAT_SB,
Packit Service 360c39
		.name = "gfs_sb",
Packit Service 360c39
		.fields = gfs_sb_fields,
Packit Service 360c39
		.nfields = ARRAY_SIZE(gfs_sb_fields),
Packit Service 360c39
		.size = sizeof(struct gfs_sb),
Packit Service 360c39
	},
Packit Service 360c39
	[LGFS2_MT_RINDEX] = {
Packit Service 360c39
		.versions = LGFS2_MD_GFS1 | LGFS2_MD_GFS2,
Packit Service 360c39
		.name = "rindex",
Packit Service 360c39
		.fields = gfs2_rindex_fields,
Packit Service 360c39
		.nfields = ARRAY_SIZE(gfs2_rindex_fields),
Packit Service 360c39
		.size = sizeof(struct gfs2_rindex),
Packit Service 360c39
	},
Packit Service 360c39
	[LGFS2_MT_GFS2_RGRP] = {
Packit Service 360c39
		.versions = LGFS2_MD_GFS2,
Packit Service 360c39
		.header = 1,
Packit Service 360c39
		.mh_type = GFS2_METATYPE_RG,
Packit Service 360c39
		.mh_format = GFS2_FORMAT_RG,
Packit Service 360c39
		.name = "gfs2_rgrp",
Packit Service 360c39
		.fields = gfs2_rgrp_fields,
Packit Service 360c39
		.nfields = ARRAY_SIZE(gfs2_rgrp_fields),
Packit Service 360c39
		.size = sizeof(struct gfs2_rgrp),
Packit Service 360c39
	},
Packit Service 360c39
	[LGFS2_MT_GFS_RGRP] = {
Packit Service 360c39
		.versions = LGFS2_MD_GFS1,
Packit Service 360c39
		.header = 1,
Packit Service 360c39
		.mh_type = GFS2_METATYPE_RG,
Packit Service 360c39
		.mh_format = GFS2_FORMAT_RG,
Packit Service 360c39
		.name = "gfs_rgrp",
Packit Service 360c39
		.fields = gfs_rgrp_fields,
Packit Service 360c39
		.nfields = ARRAY_SIZE(gfs_rgrp_fields),
Packit Service 360c39
		.size = sizeof(struct gfs_rgrp),
Packit Service 360c39
	},
Packit Service 360c39
	[LGFS2_MT_RGRP_BITMAP] = {
Packit Service 360c39
		.versions = LGFS2_MD_GFS1 | LGFS2_MD_GFS2,
Packit Service 360c39
		.header = 1,
Packit Service 360c39
		.mh_type = GFS2_METATYPE_RB,
Packit Service 360c39
		.mh_format = GFS2_FORMAT_RB,
Packit Service 360c39
		.name = "gfs2_rgrp_bitmap",
Packit Service 360c39
		.fields = gfs2_rgrp_bitmap_fields,
Packit Service 360c39
		.nfields = ARRAY_SIZE(gfs2_rgrp_bitmap_fields),
Packit Service 360c39
		.size = sizeof(struct gfs2_meta_header),
Packit Service 360c39
	},
Packit Service 360c39
	[LGFS2_MT_GFS2_DINODE] = {
Packit Service 360c39
		.versions = LGFS2_MD_GFS2,
Packit Service 360c39
		.header = 1,
Packit Service 360c39
		.mh_type = GFS2_METATYPE_DI,
Packit Service 360c39
		.mh_format = GFS2_FORMAT_DI,
Packit Service 360c39
		.name = "gfs2_dinode",
Packit Service 360c39
		.fields = gfs2_dinode_fields,
Packit Service 360c39
		.nfields = ARRAY_SIZE(gfs2_dinode_fields),
Packit Service 360c39
		.size = sizeof(struct gfs2_dinode),
Packit Service 360c39
	},
Packit Service 360c39
	[LGFS2_MT_GFS_DINODE] = {
Packit Service 360c39
		.versions = LGFS2_MD_GFS1,
Packit Service 360c39
		.header = 1,
Packit Service 360c39
		.mh_type = GFS2_METATYPE_DI,
Packit Service 360c39
		.mh_format = GFS2_FORMAT_DI,
Packit Service 360c39
		.name = "gfs_dinode",
Packit Service 360c39
		.fields = gfs_dinode_fields,
Packit Service 360c39
		.nfields = ARRAY_SIZE(gfs_dinode_fields),
Packit Service 360c39
		.size = sizeof(struct gfs_dinode),
Packit Service 360c39
	},
Packit Service 360c39
	[LGFS2_MT_GFS2_INDIRECT] = {
Packit Service 360c39
		.versions = LGFS2_MD_GFS2,
Packit Service 360c39
		.header = 1,
Packit Service 360c39
		.mh_type = GFS2_METATYPE_IN,
Packit Service 360c39
		.mh_format = GFS2_FORMAT_IN,
Packit Service 360c39
		.name = "gfs2_indirect",
Packit Service 360c39
		.fields = gfs2_indirect_fields,
Packit Service 360c39
		.nfields = ARRAY_SIZE(gfs2_indirect_fields),
Packit Service 360c39
		.size = sizeof(struct gfs2_meta_header),
Packit Service 360c39
	},
Packit Service 360c39
	[LGFS2_MT_GFS_INDIRECT] = {
Packit Service 360c39
		.versions = LGFS2_MD_GFS1,
Packit Service 360c39
		.header = 1,
Packit Service 360c39
		.mh_type = GFS2_METATYPE_IN,
Packit Service 360c39
		.mh_format = GFS2_FORMAT_IN,
Packit Service 360c39
		.name = "gfs_indirect",
Packit Service 360c39
		.fields = gfs_indirect_fields,
Packit Service 360c39
		.nfields = ARRAY_SIZE(gfs_indirect_fields),
Packit Service 360c39
		.size = sizeof(struct gfs_indirect),
Packit Service 360c39
	},
Packit Service 360c39
	[LGFS2_MT_DIR_LEAF] = {
Packit Service 360c39
		.versions = LGFS2_MD_GFS1 | LGFS2_MD_GFS2,
Packit Service 360c39
		.header = 1,
Packit Service 360c39
		.mh_type = GFS2_METATYPE_LF,
Packit Service 360c39
		.mh_format = GFS2_FORMAT_LF,
Packit Service 360c39
		.name = "gfs2_leaf",
Packit Service 360c39
		.fields = gfs2_leaf_fields,
Packit Service 360c39
		.nfields = ARRAY_SIZE(gfs2_leaf_fields),
Packit Service 360c39
		.size = sizeof(struct gfs2_leaf),
Packit Service 360c39
	},
Packit Service 360c39
	[LGFS2_MT_JRNL_DATA] = {
Packit Service 360c39
		.versions = LGFS2_MD_GFS1 | LGFS2_MD_GFS2,
Packit Service 360c39
		.header = 1,
Packit Service 360c39
		.mh_type = GFS2_METATYPE_JD,
Packit Service 360c39
		.mh_format = GFS2_FORMAT_JD,
Packit Service 360c39
		.name = "gfs2_jdata",
Packit Service 360c39
		.fields = gfs2_jdata_fields,
Packit Service 360c39
		.nfields = ARRAY_SIZE(gfs2_jdata_fields),
Packit Service 360c39
		.size = sizeof(struct gfs2_meta_header),
Packit Service 360c39
	},
Packit Service 360c39
	[LGFS2_MT_GFS2_LOG_HEADER] = {
Packit Service 360c39
		.versions = LGFS2_MD_GFS2,
Packit Service 360c39
		.header = 1,
Packit Service 360c39
		.mh_type = GFS2_METATYPE_LH,
Packit Service 360c39
		.mh_format = GFS2_FORMAT_LH,
Packit Service 360c39
		.name = "gfs2_log_header",
Packit Service 360c39
		.fields = gfs2_log_header_fields,
Packit Service 360c39
		.nfields = ARRAY_SIZE(gfs2_log_header_fields),
Packit Service 360c39
		.size = sizeof(struct gfs2_log_header),
Packit Service 360c39
	},
Packit Service 360c39
	[LGFS2_MT_GFS_LOG_HEADER] = {
Packit Service 360c39
		.versions = LGFS2_MD_GFS1,
Packit Service 360c39
		.header = 1,
Packit Service 360c39
		.mh_type = GFS2_METATYPE_LH,
Packit Service 360c39
		.mh_format = GFS2_FORMAT_LH,
Packit Service 360c39
		.name = "gfs_log_header",
Packit Service 360c39
		.fields = gfs_log_header_fields,
Packit Service 360c39
		.nfields = ARRAY_SIZE(gfs_log_header_fields),
Packit Service 360c39
		.size = sizeof(struct gfs_log_header),
Packit Service 360c39
	},
Packit Service 360c39
	[LGFS2_MT_GFS2_LOG_DESC] = {
Packit Service 360c39
		.versions = LGFS2_MD_GFS2,
Packit Service 360c39
		.header = 1,
Packit Service 360c39
		.mh_type = GFS2_METATYPE_LD,
Packit Service 360c39
		.mh_format = GFS2_FORMAT_LD,
Packit Service 360c39
		.name = "gfs2_log_desc",
Packit Service 360c39
		.fields = gfs2_log_desc_fields,
Packit Service 360c39
		.nfields = ARRAY_SIZE(gfs2_log_desc_fields),
Packit Service 360c39
		.size = sizeof(struct gfs2_log_descriptor),
Packit Service 360c39
	},
Packit Service 360c39
	[LGFS2_MT_GFS_LOG_DESC] = {
Packit Service 360c39
		.versions = LGFS2_MD_GFS1,
Packit Service 360c39
		.header = 1,
Packit Service 360c39
		.mh_type = GFS2_METATYPE_LD,
Packit Service 360c39
		.mh_format = GFS2_FORMAT_LD,
Packit Service 360c39
		.name = "gfs_log_desc",
Packit Service 360c39
		.fields = gfs_log_desc_fields,
Packit Service 360c39
		.nfields = ARRAY_SIZE(gfs_log_desc_fields),
Packit Service 360c39
		.size = sizeof(struct gfs_log_descriptor),
Packit Service 360c39
	},
Packit Service 360c39
	[LGFS2_MT_GFS2_LOG_BLOCK] = {
Packit Service 360c39
		.versions = LGFS2_MD_GFS2,
Packit Service 360c39
		.header = 1,
Packit Service 360c39
		.mh_type = GFS2_METATYPE_LB,
Packit Service 360c39
		.mh_format = GFS2_FORMAT_LB,
Packit Service 360c39
		.name = "gfs2_log_block",
Packit Service 360c39
		.fields = gfs2_log_block_fields,
Packit Service 360c39
		.nfields = ARRAY_SIZE(gfs2_log_block_fields),
Packit Service 360c39
		.size = sizeof(struct gfs2_meta_header),
Packit Service 360c39
	},
Packit Service 360c39
	[LGFS2_MT_EA_ATTR] = {
Packit Service 360c39
		.versions = LGFS2_MD_GFS1 | LGFS2_MD_GFS2,
Packit Service 360c39
		.header = 1,
Packit Service 360c39
		.mh_type = GFS2_METATYPE_EA,
Packit Service 360c39
		.mh_format = GFS2_FORMAT_EA,
Packit Service 360c39
		.name = "gfs2_ea_attr",
Packit Service 360c39
		.fields = gfs2_ea_attr_fields,
Packit Service 360c39
		.nfields = ARRAY_SIZE(gfs2_ea_attr_fields),
Packit Service 360c39
		.size = sizeof(struct gfs2_meta_header),
Packit Service 360c39
	},
Packit Service 360c39
	[LGFS2_MT_EA_DATA] = {
Packit Service 360c39
		.versions = LGFS2_MD_GFS1 | LGFS2_MD_GFS2,
Packit Service 360c39
		.header = 1,
Packit Service 360c39
		.mh_type = GFS2_METATYPE_ED,
Packit Service 360c39
		.mh_format = GFS2_FORMAT_ED,
Packit Service 360c39
		.name = "gfs2_ea_data",
Packit Service 360c39
		.fields = gfs2_ea_data_fields,
Packit Service 360c39
		.nfields = ARRAY_SIZE(gfs2_ea_data_fields),
Packit Service 360c39
		.size = sizeof(struct gfs2_meta_header),
Packit Service 360c39
	},
Packit Service 360c39
	[LGFS2_MT_GFS2_QUOTA_CHANGE] = {
Packit Service 360c39
		.versions = LGFS2_MD_GFS2,
Packit Service 360c39
		.name = "gfs2_quota_change",
Packit Service 360c39
		.fields = gfs2_quota_change_fields,
Packit Service 360c39
		.nfields = ARRAY_SIZE(gfs2_quota_change_fields),
Packit Service 360c39
		.size = sizeof(struct gfs2_quota_change),
Packit Service 360c39
	},
Packit Service 360c39
	[LGFS2_MT_DIRENT] = {
Packit Service 360c39
		.versions = LGFS2_MD_GFS1 | LGFS2_MD_GFS2,
Packit Service 360c39
		.name = "gfs2_dirent",
Packit Service 360c39
		.fields = gfs2_dirent_fields,
Packit Service 360c39
		.nfields = ARRAY_SIZE(gfs2_dirent_fields),
Packit Service 360c39
		.size = sizeof(struct gfs2_dirent),
Packit Service 360c39
	},
Packit Service 360c39
	[LGFS2_MT_EA_HEADER] = {
Packit Service 360c39
		.versions = LGFS2_MD_GFS1 | LGFS2_MD_GFS2,
Packit Service 360c39
		.name = "gfs2_ea_header",
Packit Service 360c39
		.fields = gfs2_ea_header_fields,
Packit Service 360c39
		.nfields = ARRAY_SIZE(gfs2_ea_header_fields),
Packit Service 360c39
		.size = sizeof(struct gfs2_ea_header),
Packit Service 360c39
	},
Packit Service 360c39
	[LGFS2_MT_GFS2_INUM_RANGE] = {
Packit Service 360c39
		.versions = LGFS2_MD_GFS2,
Packit Service 360c39
		.name = "gfs2_inum_range",
Packit Service 360c39
		.fields = gfs2_inum_range_fields,
Packit Service 360c39
		.nfields = ARRAY_SIZE(gfs2_inum_range_fields),
Packit Service 360c39
		.size = sizeof(struct gfs2_inum_range),
Packit Service 360c39
	},
Packit Service 360c39
	[LGFS2_MT_STATFS_CHANGE] = {
Packit Service 360c39
		.versions = LGFS2_MD_GFS1 | LGFS2_MD_GFS2,
Packit Service 360c39
		.name = "gfs2_statfs_change",
Packit Service 360c39
		.fields = gfs2_statfs_change_fields,
Packit Service 360c39
		.nfields = ARRAY_SIZE(gfs2_statfs_change_fields),
Packit Service 360c39
		.size = sizeof(struct gfs2_statfs_change),
Packit Service 360c39
	},
Packit Service 360c39
	[LGFS2_MT_GFS_JINDEX] = {
Packit Service 360c39
		.versions = LGFS2_MD_GFS1,
Packit Service 360c39
		.name = "gfs_jindex",
Packit Service 360c39
		.fields = gfs_jindex_fields,
Packit Service 360c39
		.nfields = ARRAY_SIZE(gfs_jindex_fields),
Packit Service 360c39
		.size = sizeof(struct gfs_jindex),
Packit Service 360c39
	},
Packit Service 360c39
	[LGFS2_MT_GFS_BLOCK_TAG] = {
Packit Service 360c39
		.versions = LGFS2_MD_GFS1,
Packit Service 360c39
		.name = "gfs_block_tag",
Packit Service 360c39
		.fields = gfs_block_tag_fields,
Packit Service 360c39
		.nfields = ARRAY_SIZE(gfs_block_tag_fields),
Packit Service 360c39
		.size = sizeof(struct gfs_block_tag),
Packit Service 360c39
	},
Packit Service 360c39
	[LGFS2_MT_DATA] = {
Packit Service 360c39
		.versions = LGFS2_MD_GFS1 | LGFS2_MD_GFS2,
Packit Service 360c39
		.name = "data",
Packit Service 360c39
	},
Packit Service 360c39
	[LGFS2_MT_FREE] = {
Packit Service 360c39
		.versions = LGFS2_MD_GFS1 | LGFS2_MD_GFS2,
Packit Service 360c39
		.name = "free",
Packit Service 360c39
	},
Packit Service 360c39
};
Packit Service 360c39
Packit Service 360c39
const unsigned lgfs2_metadata_size = ARRAY_SIZE(lgfs2_metadata);
Packit Service 360c39
Packit Service 360c39
const struct lgfs2_metafield *lgfs2_find_mfield_name(const char *name, const struct lgfs2_metadata *mtype)
Packit Service 360c39
{
Packit Service 360c39
	int j;
Packit Service 360c39
	const struct lgfs2_metafield *f;
Packit Service 360c39
Packit Service 360c39
	for (j = 0; j < mtype->nfields; j++) {
Packit Service 360c39
		f = &mtype->fields[j];
Packit Service 360c39
		if (strcmp(f->name, name) == 0)
Packit Service 360c39
			return f;
Packit Service 360c39
	}
Packit Service 360c39
	return NULL;
Packit Service 360c39
}
Packit Service 360c39
Packit Service 360c39
static int check_metadata_sizes(void)
Packit Service 360c39
{
Packit Service 360c39
	unsigned offset;
Packit Service 360c39
	int i, j;
Packit Service 360c39
	int ret = 0;
Packit Service 360c39
Packit Service 360c39
	for (i = 0; i < lgfs2_metadata_size; i++) {
Packit Service 360c39
		const struct lgfs2_metadata *m = &lgfs2_metadata[i];
Packit Service 360c39
		offset = 0;
Packit Service 360c39
		for (j = 0; j < m->nfields; j++) {
Packit Service 360c39
			const struct lgfs2_metafield *f = &m->fields[j];
Packit Service 360c39
			if (f->offset != offset) {
Packit Service 360c39
				fprintf(stderr, "%s: %s: offset is %u, expected %u\n", m->name, f->name, f->offset, offset);
Packit Service 360c39
				ret = -1;
Packit Service 360c39
			}
Packit Service 360c39
			offset += f->length;
Packit Service 360c39
		}
Packit Service 360c39
		if (offset != m->size) {
Packit Service 360c39
			fprintf(stderr, "%s: size mismatch between struct %u and fields %u\n", m->name, m->size, offset);
Packit Service 360c39
			ret = -1;
Packit Service 360c39
		}
Packit Service 360c39
	}
Packit Service 360c39
Packit Service 360c39
	return ret;
Packit Service 360c39
}
Packit Service 360c39
Packit Service 360c39
static int check_symtab(void)
Packit Service 360c39
{
Packit Service 360c39
	int i, j;
Packit Service 360c39
	int ret = 0;
Packit Service 360c39
Packit Service 360c39
	for (i = 0; i < lgfs2_metadata_size; i++) {
Packit Service 360c39
		const struct lgfs2_metadata *m = &lgfs2_metadata[i];
Packit Service 360c39
		for (j = 0; j < m->nfields; j++) {
Packit Service 360c39
			const struct lgfs2_metafield *f = &m->fields[j];
Packit Service 360c39
			if (f->flags & (LGFS2_MFF_MASK|LGFS2_MFF_ENUM)) {
Packit Service 360c39
				if (f->symtab == NULL) {
Packit Service 360c39
					fprintf(stderr, "%s: Missing symtab for %s\n", m->name, f->name);
Packit Service 360c39
					ret = -1;
Packit Service 360c39
				}
Packit Service 360c39
			}
Packit Service 360c39
			if (f->symtab) {
Packit Service 360c39
				if (!(f->flags & (LGFS2_MFF_MASK|LGFS2_MFF_ENUM))) {
Packit Service 360c39
					fprintf(stderr, "%s: Symtab for non-enum and non-mask field %s\n", m->name, f->name);
Packit Service 360c39
					ret = -1;
Packit Service 360c39
				}
Packit Service 360c39
			}
Packit Service 360c39
		}
Packit Service 360c39
	}
Packit Service 360c39
Packit Service 360c39
	return ret;
Packit Service 360c39
}
Packit Service 360c39
Packit Service 360c39
static int check_ptrs(void)
Packit Service 360c39
{
Packit Service 360c39
	int i, j;
Packit Service 360c39
	int ret = 0;
Packit Service 360c39
Packit Service 360c39
	for (i = 0; i < lgfs2_metadata_size; i++) {
Packit Service 360c39
		const struct lgfs2_metadata *m = &lgfs2_metadata[i];
Packit Service 360c39
		for (j = 0; j < m->nfields; j++) {
Packit Service 360c39
			const struct lgfs2_metafield *f = &m->fields[j];
Packit Service 360c39
			if ((f->flags & LGFS2_MFF_POINTER) && !f->points_to) {
Packit Service 360c39
				fprintf(stderr, "%s: Pointer entry %s has no destination\n", m->name, f->name);
Packit Service 360c39
				ret = -1;
Packit Service 360c39
			}
Packit Service 360c39
		}
Packit Service 360c39
	}
Packit Service 360c39
Packit Service 360c39
	return ret;
Packit Service 360c39
}
Packit Service 360c39
Packit Service 360c39
int lgfs2_selfcheck(void)
Packit Service 360c39
{
Packit Service 360c39
	int ret = 0;
Packit Service 360c39
Packit Service 360c39
	ret |= check_metadata_sizes();
Packit Service 360c39
	ret |= check_symtab();
Packit Service 360c39
	ret |= check_ptrs();
Packit Service 360c39
Packit Service 360c39
	return ret;
Packit Service 360c39
}
Packit Service 360c39
Packit Service 360c39
const struct lgfs2_metadata *lgfs2_find_mtype(uint32_t mh_type, const unsigned versions)
Packit Service 360c39
{
Packit Service 360c39
	const struct lgfs2_metadata *m = lgfs2_metadata;
Packit Service 360c39
	unsigned n = 0;
Packit Service 360c39
Packit Service 360c39
	do {
Packit Service 360c39
		if ((m[n].versions & versions) && m[n].mh_type == mh_type)
Packit Service 360c39
			return &m[n];
Packit Service 360c39
		n++;
Packit Service 360c39
	} while (n < lgfs2_metadata_size);
Packit Service 360c39
Packit Service 360c39
	return NULL;
Packit Service 360c39
}
Packit Service 360c39
Packit Service 360c39
const struct lgfs2_metadata *lgfs2_find_mtype_name(const char *name, const unsigned versions)
Packit Service 360c39
{
Packit Service 360c39
	const struct lgfs2_metadata *m = lgfs2_metadata;
Packit Service 360c39
	unsigned n = 0;
Packit Service 360c39
Packit Service 360c39
	do {
Packit Service 360c39
		if ((m[n].versions & versions) && !strcmp(m[n].name, name))
Packit Service 360c39
			return &m[n];
Packit Service 360c39
		n++;
Packit Service 360c39
	} while (n < lgfs2_metadata_size);
Packit Service 360c39
Packit Service 360c39
	return NULL;
Packit Service 360c39
}
Packit Service 360c39
Packit Service 360c39
int lgfs2_field_str(char *str, const size_t size, const char *blk, const struct lgfs2_metafield *field, int hex)
Packit Service 360c39
{
Packit Service 360c39
	const char *fieldp = blk + field->offset;
Packit Service 360c39
Packit Service 360c39
	errno = EINVAL;
Packit Service 360c39
	if (str == NULL)
Packit Service 360c39
		return 1;
Packit Service 360c39
Packit Service 360c39
	if (field->flags & LGFS2_MFF_UUID) {
Packit Service 360c39
#ifdef GFS2_HAS_UUID
Packit Service 360c39
		char readable_uuid[36+1];
Packit Service 360c39
		uuid_t uuid;
Packit Service 360c39
Packit Service 360c39
		memcpy(uuid, fieldp, sizeof(uuid_t));
Packit Service 360c39
		uuid_unparse(uuid, readable_uuid);
Packit Service 360c39
		snprintf(str, size, "%s", readable_uuid);
Packit Service 360c39
#endif
Packit Service 360c39
	} else if (field->flags & LGFS2_MFF_STRING) {
Packit Service 360c39
		snprintf(str, size, "%s", fieldp);
Packit Service 360c39
	} else {
Packit Service 360c39
		switch(field->length) {
Packit Service 360c39
		case sizeof(uint8_t):
Packit Service 360c39
			snprintf(str, size, hex? "%"PRIx8 : "%"PRIu8, *(uint8_t *)fieldp);
Packit Service 360c39
			break;
Packit Service 360c39
		case sizeof(uint16_t):
Packit Service 360c39
			snprintf(str, size, hex? "%"PRIx16 : "%"PRIu16, be16_to_cpu(*(uint16_t *)fieldp));
Packit Service 360c39
			break;
Packit Service 360c39
		case sizeof(uint32_t):
Packit Service 360c39
			snprintf(str, size, hex? "%"PRIx32 : "%"PRIu32, be32_to_cpu(*(uint32_t *)fieldp));
Packit Service 360c39
			break;
Packit Service 360c39
		case sizeof(uint64_t):
Packit Service 360c39
			snprintf(str, size, hex? "%"PRIx64 : "%"PRIu64, be64_to_cpu(*(uint64_t *)fieldp));
Packit Service 360c39
			break;
Packit Service 360c39
		default:
Packit Service 360c39
			break;
Packit Service 360c39
		}
Packit Service 360c39
	}
Packit Service 360c39
	str[size - 1] = '\0';
Packit Service 360c39
	return 0;
Packit Service 360c39
}
Packit Service 360c39
Packit Service 360c39
int lgfs2_field_assign(char *blk, const struct lgfs2_metafield *field, const void *val)
Packit Service 360c39
{
Packit Service 360c39
	char *fieldp = blk + field->offset;
Packit Service 360c39
Packit Service 360c39
	if (field->flags & LGFS2_MFF_UUID) {
Packit Service 360c39
		memcpy(fieldp, val, 16);
Packit Service 360c39
		return 0;
Packit Service 360c39
	}
Packit Service 360c39
Packit Service 360c39
	errno = EINVAL;
Packit Service 360c39
	if (field->flags & LGFS2_MFF_STRING) {
Packit Service 360c39
		size_t len = strnlen(val, field->length);
Packit Service 360c39
Packit Service 360c39
		if (len >= field->length)
Packit Service 360c39
			return 1;
Packit Service 360c39
		strncpy(fieldp, val, field->length - 1);
Packit Service 360c39
		fieldp[field->length - 1] = '\0';
Packit Service 360c39
		return 0;
Packit Service 360c39
	}
Packit Service 360c39
Packit Service 360c39
	switch(field->length) {
Packit Service 360c39
	case sizeof(uint8_t):
Packit Service 360c39
		*fieldp = *(uint8_t *)val;
Packit Service 360c39
		return 0;
Packit Service 360c39
	case sizeof(uint16_t):
Packit Service 360c39
		*(uint16_t *)fieldp = cpu_to_be16(*(uint16_t *)val);
Packit Service 360c39
		return 0;
Packit Service 360c39
	case sizeof(uint32_t):
Packit Service 360c39
		*(uint32_t *)fieldp = cpu_to_be32(*(uint32_t *)val);
Packit Service 360c39
		return 0;
Packit Service 360c39
	case sizeof(uint64_t):
Packit Service 360c39
		*(uint64_t *)fieldp = cpu_to_be64(*(uint64_t *)val);
Packit Service 360c39
		return 0;
Packit Service 360c39
	default:
Packit Service 360c39
		/* Will never happen */
Packit Service 360c39
		break;
Packit Service 360c39
	}
Packit Service 360c39
Packit Service 360c39
	return 1;
Packit Service 360c39
}