public inbox for linux-ext4@vger.kernel.org
 help / color / mirror / Atom feed
From: "lihaoxiang (F)" <lihaoxiang9@huawei.com>
To: <tytso@mit.edu>
Cc: <linux-ext4@vger.kernel.org>, <liuzhiqiang26@huawei.com>,
	<linfeilong@huawei.com>, <louhongxiang@huawei.com>
Subject: Re: [PATCH] debugfs:add logdump with option -n that display n records
Date: Thu, 11 Aug 2022 20:33:15 +0800	[thread overview]
Message-ID: <e5ac1309-67a3-322b-71df-dd1fee2bf4ef@huawei.com> (raw)
In-Reply-To: <608df030-593f-8c69-cb65-632a34729d23@huawei.com>

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@huawei.com>
> ---
>  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);

  reply	other threads:[~2022-08-11 12:33 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-07-14  1:32 [PATCH] debugfs:add logdump with option -n that display n records lihaoxiang (F)
2022-08-11 12:33 ` lihaoxiang (F) [this message]
2022-08-13 14:58 ` Theodore Ts'o
  -- strict thread matches above, loose matches on Subject: below --
2022-07-06 10:06 lihaoxiang (F)

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=e5ac1309-67a3-322b-71df-dd1fee2bf4ef@huawei.com \
    --to=lihaoxiang9@huawei.com \
    --cc=linfeilong@huawei.com \
    --cc=linux-ext4@vger.kernel.org \
    --cc=liuzhiqiang26@huawei.com \
    --cc=louhongxiang@huawei.com \
    --cc=tytso@mit.edu \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox