From: Qu Wenruo <wqu@suse.com>
To: linux-btrfs@vger.kernel.org
Subject: [PATCH 2/3] btrfs-progs: check/lowmem: verify the sequence of inline backref items
Date: Sun, 22 Oct 2023 14:10:08 +1030 [thread overview]
Message-ID: <0af53e129f107cb91b7ce3f6d22e6f83e4457e70.1697945679.git.wqu@suse.com> (raw)
In-Reply-To: <cover.1697945679.git.wqu@suse.com>
Commit 6cf11f3e3815 ("btrfs-progs: check: check order of inline extent
refs") added the ability to detect out-of-order inline extent backref
items.
Meanwhile there is no such ability in lowmem mode, this patch would
introduce such ability to lowmem mode.
Signed-off-by: Qu Wenruo <wqu@suse.com>
---
check/mode-lowmem.c | 31 +++++++++++++++++++++++++++++++
check/mode-lowmem.h | 1 +
2 files changed, 32 insertions(+)
diff --git a/check/mode-lowmem.c b/check/mode-lowmem.c
index 3b2807cc5de9..19b7b1a72a1f 100644
--- a/check/mode-lowmem.c
+++ b/check/mode-lowmem.c
@@ -4234,6 +4234,7 @@ static int check_extent_item(struct btrfs_path *path)
unsigned long ptr;
int slot = path->slots[0];
int type;
+ int last_type = 0;
u32 nodesize = btrfs_super_nodesize(gfs_info->super_copy);
u32 item_size = btrfs_item_size(eb, slot);
u64 flags;
@@ -4245,6 +4246,8 @@ static int check_extent_item(struct btrfs_path *path)
u64 owner;
u64 owner_offset;
u64 super_gen;
+ u64 seq;
+ u64 last_seq = U64_MAX;
int metadata = 0;
/* To handle corrupted values in skinny backref */
u64 level;
@@ -4342,6 +4345,32 @@ next:
iref = (struct btrfs_extent_inline_ref *)ptr;
type = btrfs_extent_inline_ref_type(eb, iref);
offset = btrfs_extent_inline_ref_offset(eb, iref);
+ if (type == BTRFS_EXTENT_DATA_REF_KEY) {
+ dref = (struct btrfs_extent_data_ref *)(&iref->offset);
+ seq = hash_extent_data_ref(
+ btrfs_extent_data_ref_root(eb, dref),
+ btrfs_extent_data_ref_objectid(eb, dref),
+ btrfs_extent_data_ref_offset(eb, dref));
+ } else {
+ seq = offset;
+ }
+ /*
+ * The @type should be ascending, while inside the same type, the
+ * @seq should be descending.
+ */
+ if (type < last_type)
+ tmp_err |= BACKREF_OUT_OF_ORDER;
+ else if (type > last_type)
+ last_seq = U64_MAX;
+
+ if (seq > last_seq)
+ tmp_err |= BACKREF_OUT_OF_ORDER;
+
+ if (tmp_err & BACKREF_OUT_OF_ORDER)
+ error(
+"inline extent backref (type %u seq 0x%llx) of extent [%llu %u %llu] is out of order",
+ type, seq, key.objectid, key.type, key.offset);
+
switch (type) {
case BTRFS_TREE_BLOCK_REF_KEY:
root_objectid = offset;
@@ -4420,6 +4449,8 @@ next:
err |= tmp_err;
ptr_offset += btrfs_extent_inline_ref_size(type);
+ last_type = type;
+ last_seq = seq;
goto next;
out:
diff --git a/check/mode-lowmem.h b/check/mode-lowmem.h
index c3cf0878147f..3f84280a89f7 100644
--- a/check/mode-lowmem.h
+++ b/check/mode-lowmem.h
@@ -64,6 +64,7 @@
#define UNKNOWN_TYPE (1 << 6) /* Unknown type */
#define ACCOUNTING_MISMATCH (1 << 7) /* Used space accounting error */
#define CHUNK_TYPE_MISMATCH (1 << 8)
+#define BACKREF_OUT_OF_ORDER (1 << 9)
int check_fs_roots_lowmem(void);
int check_chunks_and_extents_lowmem(void);
--
2.42.0
next prev parent reply other threads:[~2023-10-22 3:40 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-10-22 3:40 [PATCH 0/3] btrfs-progs: follow-ups for issue #622 Qu Wenruo
2023-10-22 3:40 ` [PATCH 1/3] btrfs-progs: dump-tree: output the sequence number for inline references Qu Wenruo
2023-10-22 3:40 ` Qu Wenruo [this message]
2023-10-22 3:40 ` [PATCH 3/3] btrfs-progs: fsck-tests: add test image of out-of-order inline backref items Qu Wenruo
2023-10-24 5:28 ` Anand Jain
2023-10-24 5:47 ` Qu Wenruo
2023-10-24 11:15 ` David Sterba
2023-10-23 13:42 ` [PATCH 0/3] btrfs-progs: follow-ups for issue #622 David Sterba
2023-10-24 6:18 ` Anand Jain
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=0af53e129f107cb91b7ce3f6d22e6f83e4457e70.1697945679.git.wqu@suse.com \
--to=wqu@suse.com \
--cc=linux-btrfs@vger.kernel.org \
/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;
as well as URLs for NNTP newsgroup(s).