[Ocfs2-tools-devel] [PATCH 4/4] Enable debugfs.ocfs2 to recognize image-file
Srinivas Eeda
srinivas.eeda at oracle.com
Tue May 6 16:32:13 PDT 2008
This patch adds o2image support to debugfs.ocfs2 tools.
Signed-off-by: Srinivas Eeda <srinivas.eeda at oracle.com>
---
debugfs.ocfs2/commands.c | 64 ++++++++++++++++++++++++++++----------
debugfs.ocfs2/debugfs.ocfs2.8.in | 5 +++
debugfs.ocfs2/include/main.h | 2 +
debugfs.ocfs2/main.c | 12 ++++++-
4 files changed, 64 insertions(+), 19 deletions(-)
diff --git a/debugfs.ocfs2/commands.c b/debugfs.ocfs2/commands.c
index ed93759..10a93fd 100644
--- a/debugfs.ocfs2/commands.c
+++ b/debugfs.ocfs2/commands.c
@@ -24,6 +24,7 @@
*/
#include "main.h"
+#include "ocfs2/image.h"
#include "ocfs2/byteorder.h"
#define SYSTEM_FILE_NAME_MAX 40
@@ -299,7 +300,8 @@ static int process_inodestr_args(char **args, int count, uint64_t *blkno)
/* open the device, read the block from the device and get the
* blocksize from the offset of the ocfs2_super_block.
*/
-static errcode_t get_blocksize(char* dev, uint64_t offset, uint64_t *blocksize)
+static errcode_t get_blocksize(char* dev, uint64_t offset, uint64_t *blocksize,
+ int super_no)
{
errcode_t ret;
uint64_t blkno;
@@ -307,6 +309,7 @@ static errcode_t get_blocksize(char* dev, uint64_t offset, uint64_t *blocksize)
char *buf = NULL;
io_channel* channel = NULL;
struct ocfs2_dinode *di = NULL;
+ struct ocfs2_image_hdr *hdr;
ret = io_open(dev, OCFS2_FLAG_RO, &channel);
if (ret)
@@ -324,6 +327,19 @@ static errcode_t get_blocksize(char* dev, uint64_t offset, uint64_t *blocksize)
if (ret)
goto bail;
+ if (gbls.imagefile) {
+ ret = io_read_block(channel, 0, 1, buf);
+ if (ret)
+ goto bail;
+ hdr = (struct ocfs2_image_hdr *)buf;
+ ocfs2_image_swap_header(hdr);
+ if (super_no > hdr->hdr_superblkcnt) {
+ ret = OCFS2_ET_IO;
+ goto bail;
+ }
+ offset = hdr->hdr_superblocks[super_no-1] * hdr->hdr_fsblksz;
+ }
+
blkno = offset / OCFS2_MIN_BLOCKSIZE;
ret = io_read_block(channel, blkno, 1, buf);
if (ret)
@@ -347,36 +363,44 @@ static int process_open_args(char **args,
uint64_t *superblock, uint64_t *blocksize)
{
errcode_t ret = 0;
- uint32_t s;
- char *ptr;
+ uint32_t s = 0;
+ char *ptr, *dev;
uint64_t byte_off[OCFS2_MAX_BACKUP_SUPERBLOCKS];
uint64_t blksize = 0;
- int num, ind = 2;
-
- if (!args[ind])
- return 0;
+ int num, argc, c;
- if (args[ind] && !strcmp(args[ind], "-s"))
- ind++;
- else
- return -1;
+ for (argc = 0; (args[argc]); ++argc);
+ dev = strdup(args[1]);
+ optind = 0;
+ while ((c = getopt(argc, args, "is:")) != EOF) {
+ switch (c) {
+ case 'i':
+ gbls.imagefile = 1;
+ break;
+ case 's':
+ s = strtoul(optarg, &ptr, 0);
+ break;
+ default:
+ return 1;
+ break;
+ }
+ }
- if(!args[ind])
- return -1;
+ if (!s)
+ return 0;
num = ocfs2_get_backup_super_offset(NULL,
byte_off, ARRAY_SIZE(byte_off));
if (!num)
return -1;
- s = strtoul(args[ind], &ptr, 0);
if (s < 1 || s > num) {
fprintf (stderr, "Backup super block is outside of valid range"
"(between 1 and %d)\n", num);
return -1;
}
- ret = get_blocksize(args[1], byte_off[s-1], &blksize);
+ ret = get_blocksize(dev, byte_off[s-1], &blksize, s);
if (ret) {
com_err(args[0],ret, "Can't get the blocksize from the device"
" by the num %u\n", s);
@@ -602,15 +626,20 @@ static void do_open (char **args)
do_close (NULL);
if (dev == NULL || process_open_args(args, &superblock, &block_size)) {
- fprintf (stderr, "usage: %s <device> [-s num]\n", args[0]);
+ fprintf (stderr, "usage: %s <device> [-i] [-s num]\n", args[0]);
+ gbls.imagefile = 0;
return ;
}
flags = gbls.allow_write ? OCFS2_FLAG_RW : OCFS2_FLAG_RO;
flags |= OCFS2_FLAG_HEARTBEAT_DEV_OK;
+ if (gbls.imagefile)
+ flags |= OCFS2_FLAG_IMAGE_FILE;
+
ret = ocfs2_open(dev, flags, superblock, block_size, &gbls.fs);
if (ret) {
gbls.fs = NULL;
+ gbls.imagefile = 0;
com_err(args[0], ret, "while opening context for device %s",
dev);
return ;
@@ -681,6 +710,7 @@ static void do_close (char **args)
if (ret)
com_err(args[0], ret, "while closing context");
gbls.fs = NULL;
+ gbls.imagefile = 0;
if (gbls.blockbuf)
ocfs2_free(&gbls.blockbuf);
@@ -809,7 +839,7 @@ static void do_help (char **args)
printf ("logdump <slot#>\t\t\t\tPrints journal file for the node slot\n");
printf ("ls [-l] <filespec>\t\t\tList directory\n");
printf ("ncheck <block#> ...\t\t\tList all pathnames of the inode(s)/lockname(s)\n");
- printf ("open <device> [-s backup#]\t\t\t\tOpen a device\n");
+ printf ("open <device> [-i] [-s backup#]\t\tOpen a device\n");
printf ("quit, q\t\t\t\t\tExit the program\n");
printf ("rdump [-v] <filespec> <outdir>\t\tRecursively dumps from src to a dir on a mounted filesystem\n");
printf ("slotmap\t\t\t\t\tShow slot map\n");
diff --git a/debugfs.ocfs2/debugfs.ocfs2.8.in b/debugfs.ocfs2/debugfs.ocfs2.8.in
index 4805058..603ce63 100644
--- a/debugfs.ocfs2/debugfs.ocfs2.8.in
+++ b/debugfs.ocfs2/debugfs.ocfs2.8.in
@@ -30,6 +30,10 @@ Display the lockname obtained by encoding the lock type, inode number and the in
Executes the debugfs commands in \fIcmdfile\fR.
.TP
+\fB\-i, \-\-image\fR
+Specifies device is an o2image file created by \fIo2image\fR tool.
+
+.TP
\fB\-l\fR [\fItracebit\fR ... [\fBallow\fR|\fBoff\fR|\fBdeny\fR]] ...
Control \fBOCFS2\fR filesystem tracing by enabling and disabling trace bits.
Do \fIdebugfs.ocfs2 -l\fR to get the list of all trace bits.
@@ -222,6 +226,7 @@ This tool has been modelled after \fBdebugfs\fR, a debugging tool for ext2.
.BR mounted.ocfs2(8)
.BR ocfs2console(8)
.BR ocfs2cdsl(8)
+.BR o2image(8)
.SH "AUTHOR"
Oracle Corporation
diff --git a/debugfs.ocfs2/include/main.h b/debugfs.ocfs2/include/main.h
index f0e0c2b..8efcccf 100644
--- a/debugfs.ocfs2/include/main.h
+++ b/debugfs.ocfs2/include/main.h
@@ -68,6 +68,7 @@ enum {
typedef struct _dbgfs_glbs {
char *progname;
int allow_write;
+ int imagefile;
int interactive;
char *device;
ocfs2_filesys *fs;
@@ -86,6 +87,7 @@ typedef struct _dbgfs_glbs {
typedef struct _dbgfs_opts {
int allow_write;
+ int imagefile;
int no_prompt;
uint32_t sb_num;
char *cmd_file;
diff --git a/debugfs.ocfs2/main.c b/debugfs.ocfs2/main.c
index ecd7f70..3588726 100644
--- a/debugfs.ocfs2/main.c
+++ b/debugfs.ocfs2/main.c
@@ -47,10 +47,11 @@ static void usage (char *progname)
g_print ("usage: %s -l [<logentry> ... [allow|off|deny]] ...\n", progname);
g_print ("usage: %s -d, --decode <lockres>\n", progname);
g_print ("usage: %s -e, --encode <lock type> <block num> <generation>\n", progname);
- g_print ("usage: %s [-f cmdfile] [-R request] [-s backup#] [-V] [-w] [-n] [-?] [device]\n", progname);
+ g_print ("usage: %s [-f cmdfile] [-R request] [-i] [-s backup#] [-V] [-w] [-n] [-?] [device]\n", progname);
g_print ("\t-f, --file <cmdfile>\t\tExecute commands in cmdfile\n");
g_print ("\t-R, --request <command>\t\tExecute a single command\n");
g_print ("\t-s, --superblock <backup#>\tOpen the device using a backup superblock\n");
+ g_print ("\t-i, --image\t\t\tOpen an o2image file\n");
g_print ("\t-w, --write\t\t\tOpen in read-write mode instead of the default of read-only\n");
g_print ("\t-V, --version\t\t\tShow version\n");
g_print ("\t-n, --noprompt\t\t\tHide prompt\n");
@@ -189,6 +190,7 @@ static void get_options(int argc, char **argv, dbgfs_opts *opts)
{ "decode", 0, 0, 'd' },
{ "encode", 0, 0, 'e' },
{ "superblock", 0, 0, 's' },
+ { "image", 0, 0, 'i' },
{ 0, 0, 0, 0}
};
@@ -196,7 +198,8 @@ static void get_options(int argc, char **argv, dbgfs_opts *opts)
if (decodemode || encodemode || logmode)
break;
- c = getopt_long(argc, argv, "lf:R:deV?wns:", long_options, NULL);
+ c = getopt_long(argc, argv, "lf:R:deV?wns:i",
+ long_options, NULL);
if (c == -1)
break;
@@ -225,6 +228,10 @@ static void get_options(int argc, char **argv, dbgfs_opts *opts)
encodemode++;
break;
+ case 'i':
+ opts->imagefile = 1;
+ break;
+
case 'l':
logmode++;
break;
@@ -462,6 +469,7 @@ int main (int argc, char **argv)
}
gbls.allow_write = opts.allow_write;
+ gbls.imagefile = opts.imagefile;
if (!opts.cmd_file)
gbls.interactive++;
--
1.5.2.1
More information about the Ocfs2-tools-devel
mailing list