|
Packit |
6ef888 |
#include "clusterautoconfig.h"
|
|
Packit |
6ef888 |
|
|
Packit |
6ef888 |
#include <stdio.h>
|
|
Packit |
6ef888 |
#include <stdlib.h>
|
|
Packit |
6ef888 |
#include <ctype.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 |
#include <term.h>
|
|
Packit |
6ef888 |
#include <time.h>
|
|
Packit |
6ef888 |
#include <signal.h>
|
|
Packit |
6ef888 |
#include <sys/ioctl.h>
|
|
Packit |
6ef888 |
#include <sys/mount.h>
|
|
Packit |
6ef888 |
#include <dirent.h>
|
|
Packit |
6ef888 |
|
|
Packit |
6ef888 |
#include <linux/gfs2_ondisk.h>
|
|
Packit |
6ef888 |
#include "copyright.cf"
|
|
Packit |
6ef888 |
|
|
Packit |
6ef888 |
#include "hexedit.h"
|
|
Packit |
6ef888 |
#include "libgfs2.h"
|
|
Packit |
6ef888 |
#include "extended.h"
|
|
Packit |
6ef888 |
#include "gfs2hex.h"
|
|
Packit |
6ef888 |
|
|
Packit |
6ef888 |
extern uint64_t block;
|
|
Packit |
6ef888 |
|
|
Packit |
6ef888 |
static void print_block_details(struct iinfo *ind, int level, int cur_height,
|
|
Packit |
6ef888 |
int pndx, uint64_t file_offset);
|
|
Packit |
6ef888 |
|
|
Packit |
6ef888 |
static int get_height(void)
|
|
Packit |
6ef888 |
{
|
|
Packit |
6ef888 |
int cur_height = 0, i;
|
|
Packit |
6ef888 |
|
|
Packit |
6ef888 |
if (gfs2_struct_type != GFS2_METATYPE_DI) {
|
|
Packit |
6ef888 |
for (i = 0; i <= blockhist && i < 5; i++) {
|
|
Packit |
6ef888 |
if (blockstack[(blockhist - i) %
|
|
Packit |
6ef888 |
BLOCK_STACK_SIZE].gfs2_struct_type ==
|
|
Packit |
6ef888 |
GFS2_METATYPE_DI)
|
|
Packit |
6ef888 |
break;
|
|
Packit |
6ef888 |
cur_height++;
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
return cur_height;
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
|
|
Packit |
6ef888 |
static int _do_indirect_extended(char *diebuf, struct iinfo *iinf, int hgt)
|
|
Packit |
6ef888 |
{
|
|
Packit |
6ef888 |
unsigned int x, y;
|
|
Packit |
6ef888 |
off_t headoff;
|
|
Packit |
6ef888 |
uint64_t p;
|
|
Packit |
6ef888 |
int i_blocks;
|
|
Packit |
6ef888 |
|
|
Packit |
6ef888 |
i_blocks = 0;
|
|
Packit |
6ef888 |
for (x = 0; x < 512; x++) {
|
|
Packit |
6ef888 |
iinf->ii[x].is_dir = 0;
|
|
Packit |
6ef888 |
iinf->ii[x].height = 0;
|
|
Packit |
6ef888 |
iinf->ii[x].block = 0;
|
|
Packit |
6ef888 |
iinf->ii[x].dirents = 0;
|
|
Packit |
6ef888 |
memset(&iinf->ii[x].dirent, 0, sizeof(struct gfs2_dirents));
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
headoff = sbd.gfs1 ? sizeof(struct gfs_indirect) : sizeof(struct gfs2_meta_header);
|
|
Packit |
6ef888 |
for (x = headoff, y = 0; x < sbd.bsize; x += sizeof(uint64_t), y++) {
|
|
Packit |
6ef888 |
p = be64_to_cpu(*(uint64_t *)(diebuf + x));
|
|
Packit |
6ef888 |
if (p) {
|
|
Packit |
6ef888 |
iinf->ii[i_blocks].block = p;
|
|
Packit |
6ef888 |
iinf->ii[i_blocks].mp.mp_list[hgt] = i_blocks;
|
|
Packit |
6ef888 |
iinf->ii[i_blocks].is_dir = FALSE;
|
|
Packit |
6ef888 |
iinf->ii[i_blocks].ptroff = (x - headoff) / sizeof(uint64_t);
|
|
Packit |
6ef888 |
i_blocks++;
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
return i_blocks;
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
|
|
Packit |
6ef888 |
int do_indirect_extended(char *diebuf, struct iinfo *iinf)
|
|
Packit |
6ef888 |
{
|
|
Packit |
6ef888 |
return _do_indirect_extended(diebuf, iinf, get_height());
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
|
|
Packit |
6ef888 |
/* ------------------------------------------------------------------------ */
|
|
Packit |
6ef888 |
/* dinode_valid - check if we have a dinode in recent history */
|
|
Packit |
6ef888 |
/* ------------------------------------------------------------------------ */
|
|
Packit |
6ef888 |
static int dinode_valid(void)
|
|
Packit |
6ef888 |
{
|
|
Packit |
6ef888 |
int i;
|
|
Packit |
6ef888 |
|
|
Packit |
6ef888 |
if (gfs2_struct_type == GFS2_METATYPE_DI)
|
|
Packit |
6ef888 |
return 1;
|
|
Packit |
6ef888 |
for (i = 0; i <= blockhist && i < 5; i++) {
|
|
Packit |
6ef888 |
if (blockstack[(blockhist - i) %
|
|
Packit |
6ef888 |
BLOCK_STACK_SIZE].gfs2_struct_type ==
|
|
Packit |
6ef888 |
GFS2_METATYPE_DI)
|
|
Packit |
6ef888 |
return 1;
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
return 0;
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
|
|
Packit |
6ef888 |
static uint64_t metapath_to_lblock(struct metapath *mp, int hgt)
|
|
Packit |
6ef888 |
{
|
|
Packit |
6ef888 |
int h;
|
|
Packit |
6ef888 |
uint64_t lblock = 0;
|
|
Packit |
6ef888 |
uint64_t factor[GFS2_MAX_META_HEIGHT];
|
|
Packit |
6ef888 |
|
|
Packit |
6ef888 |
if (di.di_height < 2)
|
|
Packit |
6ef888 |
return mp->mp_list[0];
|
|
Packit |
6ef888 |
/* figure out multiplication factors for each height */
|
|
Packit |
6ef888 |
memset(&factor, 0, sizeof(factor));
|
|
Packit |
6ef888 |
factor[di.di_height - 1] = 1ull;
|
|
Packit |
6ef888 |
for (h = di.di_height - 2; h >= 0; h--)
|
|
Packit |
6ef888 |
factor[h] = factor[h + 1] * sbd.sd_inptrs;
|
|
Packit |
6ef888 |
for (h = 0; h <= hgt; h++)
|
|
Packit |
6ef888 |
lblock += (mp->mp_list[h] * factor[h]);
|
|
Packit |
6ef888 |
return lblock;
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
|
|
Packit |
6ef888 |
static int display_indirect(struct iinfo *ind, int indblocks, int level,
|
|
Packit |
6ef888 |
uint64_t startoff)
|
|
Packit |
6ef888 |
{
|
|
Packit |
6ef888 |
int start_line;
|
|
Packit |
6ef888 |
int cur_height = -1, pndx;
|
|
Packit |
6ef888 |
|
|
Packit |
6ef888 |
last_entry_onscreen[dmode] = 0;
|
|
Packit |
6ef888 |
if (!has_indirect_blocks())
|
|
Packit |
6ef888 |
return -1;
|
|
Packit |
6ef888 |
if (!level) {
|
|
Packit |
6ef888 |
if (gfs2_struct_type == GFS2_METATYPE_DI) {
|
|
Packit |
6ef888 |
if (S_ISDIR(di.di_mode))
|
|
Packit |
6ef888 |
print_gfs2("This directory contains %d indirect blocks",
|
|
Packit |
6ef888 |
indblocks);
|
|
Packit |
6ef888 |
else
|
|
Packit |
6ef888 |
print_gfs2("This inode contains %d indirect blocks",
|
|
Packit |
6ef888 |
indblocks);
|
|
Packit |
6ef888 |
} else
|
|
Packit |
6ef888 |
print_gfs2("This indirect block contains %d indirect blocks",
|
|
Packit |
6ef888 |
indblocks);
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
if (dinode_valid() && !S_ISDIR(di.di_mode)) {
|
|
Packit |
6ef888 |
/* See if we are on an inode or have one in history. */
|
|
Packit |
6ef888 |
if (level)
|
|
Packit |
6ef888 |
cur_height = level;
|
|
Packit |
6ef888 |
else {
|
|
Packit |
6ef888 |
cur_height = get_height();
|
|
Packit |
6ef888 |
print_gfs2(" (at height %d of %d)",
|
|
Packit |
6ef888 |
cur_height, di.di_height);
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
eol(0);
|
|
Packit |
6ef888 |
if (!level && indblocks) {
|
|
Packit |
6ef888 |
print_gfs2("Indirect blocks:");
|
|
Packit |
6ef888 |
eol(0);
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
start_line = line;
|
|
Packit |
6ef888 |
for (pndx = start_row[dmode];
|
|
Packit |
6ef888 |
(!termlines || pndx < termlines - start_line - 1
|
|
Packit |
6ef888 |
+ start_row[dmode]) && pndx < indblocks;
|
|
Packit |
6ef888 |
pndx++) {
|
|
Packit |
6ef888 |
uint64_t file_offset;
|
|
Packit |
6ef888 |
|
|
Packit |
6ef888 |
if (pndx && ind->ii[pndx].block == ind->ii[pndx - 1].block)
|
|
Packit |
6ef888 |
continue;
|
|
Packit |
6ef888 |
print_entry_ndx = pndx;
|
|
Packit |
6ef888 |
if (termlines) {
|
|
Packit |
6ef888 |
if (edit_row[dmode] >= 0 &&
|
|
Packit |
6ef888 |
line - start_line ==
|
|
Packit |
6ef888 |
edit_row[dmode] - start_row[dmode])
|
|
Packit |
6ef888 |
COLORS_HIGHLIGHT;
|
|
Packit |
6ef888 |
move(line, 1);
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
if (!termlines) {
|
|
Packit |
6ef888 |
int h;
|
|
Packit |
6ef888 |
|
|
Packit |
6ef888 |
for (h = 0; h < level; h++)
|
|
Packit |
6ef888 |
print_gfs2(" ");
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
print_gfs2("%d: 0x%"PRIx64" => ", pndx, ind->ii[pndx].ptroff);
|
|
Packit |
6ef888 |
if (termlines)
|
|
Packit |
6ef888 |
move(line,9);
|
|
Packit |
6ef888 |
print_gfs2("0x%"PRIx64" / %"PRId64, ind->ii[pndx].block,
|
|
Packit |
6ef888 |
ind->ii[pndx].block);
|
|
Packit |
6ef888 |
if (termlines) {
|
|
Packit |
6ef888 |
if (edit_row[dmode] >= 0 &&
|
|
Packit |
6ef888 |
line - start_line ==
|
|
Packit |
6ef888 |
edit_row[dmode] - start_row[dmode]) {
|
|
Packit |
6ef888 |
sprintf(estring, "%llx",
|
|
Packit |
6ef888 |
(unsigned long long)ind->ii[print_entry_ndx].block);
|
|
Packit |
6ef888 |
strcpy(edit_fmt, "%llx");
|
|
Packit |
6ef888 |
edit_size[dmode] = strlen(estring);
|
|
Packit |
6ef888 |
COLORS_NORMAL;
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
if (dinode_valid() && !S_ISDIR(di.di_mode)) {
|
|
Packit |
6ef888 |
float human_off;
|
|
Packit |
6ef888 |
char h;
|
|
Packit |
6ef888 |
|
|
Packit |
6ef888 |
file_offset = metapath_to_lblock(&ind->ii[pndx].mp,
|
|
Packit |
6ef888 |
cur_height) *
|
|
Packit |
6ef888 |
sbd.bsize;
|
|
Packit |
6ef888 |
print_gfs2(" ");
|
|
Packit |
6ef888 |
h = 'K';
|
|
Packit |
6ef888 |
human_off = (file_offset / 1024.0);
|
|
Packit |
6ef888 |
if (human_off > 1024.0) { h = 'M'; human_off /= 1024.0; }
|
|
Packit |
6ef888 |
if (human_off > 1024.0) { h = 'G'; human_off /= 1024.0; }
|
|
Packit |
6ef888 |
if (human_off > 1024.0) { h = 'T'; human_off /= 1024.0; }
|
|
Packit |
6ef888 |
if (human_off > 1024.0) { h = 'P'; human_off /= 1024.0; }
|
|
Packit |
6ef888 |
if (human_off > 1024.0) { h = 'E'; human_off /= 1024.0; }
|
|
Packit |
6ef888 |
print_gfs2("(data offset 0x%"PRIx64" / %"PRId64" / %6.2f%c)",
|
|
Packit |
6ef888 |
file_offset, file_offset, human_off, h);
|
|
Packit |
6ef888 |
print_gfs2(" ");
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
else
|
|
Packit |
6ef888 |
file_offset = 0;
|
|
Packit |
6ef888 |
if (dinode_valid() && !termlines &&
|
|
Packit |
6ef888 |
((level + 1 < di.di_height) ||
|
|
Packit |
6ef888 |
(S_ISDIR(di.di_mode) && level <= di.di_height))) {
|
|
Packit |
6ef888 |
print_block_details(ind, level, cur_height, pndx,
|
|
Packit |
6ef888 |
file_offset);
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
print_entry_ndx = pndx; /* restore after recursion */
|
|
Packit |
6ef888 |
eol(0);
|
|
Packit |
6ef888 |
} /* for each display row */
|
|
Packit |
6ef888 |
if (line >= 7) /* 7 because it was bumped at the end */
|
|
Packit |
6ef888 |
last_entry_onscreen[dmode] = line - 7;
|
|
Packit |
6ef888 |
eol(0);
|
|
Packit |
6ef888 |
end_row[dmode] = indblocks;
|
|
Packit |
6ef888 |
if (end_row[dmode] < last_entry_onscreen[dmode])
|
|
Packit |
6ef888 |
end_row[dmode] = last_entry_onscreen[dmode];
|
|
Packit |
6ef888 |
lines_per_row[dmode] = 1;
|
|
Packit |
6ef888 |
return 0;
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
|
|
Packit |
6ef888 |
static void print_inode_type(__be16 de_type)
|
|
Packit |
6ef888 |
{
|
|
Packit |
6ef888 |
if (sbd.gfs1) {
|
|
Packit |
6ef888 |
switch(de_type) {
|
|
Packit |
6ef888 |
case GFS_FILE_NON:
|
|
Packit |
6ef888 |
print_gfs2("Unknown");
|
|
Packit |
6ef888 |
break;
|
|
Packit |
6ef888 |
case GFS_FILE_REG:
|
|
Packit |
6ef888 |
print_gfs2("File ");
|
|
Packit |
6ef888 |
break;
|
|
Packit |
6ef888 |
case GFS_FILE_DIR:
|
|
Packit |
6ef888 |
print_gfs2("Dir ");
|
|
Packit |
6ef888 |
break;
|
|
Packit |
6ef888 |
case GFS_FILE_LNK:
|
|
Packit |
6ef888 |
print_gfs2("Symlink");
|
|
Packit |
6ef888 |
break;
|
|
Packit |
6ef888 |
case GFS_FILE_BLK:
|
|
Packit |
6ef888 |
print_gfs2("BlkDev ");
|
|
Packit |
6ef888 |
break;
|
|
Packit |
6ef888 |
case GFS_FILE_CHR:
|
|
Packit |
6ef888 |
print_gfs2("ChrDev ");
|
|
Packit |
6ef888 |
break;
|
|
Packit |
6ef888 |
case GFS_FILE_FIFO:
|
|
Packit |
6ef888 |
print_gfs2("Fifo ");
|
|
Packit |
6ef888 |
break;
|
|
Packit |
6ef888 |
case GFS_FILE_SOCK:
|
|
Packit |
6ef888 |
print_gfs2("Socket ");
|
|
Packit |
6ef888 |
break;
|
|
Packit |
6ef888 |
default:
|
|
Packit |
6ef888 |
print_gfs2("%04x ", de_type);
|
|
Packit |
6ef888 |
break;
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
return;
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
switch(de_type) {
|
|
Packit |
6ef888 |
case DT_UNKNOWN:
|
|
Packit |
6ef888 |
print_gfs2("Unknown");
|
|
Packit |
6ef888 |
break;
|
|
Packit |
6ef888 |
case DT_REG:
|
|
Packit |
6ef888 |
print_gfs2("File ");
|
|
Packit |
6ef888 |
break;
|
|
Packit |
6ef888 |
case DT_DIR:
|
|
Packit |
6ef888 |
print_gfs2("Dir ");
|
|
Packit |
6ef888 |
break;
|
|
Packit |
6ef888 |
case DT_LNK:
|
|
Packit |
6ef888 |
print_gfs2("Symlink");
|
|
Packit |
6ef888 |
break;
|
|
Packit |
6ef888 |
case DT_BLK:
|
|
Packit |
6ef888 |
print_gfs2("BlkDev ");
|
|
Packit |
6ef888 |
break;
|
|
Packit |
6ef888 |
case DT_CHR:
|
|
Packit |
6ef888 |
print_gfs2("ChrDev ");
|
|
Packit |
6ef888 |
break;
|
|
Packit |
6ef888 |
case DT_FIFO:
|
|
Packit |
6ef888 |
print_gfs2("Fifo ");
|
|
Packit |
6ef888 |
break;
|
|
Packit |
6ef888 |
case DT_SOCK:
|
|
Packit |
6ef888 |
print_gfs2("Socket ");
|
|
Packit |
6ef888 |
break;
|
|
Packit |
6ef888 |
default:
|
|
Packit |
6ef888 |
print_gfs2("%04x ", de_type);
|
|
Packit |
6ef888 |
break;
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
|
|
Packit |
6ef888 |
#ifdef GFS2_HAS_LEAF_HINTS
|
|
Packit |
6ef888 |
#define LEAF_HINT_FMTS "lf_inode: 0x%llx, lf_dist: %u, " \
|
|
Packit |
6ef888 |
"lf_nsec: %u, lf_sec: %llu, "
|
|
Packit |
6ef888 |
#define LEAF_HINT_FIELDS(lp) lp->lf_inode, lp->lf_dist, lp->lf_nsec, lp->lf_sec,
|
|
Packit |
6ef888 |
#else
|
|
Packit |
6ef888 |
#define LEAF_HINT_FMTS
|
|
Packit |
6ef888 |
#define LEAF_HINT_FIELDS(lp)
|
|
Packit |
6ef888 |
#endif
|
|
Packit |
6ef888 |
|
|
Packit |
6ef888 |
static int display_leaf(struct iinfo *ind)
|
|
Packit |
6ef888 |
{
|
|
Packit |
6ef888 |
struct gfs2_leaf *leaf = &ind->ii[0].lf;
|
|
Packit |
6ef888 |
int start_line, total_dirents = start_row[dmode];
|
|
Packit |
6ef888 |
int d;
|
|
Packit |
6ef888 |
|
|
Packit |
6ef888 |
eol(0);
|
|
Packit |
6ef888 |
if (gfs2_struct_type == GFS2_METATYPE_SB)
|
|
Packit |
6ef888 |
print_gfs2("The superblock has 2 directories");
|
|
Packit |
6ef888 |
else
|
|
Packit |
6ef888 |
print_gfs2("Directory block: lf_depth:%d, lf_entries:%d, "
|
|
Packit |
6ef888 |
LEAF_HINT_FMTS
|
|
Packit |
6ef888 |
"fmt:%d next=0x%llx (%d dirents).",
|
|
Packit |
6ef888 |
leaf->lf_depth, leaf->lf_entries,
|
|
Packit |
6ef888 |
LEAF_HINT_FIELDS(leaf)
|
|
Packit |
6ef888 |
leaf->lf_dirent_format,
|
|
Packit |
6ef888 |
leaf->lf_next,
|
|
Packit |
6ef888 |
ind->ii[0].dirents);
|
|
Packit |
6ef888 |
|
|
Packit |
6ef888 |
start_line = line;
|
|
Packit |
6ef888 |
for (d = start_row[dmode]; d < ind->ii[0].dirents; d++) {
|
|
Packit |
6ef888 |
if (termlines && d >= termlines - start_line - 2
|
|
Packit |
6ef888 |
+ start_row[dmode])
|
|
Packit |
6ef888 |
break;
|
|
Packit |
6ef888 |
total_dirents++;
|
|
Packit |
6ef888 |
if (ind->ii[0].dirents >= 1) {
|
|
Packit |
6ef888 |
eol(3);
|
|
Packit |
6ef888 |
if (termlines) {
|
|
Packit |
6ef888 |
if (edit_row[dmode] >=0 &&
|
|
Packit |
6ef888 |
line - start_line - 1 ==
|
|
Packit |
6ef888 |
edit_row[dmode] - start_row[dmode]) {
|
|
Packit |
6ef888 |
COLORS_HIGHLIGHT;
|
|
Packit |
6ef888 |
sprintf(estring, "%llx",
|
|
Packit |
6ef888 |
(unsigned long long)ind->ii[0].dirent[d].block);
|
|
Packit |
6ef888 |
strcpy(edit_fmt, "%llx");
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
print_gfs2("%d/%d [%08x] %lld/%"PRId64" (0x%llx/0x%"PRIx64") +%u: ",
|
|
Packit |
6ef888 |
total_dirents, d + 1,
|
|
Packit |
6ef888 |
ind->ii[0].dirent[d].dirent.de_hash,
|
|
Packit |
6ef888 |
ind->ii[0].dirent[d].dirent.de_inum.no_formal_ino,
|
|
Packit |
6ef888 |
ind->ii[0].dirent[d].block,
|
|
Packit |
6ef888 |
ind->ii[0].dirent[d].dirent.de_inum.no_formal_ino,
|
|
Packit |
6ef888 |
ind->ii[0].dirent[d].block,
|
|
Packit |
6ef888 |
#ifdef GFS2_HAS_DE_RAHEAD
|
|
Packit |
6ef888 |
(unsigned int)ind->ii[0].dirent[d].dirent.de_rahead
|
|
Packit |
6ef888 |
#else
|
|
Packit |
6ef888 |
0
|
|
Packit |
6ef888 |
#endif
|
|
Packit |
6ef888 |
);
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
print_inode_type(ind->ii[0].dirent[d].dirent.de_type);
|
|
Packit |
6ef888 |
print_gfs2(" %s", ind->ii[0].dirent[d].filename);
|
|
Packit |
6ef888 |
if (termlines) {
|
|
Packit |
6ef888 |
if (edit_row[dmode] >= 0 &&
|
|
Packit |
6ef888 |
line - start_line - 1 == edit_row[dmode] -
|
|
Packit |
6ef888 |
start_row[dmode])
|
|
Packit |
6ef888 |
COLORS_NORMAL;
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
if (line >= 4)
|
|
Packit |
6ef888 |
last_entry_onscreen[dmode] = line - 4;
|
|
Packit |
6ef888 |
eol(0);
|
|
Packit |
6ef888 |
end_row[dmode] = ind->ii[0].dirents;
|
|
Packit |
6ef888 |
if (end_row[dmode] < last_entry_onscreen[dmode])
|
|
Packit |
6ef888 |
end_row[dmode] = last_entry_onscreen[dmode];
|
|
Packit |
6ef888 |
return 0;
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
|
|
Packit |
6ef888 |
static void print_block_details(struct iinfo *ind, int level, int cur_height,
|
|
Packit |
6ef888 |
int pndx, uint64_t file_offset)
|
|
Packit |
6ef888 |
{
|
|
Packit |
6ef888 |
struct iinfo *more_indir;
|
|
Packit |
6ef888 |
int more_ind;
|
|
Packit |
6ef888 |
char *tmpbuf;
|
|
Packit |
6ef888 |
uint64_t thisblk;
|
|
Packit |
6ef888 |
|
|
Packit |
6ef888 |
thisblk = ind->ii[pndx].block;
|
|
Packit |
6ef888 |
more_indir = malloc(sizeof(struct iinfo));
|
|
Packit |
6ef888 |
if (!more_indir) {
|
|
Packit |
6ef888 |
fprintf(stderr, "Out of memory in function "
|
|
Packit |
6ef888 |
"display_indirect\n");
|
|
Packit |
6ef888 |
return;
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
tmpbuf = malloc(sbd.bsize);
|
|
Packit |
6ef888 |
if (!tmpbuf) {
|
|
Packit |
6ef888 |
fprintf(stderr, "Out of memory in function "
|
|
Packit |
6ef888 |
"display_indirect\n");
|
|
Packit |
6ef888 |
free(more_indir);
|
|
Packit |
6ef888 |
return;
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
while (thisblk) {
|
|
Packit |
6ef888 |
/* read in the desired block */
|
|
Packit |
6ef888 |
if (pread(sbd.device_fd, tmpbuf, sbd.bsize, thisblk * sbd.bsize) != sbd.bsize) {
|
|
Packit |
6ef888 |
fprintf(stderr, "bad read: %s from %s:%d: block %lld "
|
|
Packit |
6ef888 |
"(0x%llx)\n", strerror(errno), __FUNCTION__,
|
|
Packit |
6ef888 |
__LINE__,
|
|
Packit |
6ef888 |
(unsigned long long)ind->ii[pndx].block,
|
|
Packit |
6ef888 |
(unsigned long long)ind->ii[pndx].block);
|
|
Packit |
6ef888 |
exit(-1);
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
thisblk = 0;
|
|
Packit |
6ef888 |
memset(more_indir, 0, sizeof(struct iinfo));
|
|
Packit |
6ef888 |
if (S_ISDIR(di.di_mode) && level == di.di_height) {
|
|
Packit |
6ef888 |
thisblk = do_leaf_extended(tmpbuf, more_indir);
|
|
Packit |
6ef888 |
display_leaf(more_indir);
|
|
Packit |
6ef888 |
} else {
|
|
Packit |
6ef888 |
int x;
|
|
Packit |
6ef888 |
|
|
Packit |
6ef888 |
for (x = 0; x < 512; x++) {
|
|
Packit |
6ef888 |
memcpy(&more_indir->ii[x].mp,
|
|
Packit |
6ef888 |
&ind->ii[pndx].mp,
|
|
Packit |
6ef888 |
sizeof(struct metapath));
|
|
Packit |
6ef888 |
more_indir->ii[x].mp.mp_list[cur_height+1] = x;
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
more_ind = _do_indirect_extended(tmpbuf, more_indir,
|
|
Packit |
6ef888 |
cur_height + 1);
|
|
Packit |
6ef888 |
display_indirect(more_indir, more_ind, level + 1,
|
|
Packit |
6ef888 |
file_offset);
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
if (thisblk) {
|
|
Packit |
6ef888 |
eol(0);
|
|
Packit |
6ef888 |
if (termlines)
|
|
Packit |
6ef888 |
move(line,9);
|
|
Packit |
6ef888 |
print_gfs2("Continuation block 0x%"PRIx64" / %"PRId64,
|
|
Packit |
6ef888 |
thisblk, thisblk);
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
free(tmpbuf);
|
|
Packit |
6ef888 |
free(more_indir);
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
|
|
Packit |
6ef888 |
static void gfs_jindex_print(struct gfs_jindex *ji)
|
|
Packit |
6ef888 |
{
|
|
Packit |
6ef888 |
pv((unsigned long long)ji, ji_addr, "%llu", "0x%llx");
|
|
Packit |
6ef888 |
pv(ji, ji_nsegment, "%u", "0x%x");
|
|
Packit |
6ef888 |
pv(ji, ji_pad, "%u", "0x%x");
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
|
|
Packit |
6ef888 |
static int print_gfs_jindex(struct gfs2_inode *dij)
|
|
Packit |
6ef888 |
{
|
|
Packit |
6ef888 |
int error, start_line;
|
|
Packit |
6ef888 |
struct gfs_jindex ji;
|
|
Packit |
6ef888 |
char jbuf[sizeof(struct gfs_jindex)];
|
|
Packit |
6ef888 |
|
|
Packit |
6ef888 |
start_line = line;
|
|
Packit |
6ef888 |
print_gfs2("Journal index entries found: %lld.",
|
|
Packit |
6ef888 |
dij->i_di.di_size / sizeof(struct gfs_jindex));
|
|
Packit |
6ef888 |
eol(0);
|
|
Packit |
6ef888 |
lines_per_row[dmode] = 4;
|
|
Packit |
6ef888 |
for (print_entry_ndx=0; ; print_entry_ndx++) {
|
|
Packit |
6ef888 |
error = gfs2_readi(dij, (void *)&jbuf,
|
|
Packit |
6ef888 |
print_entry_ndx*sizeof(struct gfs_jindex),
|
|
Packit |
6ef888 |
sizeof(struct gfs_jindex));
|
|
Packit |
6ef888 |
gfs_jindex_in(&ji, jbuf);
|
|
Packit |
6ef888 |
if (!error) /* end of file */
|
|
Packit |
6ef888 |
break;
|
|
Packit |
6ef888 |
if (!termlines ||
|
|
Packit |
6ef888 |
(print_entry_ndx >= start_row[dmode] &&
|
|
Packit |
6ef888 |
((print_entry_ndx - start_row[dmode])+1) *
|
|
Packit |
6ef888 |
lines_per_row[dmode] <= termlines - start_line - 2)) {
|
|
Packit |
6ef888 |
if (edit_row[dmode] == print_entry_ndx) {
|
|
Packit |
6ef888 |
COLORS_HIGHLIGHT;
|
|
Packit |
6ef888 |
strcpy(efield, "ji_addr");
|
|
Packit |
6ef888 |
sprintf(estring, "%llx", (unsigned long long)ji.ji_addr);
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
print_gfs2("Journal #%d", print_entry_ndx);
|
|
Packit |
6ef888 |
eol(0);
|
|
Packit |
6ef888 |
if (edit_row[dmode] == print_entry_ndx)
|
|
Packit |
6ef888 |
COLORS_NORMAL;
|
|
Packit |
6ef888 |
gfs_jindex_print(&ji;;
|
|
Packit |
6ef888 |
last_entry_onscreen[dmode] = print_entry_ndx;
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
end_row[dmode] = print_entry_ndx;
|
|
Packit |
6ef888 |
return error;
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
|
|
Packit |
6ef888 |
static int print_gfs2_jindex(void)
|
|
Packit |
6ef888 |
{
|
|
Packit |
6ef888 |
int d, error;
|
|
Packit |
6ef888 |
struct gfs2_log_header head;
|
|
Packit |
6ef888 |
struct gfs2_inode *ip;
|
|
Packit |
6ef888 |
|
|
Packit |
6ef888 |
for (d = 0; d < indirect->ii[0].dirents; d++) {
|
|
Packit |
6ef888 |
if (strncmp(indirect->ii[0].dirent[d].filename, "journal", 7))
|
|
Packit |
6ef888 |
continue;
|
|
Packit |
6ef888 |
ip = lgfs2_inode_read(&sbd, indirect->ii[0].dirent[d].block);
|
|
Packit |
6ef888 |
print_gfs2("%s: 0x%-5"PRIx64" %lldMB ",
|
|
Packit |
6ef888 |
indirect->ii[0].dirent[d].filename,
|
|
Packit |
6ef888 |
indirect->ii[0].dirent[d].block,
|
|
Packit |
6ef888 |
ip->i_di.di_size / 1048576);
|
|
Packit |
6ef888 |
error = gfs2_find_jhead(ip, &head;;
|
|
Packit |
6ef888 |
if (error) {
|
|
Packit |
6ef888 |
print_gfs2("corrupt.");
|
|
Packit |
6ef888 |
} else {
|
|
Packit |
6ef888 |
if (head.lh_flags & GFS2_LOG_HEAD_UNMOUNT)
|
|
Packit |
6ef888 |
print_gfs2("clean.");
|
|
Packit |
6ef888 |
else
|
|
Packit |
6ef888 |
print_gfs2("dirty.");
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
eol(0);
|
|
Packit |
6ef888 |
inode_put(&ip);
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
return 0;
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
|
|
Packit |
6ef888 |
static int parse_rindex(struct gfs2_inode *dip, int print_rindex)
|
|
Packit |
6ef888 |
{
|
|
Packit |
6ef888 |
int error, start_line;
|
|
Packit |
6ef888 |
struct gfs2_rindex ri;
|
|
Packit |
6ef888 |
char rbuf[sizeof(struct gfs2_rindex)];
|
|
Packit |
6ef888 |
char highlighted_addr[32];
|
|
Packit |
6ef888 |
|
|
Packit |
6ef888 |
start_line = line;
|
|
Packit |
6ef888 |
print_gfs2("RG index entries found: %lld.", dip->i_di.di_size /
|
|
Packit |
6ef888 |
sizeof(struct gfs2_rindex));
|
|
Packit |
6ef888 |
eol(0);
|
|
Packit |
6ef888 |
lines_per_row[dmode] = 6;
|
|
Packit |
6ef888 |
memset(highlighted_addr, 0, sizeof(highlighted_addr));
|
|
Packit |
6ef888 |
|
|
Packit |
6ef888 |
for (print_entry_ndx=0; ; print_entry_ndx++) {
|
|
Packit |
6ef888 |
uint64_t roff;
|
|
Packit |
6ef888 |
|
|
Packit |
6ef888 |
roff = print_entry_ndx * sizeof(struct gfs2_rindex);
|
|
Packit |
6ef888 |
|
|
Packit |
6ef888 |
error = gfs2_readi(dip, (void *)&rbuf, roff,
|
|
Packit |
6ef888 |
sizeof(struct gfs2_rindex));
|
|
Packit |
6ef888 |
if (!error) /* end of file */
|
|
Packit |
6ef888 |
break;
|
|
Packit |
6ef888 |
gfs2_rindex_in(&ri, rbuf);
|
|
Packit |
6ef888 |
if (!termlines ||
|
|
Packit |
6ef888 |
(print_entry_ndx >= start_row[dmode] &&
|
|
Packit |
6ef888 |
((print_entry_ndx - start_row[dmode])+1) * lines_per_row[dmode] <=
|
|
Packit |
6ef888 |
termlines - start_line - 2)) {
|
|
Packit |
6ef888 |
if (edit_row[dmode] == print_entry_ndx) {
|
|
Packit |
6ef888 |
COLORS_HIGHLIGHT;
|
|
Packit |
6ef888 |
sprintf(highlighted_addr, "%llx", (unsigned long long)ri.ri_addr);
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
print_gfs2("RG #%d", print_entry_ndx);
|
|
Packit |
6ef888 |
if (!print_rindex)
|
|
Packit |
6ef888 |
print_gfs2(" located at: %llu (0x%llx)",
|
|
Packit |
6ef888 |
ri.ri_addr, ri.ri_addr);
|
|
Packit |
6ef888 |
eol(0);
|
|
Packit |
6ef888 |
if (edit_row[dmode] == print_entry_ndx)
|
|
Packit |
6ef888 |
COLORS_NORMAL;
|
|
Packit |
6ef888 |
if(print_rindex)
|
|
Packit |
6ef888 |
gfs2_rindex_print(&ri);
|
|
Packit |
6ef888 |
else {
|
|
Packit |
6ef888 |
struct gfs2_buffer_head *tmp_bh;
|
|
Packit |
6ef888 |
|
|
Packit |
6ef888 |
tmp_bh = bread(&sbd, ri.ri_addr);
|
|
Packit |
6ef888 |
if (sbd.gfs1) {
|
|
Packit |
6ef888 |
struct gfs_rgrp rg1;
|
|
Packit |
6ef888 |
gfs_rgrp_in(&rg1, tmp_bh);
|
|
Packit |
6ef888 |
gfs_rgrp_print(&rg1);
|
|
Packit |
6ef888 |
} else {
|
|
Packit |
6ef888 |
struct gfs2_rgrp rg;
|
|
Packit |
6ef888 |
gfs2_rgrp_in(&rg, tmp_bh->b_data);
|
|
Packit |
6ef888 |
gfs2_rgrp_print(&rg;;
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
brelse(tmp_bh);
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
last_entry_onscreen[dmode] = print_entry_ndx;
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
strcpy(estring, highlighted_addr);
|
|
Packit |
6ef888 |
end_row[dmode] = print_entry_ndx;
|
|
Packit |
6ef888 |
return error;
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
|
|
Packit |
6ef888 |
static int print_inum(struct gfs2_inode *dii)
|
|
Packit |
6ef888 |
{
|
|
Packit |
6ef888 |
uint64_t inum, inodenum;
|
|
Packit |
6ef888 |
int rc;
|
|
Packit |
6ef888 |
|
|
Packit |
6ef888 |
rc = gfs2_readi(dii, (void *)&inum, 0, sizeof(inum));
|
|
Packit |
6ef888 |
if (!rc) {
|
|
Packit |
6ef888 |
print_gfs2("The inum file is empty.");
|
|
Packit |
6ef888 |
eol(0);
|
|
Packit |
6ef888 |
return 0;
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
if (rc != sizeof(inum)) {
|
|
Packit |
6ef888 |
print_gfs2("Error reading inum file.");
|
|
Packit |
6ef888 |
eol(0);
|
|
Packit |
6ef888 |
return -1;
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
inodenum = be64_to_cpu(inum);
|
|
Packit |
6ef888 |
print_gfs2("Next inode num = %"PRId64" (0x%"PRIx64")", inodenum, inodenum);
|
|
Packit |
6ef888 |
eol(0);
|
|
Packit |
6ef888 |
return 0;
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
|
|
Packit |
6ef888 |
static int print_statfs(struct gfs2_inode *dis)
|
|
Packit |
6ef888 |
{
|
|
Packit |
6ef888 |
struct gfs2_statfs_change sfb, sfc;
|
|
Packit |
6ef888 |
int rc;
|
|
Packit |
6ef888 |
|
|
Packit |
6ef888 |
rc = gfs2_readi(dis, (void *)&sfb, 0, sizeof(sfb));
|
|
Packit |
6ef888 |
if (!rc) {
|
|
Packit |
6ef888 |
print_gfs2("The statfs file is empty.");
|
|
Packit |
6ef888 |
eol(0);
|
|
Packit |
6ef888 |
return 0;
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
if (rc != sizeof(sfb)) {
|
|
Packit |
6ef888 |
print_gfs2("Error reading statfs file.");
|
|
Packit |
6ef888 |
eol(0);
|
|
Packit |
6ef888 |
return -1;
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
gfs2_statfs_change_in(&sfc, (char *)&sfb;;
|
|
Packit |
6ef888 |
print_gfs2("statfs file contents:");
|
|
Packit |
6ef888 |
eol(0);
|
|
Packit |
6ef888 |
gfs2_statfs_change_print(&sfc;;
|
|
Packit |
6ef888 |
return 0;
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
|
|
Packit |
6ef888 |
static int print_quota(struct gfs2_inode *diq)
|
|
Packit |
6ef888 |
{
|
|
Packit |
6ef888 |
struct gfs2_quota qbuf, q;
|
|
Packit |
6ef888 |
int i, error;
|
|
Packit |
6ef888 |
|
|
Packit |
6ef888 |
print_gfs2("quota file contents:");
|
|
Packit |
6ef888 |
eol(0);
|
|
Packit |
6ef888 |
print_gfs2("quota entries found: %lld.", diq->i_di.di_size / sizeof(q));
|
|
Packit |
6ef888 |
eol(0);
|
|
Packit |
6ef888 |
for (i=0; ; i++) {
|
|
Packit |
6ef888 |
error = gfs2_readi(diq, (void *)&qbuf, i * sizeof(q), sizeof(qbuf));
|
|
Packit |
6ef888 |
if (!error)
|
|
Packit |
6ef888 |
break;
|
|
Packit |
6ef888 |
if (error != sizeof(qbuf)) {
|
|
Packit |
6ef888 |
print_gfs2("Error reading quota file.");
|
|
Packit |
6ef888 |
eol(0);
|
|
Packit |
6ef888 |
return -1;
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
gfs2_quota_in(&q, (char *)&qbuf);
|
|
Packit |
6ef888 |
print_gfs2("Entry #%d", i + 1);
|
|
Packit |
6ef888 |
eol(0);
|
|
Packit |
6ef888 |
gfs2_quota_print(&q);
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
return 0;
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
|
|
Packit |
6ef888 |
int display_extended(void)
|
|
Packit |
6ef888 |
{
|
|
Packit |
6ef888 |
struct gfs2_inode *tmp_inode;
|
|
Packit |
6ef888 |
struct gfs2_buffer_head *tmp_bh;
|
|
Packit |
6ef888 |
|
|
Packit |
6ef888 |
dsplines = termlines - line - 1;
|
|
Packit |
6ef888 |
/* Display any indirect pointers that we have. */
|
|
Packit |
6ef888 |
if (block_is_rindex(block)) {
|
|
Packit |
6ef888 |
tmp_bh = bread(&sbd, block);
|
|
Packit |
6ef888 |
tmp_inode = lgfs2_inode_get(&sbd, tmp_bh);
|
|
Packit |
6ef888 |
if (tmp_inode == NULL)
|
|
Packit |
6ef888 |
return -1;
|
|
Packit |
6ef888 |
parse_rindex(tmp_inode, TRUE);
|
|
Packit |
6ef888 |
inode_put(&tmp_inode);
|
|
Packit |
6ef888 |
brelse(tmp_bh);
|
|
Packit |
6ef888 |
} else if (block_is_journals(block)) {
|
|
Packit |
6ef888 |
if (sbd.gfs1)
|
|
Packit |
6ef888 |
block = sbd1->sb_jindex_di.no_addr;
|
|
Packit |
6ef888 |
else
|
|
Packit |
6ef888 |
block = masterblock("jindex");
|
|
Packit |
6ef888 |
print_gfs2_jindex();
|
|
Packit |
6ef888 |
} else if (has_indirect_blocks() && !indirect_blocks &&
|
|
Packit |
6ef888 |
!display_leaf(indirect))
|
|
Packit |
6ef888 |
return -1;
|
|
Packit |
6ef888 |
else if (display_indirect(indirect, indirect_blocks, 0, 0) == 0)
|
|
Packit |
6ef888 |
return -1;
|
|
Packit |
6ef888 |
else if (block_is_rgtree(block)) {
|
|
Packit |
6ef888 |
if (sbd.gfs1)
|
|
Packit |
6ef888 |
tmp_bh = bread(&sbd, sbd1->sb_rindex_di.no_addr);
|
|
Packit |
6ef888 |
else
|
|
Packit |
6ef888 |
tmp_bh = bread(&sbd, masterblock("rindex"));
|
|
Packit |
6ef888 |
tmp_inode = lgfs2_inode_get(&sbd, tmp_bh);
|
|
Packit |
6ef888 |
if (tmp_inode == NULL)
|
|
Packit |
6ef888 |
return -1;
|
|
Packit |
6ef888 |
parse_rindex(tmp_inode, FALSE);
|
|
Packit |
6ef888 |
inode_put(&tmp_inode);
|
|
Packit |
6ef888 |
brelse(tmp_bh);
|
|
Packit |
6ef888 |
} else if (block_is_jindex(block)) {
|
|
Packit |
6ef888 |
tmp_bh = bread(&sbd, block);
|
|
Packit |
6ef888 |
tmp_inode = lgfs2_inode_get(&sbd, tmp_bh);
|
|
Packit |
6ef888 |
if (tmp_inode == NULL)
|
|
Packit |
6ef888 |
return -1;
|
|
Packit |
6ef888 |
print_gfs_jindex(tmp_inode);
|
|
Packit |
6ef888 |
inode_put(&tmp_inode);
|
|
Packit |
6ef888 |
brelse(tmp_bh);
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
else if (block_is_inum_file(block)) {
|
|
Packit |
6ef888 |
tmp_bh = bread(&sbd, block);
|
|
Packit |
6ef888 |
tmp_inode = lgfs2_inode_get(&sbd, tmp_bh);
|
|
Packit |
6ef888 |
if (tmp_inode == NULL)
|
|
Packit |
6ef888 |
return -1;
|
|
Packit |
6ef888 |
print_inum(tmp_inode);
|
|
Packit |
6ef888 |
inode_put(&tmp_inode);
|
|
Packit |
6ef888 |
brelse(tmp_bh);
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
else if (block_is_statfs_file(block)) {
|
|
Packit |
6ef888 |
tmp_bh = bread(&sbd, block);
|
|
Packit |
6ef888 |
tmp_inode = lgfs2_inode_get(&sbd, tmp_bh);
|
|
Packit |
6ef888 |
if (tmp_inode == NULL)
|
|
Packit |
6ef888 |
return -1;
|
|
Packit |
6ef888 |
print_statfs(tmp_inode);
|
|
Packit |
6ef888 |
inode_put(&tmp_inode);
|
|
Packit |
6ef888 |
brelse(tmp_bh);
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
else if (block_is_quota_file(block)) {
|
|
Packit |
6ef888 |
tmp_bh = bread(&sbd, block);
|
|
Packit |
6ef888 |
tmp_inode = lgfs2_inode_get(&sbd, tmp_bh);
|
|
Packit |
6ef888 |
if (tmp_inode == NULL)
|
|
Packit |
6ef888 |
return -1;
|
|
Packit |
6ef888 |
print_quota(tmp_inode);
|
|
Packit |
6ef888 |
inode_put(&tmp_inode);
|
|
Packit |
6ef888 |
brelse(tmp_bh);
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
return 0;
|
|
Packit |
6ef888 |
}
|
|
Packit |
6ef888 |
|