From: "Darrick J. Wong" <darrick.wong@oracle.com>
To: darrick.wong@oracle.com
Cc: linux-xfs@vger.kernel.org, bfoster@redhat.com
Subject: [PATCH 08/10] xfs: btree scrub should check minrecs
Date: Sun, 22 Apr 2018 08:08:23 -0700 [thread overview]
Message-ID: <152440970335.30048.3140499875347648459.stgit@magnolia> (raw)
In-Reply-To: <152440964593.30048.15577210457233332459.stgit@magnolia>
From: Darrick J. Wong <darrick.wong@oracle.com>
Strengthen the btree block header checks to detect the number of records
being less than the btree type's minimum record count. Certain blocks
are allowed to violate this constraint -- specifically any btree block
at the top of the tree can have fewer than minrecs records.
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
---
fs/xfs/scrub/btree.c | 40 ++++++++++++++++++++++++++++++++++++++++
1 file changed, 40 insertions(+)
diff --git a/fs/xfs/scrub/btree.c b/fs/xfs/scrub/btree.c
index ea972da..2d29dce 100644
--- a/fs/xfs/scrub/btree.c
+++ b/fs/xfs/scrub/btree.c
@@ -455,6 +455,44 @@ xfs_scrub_btree_check_owner(
}
/*
+ * Check that this btree block has at least minrecs records or is one of the
+ * special blocks that don't require that.
+ */
+STATIC void
+xfs_scrub_btree_check_minrecs(
+ struct xfs_scrub_btree *bs,
+ int level,
+ struct xfs_btree_block *block)
+{
+ unsigned int numrecs;
+ int ok_level;
+
+ numrecs = be16_to_cpu(block->bb_numrecs);
+
+ /* More records than minrecs means the block is ok. */
+ if (numrecs >= bs->cur->bc_ops->get_minrecs(bs->cur, level))
+ return;
+
+ /*
+ * Certain btree blocks /can/ have fewer than minrecs records. Any
+ * level greater than or equal to the level of the highest dedicated
+ * btree block are allowed to violate this constraint.
+ *
+ * For a btree rooted in a block, the btree root can have fewer than
+ * minrecs records. If the btree is rooted in an inode and does not
+ * store records in the root, the direct children of the root and the
+ * root itself can have fewer than minrecs records.
+ */
+ ok_level = bs->cur->bc_nlevels - 1;
+ if (bs->cur->bc_flags & XFS_BTREE_ROOT_IN_INODE)
+ ok_level--;
+ if (level >= ok_level)
+ return;
+
+ xfs_scrub_btree_set_corrupt(bs->sc, bs->cur, level);
+}
+
+/*
* Grab and scrub a btree block given a btree pointer. Returns block
* and buffer pointers (if applicable) if they're ok to use.
*/
@@ -491,6 +529,8 @@ xfs_scrub_btree_get_block(
if (*pbp)
xfs_scrub_buffer_recheck(bs->sc, *pbp);
+ xfs_scrub_btree_check_minrecs(bs, level, *pblock);
+
/*
* Check the block's owner; this function absorbs error codes
* for us.
next prev parent reply other threads:[~2018-04-22 15:08 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-04-22 15:07 [PATCH v2 00/10] xfs-4.18: online scrub fixes Darrick J. Wong
2018-04-22 15:07 ` [PATCH 01/10] xfs: skip scrub xref if corruption already noted Darrick J. Wong
2018-04-22 15:07 ` [PATCH 02/10] xfs: don't continue scrub if already corrupt Darrick J. Wong
2018-04-22 15:07 ` [PATCH 03/10] xfs: avoid ilock games in the quota scrubber Darrick J. Wong
2018-04-22 15:07 ` [PATCH 04/10] xfs: quota scrub should use bmapbtd scrubber Darrick J. Wong
2018-04-22 15:08 ` [PATCH 05/10] xfs: scrub the data fork of the realtime inodes Darrick J. Wong
2018-04-22 15:08 ` [PATCH 06/10] xfs: superblock scrub should use short-lived buffers Darrick J. Wong
2018-04-22 15:08 ` [PATCH 07/10] xfs: clean up scrub usage of KM_NOFS Darrick J. Wong
2018-04-22 15:08 ` Darrick J. Wong [this message]
2018-04-22 15:08 ` [PATCH 09/10] xfs: refactor scrub transaction allocation function Darrick J. Wong
2018-04-22 15:08 ` [PATCH 10/10] xfs: avoid ABBA deadlock when scrubbing parent pointers Darrick J. Wong
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=152440970335.30048.3140499875347648459.stgit@magnolia \
--to=darrick.wong@oracle.com \
--cc=bfoster@redhat.com \
--cc=linux-xfs@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).