Blame gfs2/edit/gfs2hex.c

Packit 6ef888
#include "clusterautoconfig.h"
Packit 6ef888
Packit 6ef888
#include <stdio.h>
Packit 6ef888
#include <stdlib.h>
Packit 6ef888
#include <string.h>
Packit 6ef888
#include <inttypes.h>
Packit 6ef888
#include <sys/types.h>
Packit 6ef888
#include <linux/types.h>
Packit 6ef888
#include <sys/stat.h>
Packit 6ef888
#include <fcntl.h>
Packit 6ef888
#include <unistd.h>
Packit 6ef888
#include <errno.h>
Packit 6ef888
#include <curses.h>
Packit 6ef888
Packit 6ef888
#include "hexedit.h"
Packit 6ef888
Packit 6ef888
#define WANT_GFS_CONVERSION_FUNCTIONS
Packit 6ef888
#include <linux/gfs2_ondisk.h>
Packit 6ef888
Packit 6ef888
#include "extended.h"
Packit 6ef888
#include "gfs2hex.h"
Packit 6ef888
#include "libgfs2.h"
Packit 6ef888
#ifdef GFS2_HAS_UUID
Packit 6ef888
#include <uuid.h>
Packit 6ef888
#endif
Packit 6ef888
Packit 6ef888
#define pv(struct, member, fmt, fmt2) do {				\
Packit 6ef888
		print_it("  "#member, fmt, fmt2, struct->member);	\
Packit 6ef888
	} while (FALSE);
Packit 6ef888
#define pv2(struct, member, fmt, fmt2) do {				\
Packit 6ef888
		print_it("  ", fmt, fmt2, struct->member);		\
Packit 6ef888
	} while (FALSE);
Packit 6ef888
Packit 6ef888
struct gfs2_sb sb;
Packit 6ef888
struct gfs2_dinode di;
Packit 6ef888
int line, termlines, modelines[DMODES];
Packit 6ef888
char edit_fmt[80];
Packit 6ef888
char estring[1024];
Packit 6ef888
char efield[64];
Packit 6ef888
int edit_mode = 0;
Packit 6ef888
int edit_row[DMODES], edit_col[DMODES];
Packit 6ef888
int edit_size[DMODES], last_entry_onscreen[DMODES];
Packit 6ef888
enum dsp_mode dmode = HEX_MODE; /* display mode */
Packit 6ef888
uint64_t block = 0;
Packit 6ef888
int blockhist = 0;
Packit 6ef888
struct iinfo *indirect;
Packit 6ef888
int indirect_blocks;
Packit 6ef888
struct gfs2_sbd sbd;
Packit 6ef888
uint64_t starting_blk;
Packit 6ef888
struct blkstack_info blockstack[BLOCK_STACK_SIZE];
Packit 6ef888
int identify = FALSE;
Packit 6ef888
uint64_t max_block = 0;
Packit 6ef888
int start_row[DMODES], end_row[DMODES], lines_per_row[DMODES];
Packit 6ef888
struct gfs_sb *sbd1;
Packit 6ef888
int gfs2_struct_type;
Packit 6ef888
unsigned int offset;
Packit 6ef888
struct indirect_info masterdir;
Packit 6ef888
struct gfs2_inum gfs1_quota_di;
Packit 6ef888
int print_entry_ndx;
Packit 6ef888
struct gfs2_inum gfs1_license_di;
Packit 6ef888
int screen_chunk_size = 512;
Packit 6ef888
uint64_t temp_blk;
Packit 6ef888
int color_scheme = 0;
Packit 6ef888
int struct_len;
Packit 6ef888
uint64_t dev_offset = 0;
Packit 6ef888
int editing = 0;
Packit 6ef888
int insert = 0;
Packit 6ef888
const char *termtype;
Packit 6ef888
WINDOW *wind;
Packit 6ef888
int dsplines = 0;
Packit 6ef888
Packit 6ef888
const char *block_type_str[15] = {
Packit 6ef888
	"Clump",
Packit 6ef888
	"Superblock",
Packit 6ef888
	"Resource Group Header",
Packit 6ef888
	"Resource Group Bitmap",
Packit 6ef888
	"Dinode",
Packit 6ef888
	"Indirect Block",
Packit 6ef888
	"Leaf",
Packit 6ef888
	"Journaled Data",
Packit 6ef888
	"Log Header",
Packit 6ef888
	"Log descriptor",
Packit 6ef888
	"Ext. attrib",
Packit 6ef888
	"Eattr Data",
Packit 6ef888
	"Log Buffer",
Packit 6ef888
	"Metatype 13",
Packit 6ef888
	"Quota Change",
Packit 6ef888
};
Packit 6ef888
Packit 6ef888
void eol(int col) /* end of line */
Packit 6ef888
{
Packit 6ef888
	if (termlines) {
Packit 6ef888
		line++;
Packit 6ef888
		move(line, col);
Packit 6ef888
	} else {
Packit 6ef888
		printf("\n");
Packit 6ef888
		for (; col > 0; col--)
Packit 6ef888
			printf(" ");
Packit 6ef888
	}
Packit 6ef888
}
Packit 6ef888
Packit 6ef888
void print_gfs2(const char *fmt, ...)
Packit 6ef888
{
Packit 6ef888
	va_list args;
Packit 6ef888
	char string[PATH_MAX];
Packit 6ef888
	
Packit 6ef888
	memset(string, 0, sizeof(string));
Packit 6ef888
	va_start(args, fmt);
Packit 6ef888
	vsprintf(string, fmt, args);
Packit 6ef888
	if (termlines)
Packit 6ef888
		printw("%s", string);
Packit 6ef888
	else
Packit 6ef888
		printf("%s", string);
Packit 6ef888
	va_end(args);
Packit 6ef888
}
Packit 6ef888
Packit 6ef888
static void check_highlight(int highlight)
Packit 6ef888
{
Packit 6ef888
	if (!termlines || line >= termlines) /* If printing or out of bounds */
Packit 6ef888
		return;
Packit 6ef888
	if (dmode == HEX_MODE) {
Packit 6ef888
		if (line == (edit_row[dmode] * lines_per_row[dmode]) + 4) {
Packit 6ef888
			if (highlight) {
Packit 6ef888
				COLORS_HIGHLIGHT;
Packit 6ef888
				last_entry_onscreen[dmode] = print_entry_ndx;
Packit 6ef888
			} else
Packit 6ef888
				COLORS_NORMAL;
Packit 6ef888
		}
Packit 6ef888
	} else {
Packit 6ef888
		if ((line * lines_per_row[dmode]) - 4 == 
Packit 6ef888
			(edit_row[dmode] - start_row[dmode]) * lines_per_row[dmode]) {
Packit 6ef888
			if (highlight) {
Packit 6ef888
				COLORS_HIGHLIGHT;
Packit 6ef888
				last_entry_onscreen[dmode] = print_entry_ndx;
Packit 6ef888
			}
Packit 6ef888
			else
Packit 6ef888
				COLORS_NORMAL;
Packit 6ef888
		}
Packit 6ef888
	}
Packit 6ef888
}
Packit 6ef888
Packit 6ef888
void print_it(const char *label, const char *fmt, const char *fmt2, ...)
Packit 6ef888
{
Packit 6ef888
	va_list args;
Packit 6ef888
	char tmp_string[NAME_MAX];
Packit 6ef888
	const char *fmtstring;
Packit 6ef888
	int decimalsize;
Packit 6ef888
Packit 6ef888
	if (!termlines || line < termlines) {
Packit 6ef888
		va_start(args, fmt2);
Packit 6ef888
		check_highlight(TRUE);
Packit 6ef888
		if (termlines) {
Packit 6ef888
			move(line,0);
Packit 6ef888
			printw("%s", label);
Packit 6ef888
			move(line,24);
Packit 6ef888
		} else {
Packit 6ef888
			if (!strcmp(label, "  "))
Packit 6ef888
				printf("%-11s", label);
Packit 6ef888
			else
Packit 6ef888
				printf("%-24s", label);
Packit 6ef888
		}
Packit 6ef888
		vsprintf(tmp_string, fmt, args);
Packit 6ef888
Packit 6ef888
		if (termlines)
Packit 6ef888
			printw("%s", tmp_string);
Packit 6ef888
		else
Packit 6ef888
			printf("%s", tmp_string);
Packit 6ef888
		check_highlight(FALSE);
Packit 6ef888
Packit 6ef888
		if (fmt2) {
Packit 6ef888
			decimalsize = strlen(tmp_string);
Packit 6ef888
			va_end(args);
Packit 6ef888
			va_start(args, fmt2);
Packit 6ef888
			vsprintf(tmp_string, fmt2, args);
Packit 6ef888
			check_highlight(TRUE);
Packit 6ef888
			if (termlines) {
Packit 6ef888
				move(line, 50);
Packit 6ef888
				printw("%s", tmp_string);
Packit 6ef888
			} else {
Packit 6ef888
				int i;
Packit 6ef888
				for (i=20 - decimalsize; i > 0; i--)
Packit 6ef888
					printf(" ");
Packit 6ef888
				printf("%s", tmp_string);
Packit 6ef888
			}
Packit 6ef888
			check_highlight(FALSE);
Packit 6ef888
		} else {
Packit 6ef888
			if (strstr(fmt,"X") || strstr(fmt,"x"))
Packit 6ef888
				fmtstring="(hex)";
Packit 6ef888
			else if (strstr(fmt,"s"))
Packit 6ef888
				fmtstring="";
Packit 6ef888
			else
Packit 6ef888
				fmtstring="(decimal)";
Packit 6ef888
			if (termlines) {
Packit 6ef888
				move(line, 50);
Packit 6ef888
				printw("%s", fmtstring);
Packit 6ef888
			}
Packit 6ef888
			else
Packit 6ef888
				printf("%s", fmtstring);
Packit 6ef888
		}
Packit 6ef888
		if (termlines) {
Packit 6ef888
			refresh();
Packit 6ef888
			if (line == (edit_row[dmode] * lines_per_row[dmode]) + 4) {
Packit 6ef888
				strncpy(efield, label + 2, 63); /* it's indented */
Packit 6ef888
				efield[63] = '\0';
Packit 6ef888
				strcpy(estring, tmp_string);
Packit 6ef888
				strncpy(edit_fmt, fmt, 79);
Packit 6ef888
				edit_fmt[79] = '\0';
Packit 6ef888
				edit_size[dmode] = strlen(estring);
Packit 6ef888
				COLORS_NORMAL;
Packit 6ef888
			}
Packit 6ef888
			last_entry_onscreen[dmode] = (line / lines_per_row[dmode]) - 4;
Packit 6ef888
		}
Packit 6ef888
		eol(0);
Packit 6ef888
		va_end(args);
Packit 6ef888
	}
Packit 6ef888
}
Packit 6ef888
Packit 6ef888
static int indirect_dirent(struct indirect_info *indir, char *ptr, int d)
Packit 6ef888
{
Packit 6ef888
	struct gfs2_dirent de;
Packit 6ef888
Packit 6ef888
	gfs2_dirent_in(&de, ptr);
Packit 6ef888
	if (de.de_rec_len < sizeof(struct gfs2_dirent) ||
Packit 6ef888
		de.de_rec_len > 4096 - sizeof(struct gfs2_dirent))
Packit 6ef888
		return -1;
Packit 6ef888
	if (de.de_inum.no_addr) {
Packit 6ef888
		indir->block = de.de_inum.no_addr;
Packit 6ef888
		memcpy(&indir->dirent[d].dirent, &de, sizeof(struct gfs2_dirent));
Packit 6ef888
		memcpy(&indir->dirent[d].filename,
Packit 6ef888
			   ptr + sizeof(struct gfs2_dirent), de.de_name_len);
Packit 6ef888
		indir->dirent[d].filename[de.de_name_len] = '\0';
Packit 6ef888
		indir->dirent[d].block = de.de_inum.no_addr;
Packit 6ef888
		indir->is_dir = TRUE;
Packit 6ef888
		indir->dirents++;
Packit 6ef888
	}
Packit 6ef888
	return de.de_rec_len;
Packit 6ef888
}
Packit 6ef888
Packit 6ef888
void do_dinode_extended(struct gfs2_dinode *dine, struct gfs2_buffer_head *lbh)
Packit 6ef888
{
Packit 6ef888
	unsigned int x, y, ptroff = 0;
Packit 6ef888
	uint64_t p, last;
Packit 6ef888
	int isdir = !!(S_ISDIR(dine->di_mode)) || 
Packit 6ef888
		(sbd.gfs1 && dine->__pad1 == GFS_FILE_DIR);
Packit 6ef888
Packit 6ef888
	indirect_blocks = 0;
Packit 6ef888
	memset(indirect, 0, sizeof(struct iinfo));
Packit 6ef888
	if (dine->di_height > 0) {
Packit 6ef888
		/* Indirect pointers */
Packit 6ef888
		for (x = sizeof(struct gfs2_dinode); x < sbd.bsize;
Packit 6ef888
			 x += sizeof(uint64_t)) {
Packit 6ef888
			p = be64_to_cpu(*(uint64_t *)(lbh->b_data + x));
Packit 6ef888
			if (p) {
Packit 6ef888
				indirect->ii[indirect_blocks].block = p;
Packit 6ef888
				indirect->ii[indirect_blocks].mp.mp_list[0] =
Packit 6ef888
					ptroff;
Packit 6ef888
				indirect->ii[indirect_blocks].is_dir = FALSE;
Packit 6ef888
				indirect->ii[indirect_blocks].ptroff =
Packit 6ef888
				              (x - sizeof(*dine)) / sizeof(uint64_t);
Packit 6ef888
				indirect_blocks++;
Packit 6ef888
			}
Packit 6ef888
			ptroff++;
Packit 6ef888
		}
Packit 6ef888
	}
Packit 6ef888
	else if (isdir && !(dine->di_flags & GFS2_DIF_EXHASH)) {
Packit 6ef888
		int skip = 0;
Packit 6ef888
Packit 6ef888
		/* Directory Entries: */
Packit 6ef888
		indirect->ii[0].dirents = 0;
Packit 6ef888
		indirect->ii[0].block = block;
Packit 6ef888
		indirect->ii[0].is_dir = TRUE;
Packit 6ef888
		for (x = sizeof(struct gfs2_dinode); x < sbd.bsize; x += skip) {
Packit 6ef888
			skip = indirect_dirent(indirect->ii, lbh->b_data + x,
Packit 6ef888
					       indirect->ii[0].dirents);
Packit 6ef888
			if (skip <= 0)
Packit 6ef888
				break;
Packit 6ef888
		}
Packit 6ef888
	}
Packit 6ef888
	else if (isdir &&
Packit 6ef888
			 (dine->di_flags & GFS2_DIF_EXHASH) &&
Packit 6ef888
			 dine->di_height == 0) {
Packit 6ef888
		/* Leaf Pointers: */
Packit 6ef888
		
Packit 6ef888
		last = be64_to_cpu(*(uint64_t *)(lbh->b_data +
Packit 6ef888
						 sizeof(struct gfs2_dinode)));
Packit 6ef888
    
Packit 6ef888
		for (x = sizeof(struct gfs2_dinode), y = 0;
Packit 6ef888
			 y < (1 << dine->di_depth);
Packit 6ef888
			 x += sizeof(uint64_t), y++) {
Packit 6ef888
			p = be64_to_cpu(*(uint64_t *)(lbh->b_data + x));
Packit 6ef888
Packit 6ef888
			if (p != last || ((y + 1) * sizeof(uint64_t) == dine->di_size)) {
Packit 6ef888
				struct gfs2_buffer_head *tmp_bh;
Packit 6ef888
				int skip = 0, direntcount = 0;
Packit 6ef888
				struct gfs2_leaf leaf;
Packit 6ef888
				unsigned int bufoffset;
Packit 6ef888
Packit 6ef888
				if (last >= max_block)
Packit 6ef888
					break;
Packit 6ef888
				tmp_bh = bread(&sbd, last);
Packit 6ef888
				gfs2_leaf_in(&leaf, tmp_bh->b_data);
Packit 6ef888
				indirect->ii[indirect_blocks].dirents = 0;
Packit 6ef888
				for (direntcount = 0, bufoffset = sizeof(struct gfs2_leaf);
Packit 6ef888
					 bufoffset < sbd.bsize;
Packit 6ef888
					 direntcount++, bufoffset += skip) {
Packit 6ef888
					skip = indirect_dirent(&indirect->ii[indirect_blocks],
Packit 6ef888
										   tmp_bh->b_data + bufoffset,
Packit 6ef888
										   direntcount);
Packit 6ef888
					if (skip <= 0)
Packit 6ef888
						break;
Packit 6ef888
				}
Packit 6ef888
				brelse(tmp_bh);
Packit 6ef888
				indirect->ii[indirect_blocks].block = last;
Packit 6ef888
				indirect_blocks++;
Packit 6ef888
				last = p;
Packit 6ef888
			} /* if not duplicate pointer */
Packit 6ef888
		} /* for indirect pointers found */
Packit 6ef888
	} /* if exhash */
Packit 6ef888
}/* do_dinode_extended */
Packit 6ef888
Packit 6ef888
/**
Packit 6ef888
 * Returns: next leaf block, if any, in a chain of leaf blocks
Packit 6ef888
 */
Packit 6ef888
uint64_t do_leaf_extended(char *dlebuf, struct iinfo *indir)
Packit 6ef888
{
Packit 6ef888
	int x, i;
Packit 6ef888
	struct gfs2_dirent de;
Packit 6ef888
Packit 6ef888
	x = 0;
Packit 6ef888
	memset(indir, 0, sizeof(*indir));
Packit 6ef888
	gfs2_leaf_in(&indir->ii[0].lf, dlebuf);
Packit 6ef888
	/* Directory Entries: */
Packit 6ef888
	for (i = sizeof(struct gfs2_leaf); i < sbd.bsize;
Packit 6ef888
	     i += de.de_rec_len) {
Packit 6ef888
		gfs2_dirent_in(&de, dlebuf + i);
Packit 6ef888
		if (de.de_inum.no_addr) {
Packit 6ef888
			indir->ii[0].block = de.de_inum.no_addr;
Packit 6ef888
			indir->ii[0].dirent[x].block = de.de_inum.no_addr;
Packit 6ef888
			memcpy(&indir->ii[0].dirent[x].dirent,
Packit 6ef888
			       &de, sizeof(struct gfs2_dirent));
Packit 6ef888
			memcpy(&indir->ii[0].dirent[x].filename,
Packit 6ef888
			       dlebuf + i + sizeof(struct gfs2_dirent),
Packit 6ef888
			       de.de_name_len);
Packit 6ef888
			indir->ii[0].dirent[x].filename[de.de_name_len] = '\0';
Packit 6ef888
			indir->ii[0].is_dir = TRUE;
Packit 6ef888
			indir->ii[0].dirents++;
Packit 6ef888
			x++;
Packit 6ef888
		}
Packit 6ef888
		if (de.de_rec_len <= sizeof(struct gfs2_dirent))
Packit 6ef888
			break;
Packit 6ef888
	}
Packit 6ef888
	return indir->ii[0].lf.lf_next;
Packit 6ef888
}
Packit 6ef888
Packit 6ef888
static void do_eattr_extended(struct gfs2_buffer_head *ebh)
Packit 6ef888
{
Packit 6ef888
	struct gfs2_ea_header ea;
Packit 6ef888
	unsigned int x;
Packit 6ef888
Packit 6ef888
	eol(0);
Packit 6ef888
	print_gfs2("Eattr Entries:");
Packit 6ef888
	eol(0);
Packit 6ef888
Packit 6ef888
	for (x = sizeof(struct gfs2_meta_header); x < sbd.bsize;
Packit 6ef888
	     x += ea.ea_rec_len)
Packit 6ef888
	{
Packit 6ef888
		eol(0);
Packit 6ef888
		gfs2_ea_header_in(&ea, ebh->b_data + x);
Packit 6ef888
		gfs2_ea_header_print(&ea, ebh->b_data + x +
Packit 6ef888
				     sizeof(struct gfs2_ea_header));
Packit 6ef888
	}
Packit 6ef888
}
Packit 6ef888
Packit 6ef888
static void gfs2_inum_print2(const char *title,struct gfs2_inum *no)
Packit 6ef888
{
Packit 6ef888
	if (termlines) {
Packit 6ef888
		check_highlight(TRUE);
Packit 6ef888
		move(line,2);
Packit 6ef888
		printw(title);
Packit 6ef888
		check_highlight(FALSE);
Packit 6ef888
	}
Packit 6ef888
	else
Packit 6ef888
		printf("  %s:",title);
Packit 6ef888
	pv2(no, no_formal_ino, "%llu", "0x%llx");
Packit 6ef888
	if (!termlines)
Packit 6ef888
		printf("        addr:");
Packit 6ef888
	pv2(no, no_addr, "%llu", "0x%llx");
Packit 6ef888
}
Packit 6ef888
Packit 6ef888
/**
Packit 6ef888
 * gfs2_sb_print2 - Print out a superblock
Packit 6ef888
 * @sb: the cpu-order buffer
Packit 6ef888
 */
Packit 6ef888
static void gfs2_sb_print2(struct gfs2_sb *sbp2)
Packit 6ef888
{
Packit 6ef888
	gfs2_meta_header_print(&sbp2->sb_header);
Packit 6ef888
Packit 6ef888
	pv(sbp2, sb_fs_format, "%u", "0x%x");
Packit 6ef888
	pv(sbp2, sb_multihost_format, "%u", "0x%x");
Packit 6ef888
Packit 6ef888
	if (sbd.gfs1)
Packit 6ef888
		pv(sbd1, sb_flags, "%u", "0x%x");
Packit 6ef888
	pv(sbp2, sb_bsize, "%u", "0x%x");
Packit 6ef888
	pv(sbp2, sb_bsize_shift, "%u", "0x%x");
Packit 6ef888
	if (sbd.gfs1) {
Packit 6ef888
		pv(sbd1, sb_seg_size, "%u", "0x%x");
Packit 6ef888
		gfs2_inum_print2("jindex ino", &sbd1->sb_jindex_di);
Packit 6ef888
		gfs2_inum_print2("rindex ino", &sbd1->sb_rindex_di);
Packit 6ef888
	}
Packit 6ef888
	else
Packit 6ef888
		gfs2_inum_print2("master dir", &sbp2->sb_master_dir);
Packit 6ef888
	gfs2_inum_print2("root dir  ", &sbp2->sb_root_dir);
Packit 6ef888
Packit 6ef888
	pv(sbp2, sb_lockproto, "%s", NULL);
Packit 6ef888
	pv(sbp2, sb_locktable, "%s", NULL);
Packit 6ef888
	if (sbd.gfs1) {
Packit 6ef888
		gfs2_inum_print2("quota ino ", &gfs1_quota_di);
Packit 6ef888
		gfs2_inum_print2("license   ", &gfs1_license_di);
Packit 6ef888
	}
Packit 6ef888
#ifdef GFS2_HAS_UUID
Packit 6ef888
	{
Packit 6ef888
	char readable_uuid[36+1];
Packit 6ef888
Packit 6ef888
	uuid_unparse(sbp2->sb_uuid, readable_uuid);
Packit 6ef888
	print_it("  sb_uuid", "%s", NULL, readable_uuid);
Packit 6ef888
	}
Packit 6ef888
#endif
Packit 6ef888
}
Packit 6ef888
Packit 6ef888
/**
Packit 6ef888
 * gfs1_rgrp_in - read in a gfs1 rgrp
Packit 6ef888
 */
Packit 6ef888
static void gfs1_rgrp_in(struct gfs_rgrp *rgrp, struct gfs2_buffer_head *rbh)
Packit 6ef888
{
Packit 6ef888
        struct gfs_rgrp *str = (struct gfs_rgrp *)rbh->b_data;
Packit 6ef888
Packit 6ef888
        gfs2_meta_header_in(&rgrp->rg_header, rbh->b_data);
Packit 6ef888
        rgrp->rg_flags = be32_to_cpu(str->rg_flags);
Packit 6ef888
        rgrp->rg_free = be32_to_cpu(str->rg_free);
Packit 6ef888
        rgrp->rg_useddi = be32_to_cpu(str->rg_useddi);
Packit 6ef888
        rgrp->rg_freedi = be32_to_cpu(str->rg_freedi);
Packit 6ef888
        gfs2_inum_in(&rgrp->rg_freedi_list, (char *)&str->rg_freedi_list);
Packit 6ef888
        rgrp->rg_usedmeta = be32_to_cpu(str->rg_usedmeta);
Packit 6ef888
        rgrp->rg_freemeta = be32_to_cpu(str->rg_freemeta);
Packit 6ef888
        memcpy(rgrp->rg_reserved, str->rg_reserved, 64);
Packit 6ef888
}
Packit 6ef888
Packit 6ef888
/**
Packit 6ef888
 * gfs_rgrp_print - Print out a resource group header
Packit 6ef888
 */
Packit 6ef888
static void gfs1_rgrp_print(struct gfs_rgrp *rg)
Packit 6ef888
{
Packit 6ef888
        gfs2_meta_header_print(&rg->rg_header);
Packit 6ef888
        pv(rg, rg_flags, "%u", "0x%x");
Packit 6ef888
        pv(rg, rg_free, "%u", "0x%x");
Packit 6ef888
        pv(rg, rg_useddi, "%u", "0x%x");
Packit 6ef888
        pv(rg, rg_freedi, "%u", "0x%x");
Packit 6ef888
        gfs2_inum_print(&rg->rg_freedi_list);
Packit 6ef888
Packit 6ef888
        pv(rg, rg_usedmeta, "%u", "0x%x");
Packit 6ef888
        pv(rg, rg_freemeta, "%u", "0x%x");
Packit 6ef888
}
Packit 6ef888
Packit 6ef888
int display_gfs2(struct gfs2_buffer_head *dbh)
Packit 6ef888
{
Packit 6ef888
	struct gfs2_meta_header mh;
Packit 6ef888
	struct gfs2_rgrp rg;
Packit 6ef888
	struct gfs2_leaf lf;
Packit 6ef888
	struct gfs_log_header lh1;
Packit 6ef888
	struct gfs2_log_header lh;
Packit 6ef888
	struct gfs2_log_descriptor ld;
Packit 6ef888
	struct gfs2_quota_change qc;
Packit 6ef888
Packit 6ef888
	uint32_t magic;
Packit 6ef888
Packit 6ef888
	magic = be32_to_cpu(*(uint32_t *)dbh->b_data);
Packit 6ef888
Packit 6ef888
	switch (magic)
Packit 6ef888
	{
Packit 6ef888
	case GFS2_MAGIC:
Packit 6ef888
		gfs2_meta_header_in(&mh, dbh->b_data);
Packit 6ef888
		if (mh.mh_type > GFS2_METATYPE_QC)
Packit 6ef888
			print_gfs2("Unknown metadata type");
Packit 6ef888
		else
Packit 6ef888
			print_gfs2("%s:", block_type_str[mh.mh_type]);
Packit 6ef888
		eol(0);
Packit 6ef888
Packit 6ef888
		switch (mh.mh_type)
Packit 6ef888
		{
Packit 6ef888
		case GFS2_METATYPE_SB:
Packit 6ef888
			gfs2_sb_in(&sbd.sd_sb, dbh->b_data);
Packit 6ef888
			gfs2_sb_print2(&sbd.sd_sb);
Packit 6ef888
			break;
Packit 6ef888
Packit 6ef888
		case GFS2_METATYPE_RG:
Packit 6ef888
			if (sbd.gfs1) {
Packit 6ef888
				struct gfs_rgrp rg1;
Packit 6ef888
Packit 6ef888
				gfs1_rgrp_in(&rg1, dbh);
Packit 6ef888
				gfs1_rgrp_print(&rg1);
Packit 6ef888
			} else {
Packit 6ef888
				gfs2_rgrp_in(&rg, dbh->b_data);
Packit 6ef888
				gfs2_rgrp_print(&rg;;
Packit 6ef888
			}
Packit 6ef888
			break;
Packit 6ef888
Packit 6ef888
		case GFS2_METATYPE_RB:
Packit 6ef888
			gfs2_meta_header_print(&mh);
Packit 6ef888
			break;
Packit 6ef888
Packit 6ef888
		case GFS2_METATYPE_DI:
Packit 6ef888
			gfs2_dinode_print(&di);
Packit 6ef888
			break;
Packit 6ef888
Packit 6ef888
		case GFS2_METATYPE_IN:
Packit 6ef888
			gfs2_meta_header_print(&mh);
Packit 6ef888
			break;
Packit 6ef888
Packit 6ef888
		case GFS2_METATYPE_LF:
Packit 6ef888
			gfs2_leaf_in(&lf, dbh->b_data);
Packit 6ef888
			gfs2_leaf_print(&lf);
Packit 6ef888
			break;
Packit 6ef888
Packit 6ef888
		case GFS2_METATYPE_JD:
Packit 6ef888
			gfs2_meta_header_print(&mh);
Packit 6ef888
			break;
Packit 6ef888
Packit 6ef888
		case GFS2_METATYPE_LH:
Packit 6ef888
			if (sbd.gfs1) {
Packit 6ef888
				gfs_log_header_in(&lh1, dbh);
Packit 6ef888
				gfs_log_header_print(&lh1;;
Packit 6ef888
			} else {
Packit 6ef888
				gfs2_log_header_in(&lh, dbh->b_data);
Packit 6ef888
				gfs2_log_header_print(&lh);
Packit 6ef888
			}
Packit 6ef888
			break;
Packit 6ef888
Packit 6ef888
		case GFS2_METATYPE_LD:
Packit 6ef888
			gfs2_log_descriptor_in(&ld, dbh->b_data);
Packit 6ef888
			gfs2_log_descriptor_print(&ld);
Packit 6ef888
			break;
Packit 6ef888
Packit 6ef888
		case GFS2_METATYPE_EA:
Packit 6ef888
			do_eattr_extended(dbh);
Packit 6ef888
			break;
Packit 6ef888
Packit 6ef888
		case GFS2_METATYPE_ED:
Packit 6ef888
			gfs2_meta_header_print(&mh);
Packit 6ef888
			break;
Packit 6ef888
Packit 6ef888
		case GFS2_METATYPE_LB:
Packit 6ef888
			gfs2_meta_header_print(&mh);
Packit 6ef888
			break;
Packit 6ef888
Packit 6ef888
		case GFS2_METATYPE_QC:
Packit 6ef888
			gfs2_quota_change_in(&qc, dbh->b_data);
Packit 6ef888
			gfs2_quota_change_print(&qc;;
Packit 6ef888
			break;
Packit 6ef888
Packit 6ef888
		default:
Packit 6ef888
			break;
Packit 6ef888
		}
Packit 6ef888
		break;
Packit 6ef888
Packit 6ef888
	default:
Packit 6ef888
		print_gfs2("Unknown block type");
Packit 6ef888
		eol(0);
Packit 6ef888
		break;
Packit 6ef888
	};
Packit 6ef888
	return(0);
Packit 6ef888
}