diff options
author | Darrick J. Wong <djwong@kernel.org> | 2023-04-12 05:00:09 +0300 |
---|---|---|
committer | Darrick J. Wong <djwong@kernel.org> | 2023-04-12 05:00:09 +0300 |
commit | 2bea8df0a52b05bc0dddd54e950ae37c83533b03 (patch) | |
tree | 6508ec181a26296364dab3b79567d37c9177839e /fs/xfs/scrub/btree.h | |
parent | c99f99fa3eafc824ea6859590f5d2e4c6a7f4359 (diff) | |
download | linux-2bea8df0a52b05bc0dddd54e950ae37c83533b03.tar.xz |
xfs: always scrub record/key order of interior records
In commit d47fef9342d0, we removed the firstrec and firstkey fields of
struct xchk_btree because Christoph thought they were unnecessary
because we could use the record index in the btree cursor. This is
incorrect because bc_ptrs (now bc_levels[].ptr) tracks the cursor
position within a specific btree block, not within the entire level.
The end result is that scrub no longer detects situations where the
rightmost record of a block is identical to the leftmost record of that
block's right sibling. Fix this regression by reintroducing record
validity booleans so that order checking skips *only* the leftmost
record/key in each level.
Fixes: d47fef9342d0 ("xfs: don't track firstrec/firstkey separately in xchk_btree")
Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Diffstat (limited to 'fs/xfs/scrub/btree.h')
-rw-r--r-- | fs/xfs/scrub/btree.h | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/fs/xfs/scrub/btree.h b/fs/xfs/scrub/btree.h index 639e44e7544f..9d7b9ee8bef4 100644 --- a/fs/xfs/scrub/btree.h +++ b/fs/xfs/scrub/btree.h @@ -31,6 +31,11 @@ typedef int (*xchk_btree_rec_fn)( struct xchk_btree *bs, const union xfs_btree_rec *rec); +struct xchk_btree_key { + union xfs_btree_key key; + bool valid; +}; + struct xchk_btree { /* caller-provided scrub state */ struct xfs_scrub *sc; @@ -40,11 +45,12 @@ struct xchk_btree { void *private; /* internal scrub state */ + bool lastrec_valid; union xfs_btree_rec lastrec; struct list_head to_check; /* this element must come last! */ - union xfs_btree_key lastkey[]; + struct xchk_btree_key lastkey[]; }; /* |