|
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 |
}
|