|
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 |
4a4d54 |
uint64_t num = *(uint64_t *)val;
|
|
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 |
4a4d54 |
*fieldp = (uint8_t)num;
|
|
Packit Service |
360c39 |
return 0;
|
|
Packit Service |
360c39 |
case sizeof(uint16_t):
|
|
Packit Service |
4a4d54 |
*(uint16_t *)fieldp = cpu_to_be16((uint16_t)num);
|
|
Packit Service |
360c39 |
return 0;
|
|
Packit Service |
360c39 |
case sizeof(uint32_t):
|
|
Packit Service |
4a4d54 |
*(uint32_t *)fieldp = cpu_to_be32((uint32_t)num);
|
|
Packit Service |
360c39 |
return 0;
|
|
Packit Service |
360c39 |
case sizeof(uint64_t):
|
|
Packit Service |
4a4d54 |
*(uint64_t *)fieldp = cpu_to_be64((uint64_t)num);
|
|
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 |
}
|