All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] debugfs:add logdump with option -n that display n records
@ 2022-07-14  1:32 lihaoxiang (F)
  2022-08-11 12:33 ` lihaoxiang (F)
  2022-08-13 14:58 ` Theodore Ts'o
  0 siblings, 2 replies; 4+ messages in thread
From: lihaoxiang (F) @ 2022-07-14  1:32 UTC (permalink / raw)
  To: tytso; +Cc: linux-ext4, liuzhiqiang26, linfeilong, louhongxiang

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);
-- 
2.37.0.windows.1

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH] debugfs:add logdump with option -n that display n records
  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)
  2022-08-13 14:58 ` Theodore Ts'o
  1 sibling, 0 replies; 4+ messages in thread
From: lihaoxiang (F) @ 2022-08-11 12:33 UTC (permalink / raw)
  To: tytso; +Cc: linux-ext4, liuzhiqiang26, linfeilong, louhongxiang

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

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] debugfs:add logdump with option -n that display n records
  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)
@ 2022-08-13 14:58 ` Theodore Ts'o
  1 sibling, 0 replies; 4+ messages in thread
From: Theodore Ts'o @ 2022-08-13 14:58 UTC (permalink / raw)
  To: lihaoxiang9
  Cc: Theodore Ts'o, louhongxiang, linfeilong, linux-ext4, liuzhiqiang26

On Thu, 14 Jul 2022 09:32:48 +0800, 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.
> 
> [...]

Applied, thanks!

[1/1] debugfs:add logdump with option -n that display n records
      commit: 6e4cc3d5eeb2dfaa055e652b5390beaa6c3d05da

Best regards,
-- 
Theodore Ts'o <tytso@mit.edu>

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH] debugfs:add logdump with option -n that display n records
@ 2022-07-06 10:06 lihaoxiang (F)
  0 siblings, 0 replies; 4+ messages in thread
From: lihaoxiang (F) @ 2022-07-06 10:06 UTC (permalink / raw)
  To: tytso; +Cc: linux-ext4, Zhiqiang Liu, linfeilong, louhongxiang

The current version's debugfs without any parameter could output the log
history, but when it occurred the block which had no magic number in it's
header or it met the transaction index that was not continued then the
program would exit for end of the last transaction that had been replayed.

Sometimes we were locating problems, needed for more transactions that
had replayed instead of the latest batch of transactions. 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 -aOS -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);
-- 
2.37.0.windows.1

^ permalink raw reply related	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2022-08-13 14:58 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
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)
2022-08-13 14:58 ` Theodore Ts'o
  -- strict thread matches above, loose matches on Subject: below --
2022-07-06 10:06 lihaoxiang (F)

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.