Blame gfs2/edit/gfs2hex.c

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