Re: [PATCH] debugfs:add logdump with option -n that display n records

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Friendly ping...

On 2022/7/14 9:32, lihaoxiang (F) wrote:
> The current version's debugfs possessed the function logdump. Executing
> with option -O could output the log history. But when it occurred the block
> which had no magic number in it's header, the program would exit.
> 
> Sometimes we were locating problems, needed for more transactions that
> had replayed instead of the latest batch of transactions and we weren't
> hope to display all the history in the meanwhile. So we introduced
> the option -n used for controlling the print of history transactions.
> Specially, this parameter was depending on the option -O otherwise it
> couldn't work.
> 
> So in this modification, we used logdump with -O -n <history trans num>.
> It would not stop searching even if occurred no magic blocks or not
> corherent transactions. The only terminated condition was that all logs
> had been outputed or the outputed log counts reached the limitation of -n.
> 
> Signed-off-by: lihaoxiang <lihaoxiang9@xxxxxxxxxx>
> ---
>  debugfs/logdump.c | 32 ++++++++++++++++++++++++++++----
>  1 file changed, 28 insertions(+), 4 deletions(-)
> 
> diff --git a/debugfs/logdump.c b/debugfs/logdump.c
> index 4154ef2a..1067961f 100644
> --- a/debugfs/logdump.c
> +++ b/debugfs/logdump.c
> @@ -48,6 +48,7 @@ enum journal_location {JOURNAL_IS_INTERNAL, JOURNAL_IS_EXTERNAL};
>  #define ANY_BLOCK ((blk64_t) -1)
> 
>  static int		dump_all, dump_super, dump_old, dump_contents, dump_descriptors;
> +static int64_t		dump_counts;
>  static blk64_t		block_to_dump, bitmap_to_dump, inode_block_to_dump;
>  static unsigned int	group_to_dump, inode_offset_to_dump;
>  static ext2_ino_t	inode_to_dump;
> @@ -113,9 +114,10 @@ void do_logdump(int argc, char **argv, int sci_idx EXT2FS_ATTR((unused)),
>  	bitmap_to_dump = -1;
>  	inode_block_to_dump = ANY_BLOCK;
>  	inode_to_dump = -1;
> +	dump_counts = -1;
> 
>  	reset_getopt();
> -	while ((c = getopt (argc, argv, "ab:ci:f:OsS")) != EOF) {
> +	while ((c = getopt (argc, argv, "ab:ci:f:OsSn:")) != EOF) {
>  		switch (c) {
>  		case 'a':
>  			dump_all++;
> @@ -148,6 +150,14 @@ void do_logdump(int argc, char **argv, int sci_idx EXT2FS_ATTR((unused)),
>  		case 'S':
>  			dump_super++;
>  			break;
> +		case 'n':
> +			dump_counts = strtol(optarg, &tmp, 10);
> +			if (*tmp) {
> +				com_err(argv[0], 0,
> +					"Bad log counts number - %s", optarg);
> +				return;
> +			}
> +			break;
>  		default:
>  			goto print_usage;
>  		}
> @@ -289,7 +299,7 @@ cleanup:
>  	return;
> 
>  print_usage:
> -	fprintf(stderr, "%s: Usage: logdump [-acsOS] [-b<block>] [-i<filespec>]\n\t"
> +	fprintf(stderr, "%s: Usage: logdump [-acsOS] [-n<num_trans>] [-b<block>] [-i<filespec>]\n\t"
>  		"[-f<journal_file>] [output_file]\n", argv[0]);
>  }
> 
> @@ -369,6 +379,8 @@ static void dump_journal(char *cmdname, FILE *out_file,
>  	int			fc_done;
>  	__u64			total_len;
>  	__u32			maxlen;
> +	int64_t			cur_counts = 0;			
> +	bool			exist_no_magic = false;
> 
>  	/* First, check to see if there's an ext2 superblock header */
>  	retval = read_journal_block(cmdname, source, 0, buf, 2048);
> @@ -459,6 +471,9 @@ static void dump_journal(char *cmdname, FILE *out_file,
>  	}
> 
>  	while (1) {
> +		if (dump_old && (dump_counts != -1) && (cur_counts >= dump_counts))
> +			break;
> +		
>  		retval = read_journal_block(cmdname, source,
>  				((ext2_loff_t) blocknr) * blocksize,
>  				buf, blocksize);
> @@ -472,8 +487,16 @@ static void dump_journal(char *cmdname, FILE *out_file,
>  		blocktype = be32_to_cpu(header->h_blocktype);
> 
>  		if (magic != JBD2_MAGIC_NUMBER) {
> -			fprintf (out_file, "No magic number at block %u: "
> -				 "end of journal.\n", blocknr);
> +			if (exist_no_magic == false) {
> +				exist_no_magic = true;
> +				fprintf (out_file, "No magic number at block %u: "
> +					"end of journal.\n", blocknr);
> +			}
> +			if (dump_old && (dump_counts != -1)) {
> +				blocknr++;
> +				WRAP(jsb, blocknr, maxlen);
> +				continue;
> +			}
>  			break;
>  		}
> 
> @@ -500,6 +523,7 @@ static void dump_journal(char *cmdname, FILE *out_file,
>  			continue;
> 
>  		case JBD2_COMMIT_BLOCK:
> +			cur_counts++;
>  			transaction++;
>  			blocknr++;
>  			WRAP(jsb, blocknr, maxlen);



[Index of Archives]     [Reiser Filesystem Development]     [Ceph FS]     [Kernel Newbies]     [Security]     [Netfilter]     [Bugtraq]     [Linux FS]     [Yosemite National Park]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Device Mapper]     [Linux Media]

  Powered by Linux