[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <e5ac1309-67a3-322b-71df-dd1fee2bf4ef@huawei.com>
Date: Thu, 11 Aug 2022 20:33:15 +0800
From: "lihaoxiang (F)" <lihaoxiang9@...wei.com>
To: <tytso@....edu>
CC: <linux-ext4@...r.kernel.org>, <liuzhiqiang26@...wei.com>,
<linfeilong@...wei.com>, <louhongxiang@...wei.com>
Subject: Re: [PATCH] debugfs:add logdump with option -n that display n records
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@...wei.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);
Powered by blists - more mailing lists