[Ocfs2-tools-devel] [PATCH 4/4] Enable debugfs.ocfs2 to recognize image-file

Sunil Mushran Sunil.Mushran at oracle.com
Mon May 5 14:26:07 PDT 2008


Signed-off-by: Sunil Mushran <sunil.mushran at oracle.com>

make the small change suggested below.

Srinivas Eeda wrote:
> 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..90c2cdb 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\tfile is an o2image file\n");
>   

Make it "Open an o2image file".

>  	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++;
>  
>   




More information about the Ocfs2-tools-devel mailing list