linux-btrfs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/3] btrfs-progs: check: add inode invalid transid detect and repair support
@ 2020-08-26  0:52 Qu Wenruo
  2020-08-26  0:52 ` [PATCH 1/3] btrfs-progs: check/lowmem: add inode " Qu Wenruo
                   ` (3 more replies)
  0 siblings, 4 replies; 8+ messages in thread
From: Qu Wenruo @ 2020-08-26  0:52 UTC (permalink / raw)
  To: linux-btrfs; +Cc: Tyler Richmond

Really nothing interesting here for btrfs-progs, just reusing existing
inode generation detect and repair code.

The interesting part is, how a wrongly copied error message delayed us
so long to locate a bug.

Reported-by: Tyler Richmond <t.d.richmond@gmail.com>

Qu Wenruo (3):
  btrfs-progs: check/lowmem: add inode transid detect and repair support
  btrfs-progs: check/original: add inode transid detect and repair
    support
  btrfs-progs: tests/fsck: add test image for inode transid repair

 check/main.c                                     |   8 +++++---
 check/mode-lowmem.c                              |  11 +++++++----
 .../bad_inode_transid.img.xz                     | Bin 0 -> 1888 bytes
 3 files changed, 12 insertions(+), 7 deletions(-)
 create mode 100644 tests/fsck-tests/043-bad-inode-generation/bad_inode_transid.img.xz

-- 
2.28.0


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

* [PATCH 1/3] btrfs-progs: check/lowmem: add inode transid detect and repair support
  2020-08-26  0:52 [PATCH 0/3] btrfs-progs: check: add inode invalid transid detect and repair support Qu Wenruo
@ 2020-08-26  0:52 ` Qu Wenruo
  2020-08-26 14:34   ` Josef Bacik
  2020-08-26  0:52 ` [PATCH 2/3] btrfs-progs: check/original: " Qu Wenruo
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 8+ messages in thread
From: Qu Wenruo @ 2020-08-26  0:52 UTC (permalink / raw)
  To: linux-btrfs

There are quite some reports on kernel rejecting invalid inode
generation, but it turns out to be that, kernel is just rejecting inode
transid. It's a bug in kernel error message.

To solve the problem and make the fs mountable again, add the detect and
repair support for lowmem mode.

The implementation is pretty much the same, just re-use the existing
inode generation detect and repair code.

Signed-off-by: Qu Wenruo <wqu@suse.com>
---
 check/mode-lowmem.c | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/check/mode-lowmem.c b/check/mode-lowmem.c
index 837bacf920ac..2b689b2abf63 100644
--- a/check/mode-lowmem.c
+++ b/check/mode-lowmem.c
@@ -2554,6 +2554,7 @@ static int repair_inode_gen_lowmem(struct btrfs_root *root,
 	ii = btrfs_item_ptr(path->nodes[0], path->slots[0],
 			    struct btrfs_inode_item);
 	btrfs_set_inode_generation(path->nodes[0], ii, trans->transid);
+	btrfs_set_inode_transid(path->nodes[0], ii, trans->transid);
 	btrfs_mark_buffer_dirty(path->nodes[0]);
 	ret = btrfs_commit_transaction(trans, root);
 	if (ret < 0) {
@@ -2561,7 +2562,7 @@ static int repair_inode_gen_lowmem(struct btrfs_root *root,
 		error("failed to commit transaction: %m");
 		goto error;
 	}
-	printf("resetting inode generation to %llu for ino %llu\n",
+	printf("resetting inode generation/transid to %llu for ino %llu\n",
 		transid, key.objectid);
 	return ret;
 
@@ -2597,6 +2598,7 @@ static int check_inode_item(struct btrfs_root *root, struct btrfs_path *path)
 	u64 extent_end = 0;
 	u64 extent_size = 0;
 	u64 generation;
+	u64 transid;
 	u64 gen_uplimit;
 	unsigned int dir;
 	unsigned int nodatasum;
@@ -2629,6 +2631,7 @@ static int check_inode_item(struct btrfs_root *root, struct btrfs_path *path)
 	dir = imode_to_type(mode) == BTRFS_FT_DIR;
 	nlink = btrfs_inode_nlink(node, ii);
 	generation = btrfs_inode_generation(node, ii);
+	transid = btrfs_inode_transid(node, ii);
 	nodatasum = btrfs_inode_flags(node, ii) & BTRFS_INODE_NODATASUM;
 
 	if (!is_valid_imode(mode)) {
@@ -2648,10 +2651,10 @@ static int check_inode_item(struct btrfs_root *root, struct btrfs_path *path)
 	else
 		gen_uplimit = btrfs_super_generation(super);
 
-	if (generation > gen_uplimit) {
+	if (generation > gen_uplimit || transid > gen_uplimit) {
 		error(
-	"invalid inode generation for ino %llu, have %llu expect [0, %llu)",
-		      inode_id, generation, gen_uplimit);
+"invalid inode generation or transid for ino %llu, have %llu,%llu expect [0, %llu)",
+		      inode_id, generation, transid, gen_uplimit);
 		if (repair) {
 			ret = repair_inode_gen_lowmem(root, path);
 			if (ret < 0)
-- 
2.28.0


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

* [PATCH 2/3] btrfs-progs: check/original: add inode transid detect and repair support
  2020-08-26  0:52 [PATCH 0/3] btrfs-progs: check: add inode invalid transid detect and repair support Qu Wenruo
  2020-08-26  0:52 ` [PATCH 1/3] btrfs-progs: check/lowmem: add inode " Qu Wenruo
@ 2020-08-26  0:52 ` Qu Wenruo
  2020-08-26 14:35   ` Josef Bacik
  2020-08-26  0:52 ` [PATCH 3/3] btrfs-progs: tests/fsck: add test image for inode transid repair Qu Wenruo
  2020-08-31 15:09 ` [PATCH 0/3] btrfs-progs: check: add inode invalid transid detect and repair support David Sterba
  3 siblings, 1 reply; 8+ messages in thread
From: Qu Wenruo @ 2020-08-26  0:52 UTC (permalink / raw)
  To: linux-btrfs

The inode transid detect and repair is reusing the existing inode
geneartion code.

Signed-off-by: Qu Wenruo <wqu@suse.com>
---
 check/main.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/check/main.c b/check/main.c
index 9a2ee2a00f9a..e7996b7c8c0e 100644
--- a/check/main.c
+++ b/check/main.c
@@ -620,7 +620,7 @@ static void print_inode_error(struct btrfs_root *root, struct inode_record *rec)
 		fprintf(stderr, ", invalid inode mode bit 0%o",
 			rec->imode & ~07777);
 	if (errors & I_ERR_INVALID_GEN)
-		fprintf(stderr, ", invalid inode generation");
+		fprintf(stderr, ", invalid inode generation or transid");
 	fprintf(stderr, "\n");
 
 	/* Print the holes if needed */
@@ -912,7 +912,8 @@ static int process_inode_item(struct extent_buffer *eb,
 	 * inode generation uplimit, use super_generation + 1 anyway
 	 */
 	gen_uplimit = btrfs_super_generation(gfs_info->super_copy) + 1;
-	if (btrfs_inode_generation(eb, item) > gen_uplimit)
+	if (btrfs_inode_generation(eb, item) > gen_uplimit ||
+	    btrfs_inode_transid(eb, item) > gen_uplimit)
 		rec->errors |= I_ERR_INVALID_GEN;
 	maybe_free_inode_rec(&active_node->inode_cache, rec);
 	return 0;
@@ -2835,9 +2836,10 @@ static int repair_inode_gen_original(struct btrfs_trans_handle *trans,
 	ii = btrfs_item_ptr(path->nodes[0], path->slots[0],
 			    struct btrfs_inode_item);
 	btrfs_set_inode_generation(path->nodes[0], ii, trans->transid);
+	btrfs_set_inode_transid(path->nodes[0], ii, trans->transid);
 	btrfs_mark_buffer_dirty(path->nodes[0]);
 	btrfs_release_path(path);
-	printf("resetting inode generation to %llu for ino %llu\n",
+	printf("resetting inode generation/transid to %llu for ino %llu\n",
 		trans->transid, rec->ino);
 	rec->errors &= ~I_ERR_INVALID_GEN;
 	return 0;
-- 
2.28.0


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

* [PATCH 3/3] btrfs-progs: tests/fsck: add test image for inode transid repair
  2020-08-26  0:52 [PATCH 0/3] btrfs-progs: check: add inode invalid transid detect and repair support Qu Wenruo
  2020-08-26  0:52 ` [PATCH 1/3] btrfs-progs: check/lowmem: add inode " Qu Wenruo
  2020-08-26  0:52 ` [PATCH 2/3] btrfs-progs: check/original: " Qu Wenruo
@ 2020-08-26  0:52 ` Qu Wenruo
  2020-08-26 14:35   ` Josef Bacik
  2020-08-31 15:09 ` [PATCH 0/3] btrfs-progs: check: add inode invalid transid detect and repair support David Sterba
  3 siblings, 1 reply; 8+ messages in thread
From: Qu Wenruo @ 2020-08-26  0:52 UTC (permalink / raw)
  To: linux-btrfs

The image would contain an inode with invalid transid:

        item 4 key (257 INODE_ITEM 0) itemoff 15881 itemsize 160
                generation 6 transid 134217734 size 131072 nbytes 131072
                block group 0 mode 100600 links 1 uid 0 gid 0 rdev 0

Signed-off-by: Qu Wenruo <wqu@suse.com>
---
 .../bad_inode_transid.img.xz                     | Bin 0 -> 1888 bytes
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 tests/fsck-tests/043-bad-inode-generation/bad_inode_transid.img.xz

diff --git a/tests/fsck-tests/043-bad-inode-generation/bad_inode_transid.img.xz b/tests/fsck-tests/043-bad-inode-generation/bad_inode_transid.img.xz
new file mode 100644
index 0000000000000000000000000000000000000000..91ee6947fd71b52d5426b7adeb20cb1f6fd2866b
GIT binary patch
literal 1888
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
a0lE%=7ytlV9#}ZB#Ao{g000001X)_Aj-k&0

literal 0
HcmV?d00001

-- 
2.28.0


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

* Re: [PATCH 1/3] btrfs-progs: check/lowmem: add inode transid detect and repair support
  2020-08-26  0:52 ` [PATCH 1/3] btrfs-progs: check/lowmem: add inode " Qu Wenruo
@ 2020-08-26 14:34   ` Josef Bacik
  0 siblings, 0 replies; 8+ messages in thread
From: Josef Bacik @ 2020-08-26 14:34 UTC (permalink / raw)
  To: Qu Wenruo, linux-btrfs

On 8/25/20 8:52 PM, Qu Wenruo wrote:
> There are quite some reports on kernel rejecting invalid inode
> generation, but it turns out to be that, kernel is just rejecting inode
> transid. It's a bug in kernel error message.
> 
> To solve the problem and make the fs mountable again, add the detect and
> repair support for lowmem mode.
> 
> The implementation is pretty much the same, just re-use the existing
> inode generation detect and repair code.
> 
> Signed-off-by: Qu Wenruo <wqu@suse.com>

Reviewed-by: Josef Bacik <josef@toxicpanda.com>

Thanks,

Josef

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

* Re: [PATCH 2/3] btrfs-progs: check/original: add inode transid detect and repair support
  2020-08-26  0:52 ` [PATCH 2/3] btrfs-progs: check/original: " Qu Wenruo
@ 2020-08-26 14:35   ` Josef Bacik
  0 siblings, 0 replies; 8+ messages in thread
From: Josef Bacik @ 2020-08-26 14:35 UTC (permalink / raw)
  To: Qu Wenruo, linux-btrfs

On 8/25/20 8:52 PM, Qu Wenruo wrote:
> The inode transid detect and repair is reusing the existing inode
> geneartion code.
> 
> Signed-off-by: Qu Wenruo <wqu@suse.com>

Reviewed-by: Josef Bacik <josef@toxicpanda.com>

Thanks,

Josef


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

* Re: [PATCH 3/3] btrfs-progs: tests/fsck: add test image for inode transid repair
  2020-08-26  0:52 ` [PATCH 3/3] btrfs-progs: tests/fsck: add test image for inode transid repair Qu Wenruo
@ 2020-08-26 14:35   ` Josef Bacik
  0 siblings, 0 replies; 8+ messages in thread
From: Josef Bacik @ 2020-08-26 14:35 UTC (permalink / raw)
  To: Qu Wenruo, linux-btrfs

On 8/25/20 8:52 PM, Qu Wenruo wrote:
> The image would contain an inode with invalid transid:
> 
>          item 4 key (257 INODE_ITEM 0) itemoff 15881 itemsize 160
>                  generation 6 transid 134217734 size 131072 nbytes 131072
>                  block group 0 mode 100600 links 1 uid 0 gid 0 rdev 0
> 
> Signed-off-by: Qu Wenruo <wqu@suse.com>

Reviewed-by: Josef Bacik <josef@toxicpanda.com>

Thanks,

Josef

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

* Re: [PATCH 0/3] btrfs-progs: check: add inode invalid transid detect and repair support
  2020-08-26  0:52 [PATCH 0/3] btrfs-progs: check: add inode invalid transid detect and repair support Qu Wenruo
                   ` (2 preceding siblings ...)
  2020-08-26  0:52 ` [PATCH 3/3] btrfs-progs: tests/fsck: add test image for inode transid repair Qu Wenruo
@ 2020-08-31 15:09 ` David Sterba
  3 siblings, 0 replies; 8+ messages in thread
From: David Sterba @ 2020-08-31 15:09 UTC (permalink / raw)
  To: Qu Wenruo; +Cc: linux-btrfs, Tyler Richmond

On Wed, Aug 26, 2020 at 08:52:30AM +0800, Qu Wenruo wrote:
> Really nothing interesting here for btrfs-progs, just reusing existing
> inode generation detect and repair code.
> 
> The interesting part is, how a wrongly copied error message delayed us
> so long to locate a bug.
> 
> Reported-by: Tyler Richmond <t.d.richmond@gmail.com>
> 
> Qu Wenruo (3):
>   btrfs-progs: check/lowmem: add inode transid detect and repair support
>   btrfs-progs: check/original: add inode transid detect and repair
>     support
>   btrfs-progs: tests/fsck: add test image for inode transid repair

Added to devel, thanks.

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

end of thread, other threads:[~2020-08-31 15:11 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-08-26  0:52 [PATCH 0/3] btrfs-progs: check: add inode invalid transid detect and repair support Qu Wenruo
2020-08-26  0:52 ` [PATCH 1/3] btrfs-progs: check/lowmem: add inode " Qu Wenruo
2020-08-26 14:34   ` Josef Bacik
2020-08-26  0:52 ` [PATCH 2/3] btrfs-progs: check/original: " Qu Wenruo
2020-08-26 14:35   ` Josef Bacik
2020-08-26  0:52 ` [PATCH 3/3] btrfs-progs: tests/fsck: add test image for inode transid repair Qu Wenruo
2020-08-26 14:35   ` Josef Bacik
2020-08-31 15:09 ` [PATCH 0/3] btrfs-progs: check: add inode invalid transid detect and repair support David Sterba

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).