From: "Darrick J. Wong" <darrick.wong@oracle.com>
To: linux-xfs@vger.kernel.org
Cc: david@fromorbit.com
Subject: Re: [PATCH 07/25] xfs: scrub btree keys and records
Date: Wed, 4 Oct 2017 13:52:48 -0700 [thread overview]
Message-ID: <20171004205248.GV6503@magnolia> (raw)
In-Reply-To: <150706329392.19351.7914012941264600843.stgit@magnolia>
On Tue, Oct 03, 2017 at 01:41:33PM -0700, Darrick J. Wong wrote:
> From: Darrick J. Wong <darrick.wong@oracle.com>
>
> Add to the btree scrubber the ability to check that the keys and
> records are in the right order and actually call out to our record
> iterator to do actual checking of the records.
>
> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
> ---
> fs/xfs/scrub/btree.c | 108 ++++++++++++++++++++++++++++++++++++++++++++++++++
> fs/xfs/scrub/trace.h | 44 ++++++++++++++++++++
> 2 files changed, 152 insertions(+)
>
>
> diff --git a/fs/xfs/scrub/btree.c b/fs/xfs/scrub/btree.c
> index 899c9b1..ad3518c 100644
> --- a/fs/xfs/scrub/btree.c
> +++ b/fs/xfs/scrub/btree.c
> @@ -92,6 +92,101 @@ xfs_scrub_btree_set_corrupt(
> __return_address);
> }
>
> +/*
> + * Make sure this record is in order and doesn't stray outside of the parent
> + * keys.
> + */
> +STATIC void
> +xfs_scrub_btree_rec(
> + struct xfs_scrub_btree *bs)
> +{
> + struct xfs_btree_cur *cur = bs->cur;
> + union xfs_btree_rec *rec;
> + union xfs_btree_key key;
> + union xfs_btree_key hkey;
> + union xfs_btree_key *keyp;
> + struct xfs_btree_block *block;
> + struct xfs_btree_block *keyblock;
> + struct xfs_buf *bp;
> +
> + block = xfs_btree_get_block(cur, 0, &bp);
> + rec = xfs_btree_rec_addr(cur, cur->bc_ptrs[0], block);
> +
> + trace_xfs_scrub_btree_rec(bs->sc, cur, 0);
> +
> + /* If this isn't the first record, are they in order? */
> + if (!bs->firstrec && !cur->bc_ops->recs_inorder(cur, &bs->lastrec, rec))
> + xfs_scrub_btree_set_corrupt(bs->sc, cur, 0);
> + bs->firstrec = false;
> + memcpy(&bs->lastrec, rec, cur->bc_ops->rec_len);
> +
> + if (cur->bc_nlevels == 1)
> + return;
> +
> + /* Is this at least as large as the parent low key? */
> + cur->bc_ops->init_key_from_rec(&key, rec);
> + keyblock = xfs_btree_get_block(cur, 1, &bp);
> + keyp = xfs_btree_key_addr(cur, cur->bc_ptrs[1], keyblock);
> + if (cur->bc_ops->diff_two_keys(cur, &key, keyp) < 0)
> + xfs_scrub_btree_set_corrupt(bs->sc, cur, 1);
> +
> + if (!(cur->bc_flags & XFS_BTREE_OVERLAPPING))
> + return;
> +
> + /* Is this no larger than the parent high key? */
> + cur->bc_ops->init_high_key_from_rec(&hkey, rec);
> + keyp = xfs_btree_high_key_addr(cur, cur->bc_ptrs[1], keyblock);
> + if (cur->bc_ops->diff_two_keys(cur, keyp, &hkey) < 0)
> + xfs_scrub_btree_set_corrupt(bs->sc, cur, 1);
> +}
> +
> +/*
> + * Make sure this key is in order and doesn't stray outside of the parent
> + * keys.
> + */
> +STATIC void
> +xfs_scrub_btree_key(
> + struct xfs_scrub_btree *bs,
> + int level)
> +{
> + struct xfs_btree_cur *cur = bs->cur;
> + union xfs_btree_key *key;
> + union xfs_btree_key *keyp;
> + struct xfs_btree_block *block;
> + struct xfs_btree_block *keyblock;
> + struct xfs_buf *bp;
> +
> + block = xfs_btree_get_block(cur, level, &bp);
> + key = xfs_btree_key_addr(cur, cur->bc_ptrs[level], block);
> +
> + trace_xfs_scrub_btree_key(bs->sc, cur, level);
> +
> + /* If this isn't the first key, are they in order? */
> + if (!bs->firstkey[level] &&
> + !cur->bc_ops->keys_inorder(cur, &bs->lastkey[level], key))
> + xfs_scrub_btree_set_corrupt(bs->sc, cur, level);
> + bs->firstkey[level] = false;
> + memcpy(&bs->lastkey[level], key, cur->bc_ops->key_len);
> +
> + if (level + 1 >= cur->bc_nlevels)
> + return;
> +
> + /* Is this at least as large as the parent low key? */
> + keyblock = xfs_btree_get_block(cur, level + 1, &bp);
> + keyp = xfs_btree_key_addr(cur, cur->bc_ptrs[level + 1], keyblock);
> + if (cur->bc_ops->diff_two_keys(cur, key, keyp) < 0)
> + xfs_scrub_btree_set_corrupt(bs->sc, cur, level);
> +
> + if (!(cur->bc_flags & XFS_BTREE_OVERLAPPING))
> + return;
> +
> + /* Is this no larger than the parent high key? */
> + key = xfs_btree_high_key_addr(cur, cur->bc_ptrs[level], block);
> + keyp = xfs_btree_high_key_addr(cur, cur->bc_ptrs[level + 1], keyblock);
> + if (cur->bc_ops->diff_two_keys(cur, keyp, key) < 0)
> + xfs_scrub_btree_set_corrupt(bs->sc, cur, level);
> +}
> +
> /* Check a btree pointer. Returns true if it's ok to use this pointer. */
> static bool
> xfs_scrub_btree_ptr_ok(
> @@ -256,6 +351,7 @@ xfs_scrub_btree(
> struct xfs_scrub_btree bs = {0};
> union xfs_btree_ptr ptr;
> union xfs_btree_ptr *pp;
> + union xfs_btree_rec *recp;
> struct xfs_btree_block *block;
> int level;
> struct xfs_buf *bp;
> @@ -311,6 +407,15 @@ xfs_scrub_btree(
> continue;
> }
>
> + /* Records in order for scrub? */
> + xfs_scrub_btree_rec(&bs);
> +
> + /* Call out to the record checker. */
> + recp = xfs_btree_rec_addr(cur, cur->bc_ptrs[0], block);
> + error = bs.scrub_rec(&bs, recp);
> + if (error < 0 ||
> + error == XFS_BTREE_QUERY_RANGE_ABORT)
> + break;
> if (xfs_scrub_should_terminate(sc, &error))
> break;
Referencing the discussion of a later patch, we could check for
OFLAG_CORRUPT here as a quick way out if we find corruption in the
metadata object.
--D
>
> @@ -326,6 +431,9 @@ xfs_scrub_btree(
> continue;
> }
>
> + /* Keys in order for scrub? */
> + xfs_scrub_btree_key(&bs, level);
> +
> /* Drill another level deeper. */
> pp = xfs_btree_ptr_addr(cur, cur->bc_ptrs[level], block);
> if (!xfs_scrub_btree_ptr_ok(&bs, level, pp)) {
> diff --git a/fs/xfs/scrub/trace.h b/fs/xfs/scrub/trace.h
> index 78f96b0..a78c8d1 100644
> --- a/fs/xfs/scrub/trace.h
> +++ b/fs/xfs/scrub/trace.h
> @@ -423,6 +423,50 @@ TRACE_EVENT(xfs_scrub_ifork_btree_error,
> __entry->ret_ip)
> );
>
> +DECLARE_EVENT_CLASS(xfs_scrub_sbtree_class,
> + TP_PROTO(struct xfs_scrub_context *sc, struct xfs_btree_cur *cur,
> + int level),
> + TP_ARGS(sc, cur, level),
> + TP_STRUCT__entry(
> + __field(dev_t, dev)
> + __field(int, type)
> + __field(xfs_btnum_t, btnum)
> + __field(xfs_agnumber_t, agno)
> + __field(xfs_agblock_t, bno)
> + __field(int, level)
> + __field(int, nlevels)
> + __field(int, ptr)
> + ),
> + TP_fast_assign(
> + xfs_fsblock_t fsbno = xfs_scrub_btree_cur_fsbno(cur, level);
> + __entry->dev = sc->mp->m_super->s_dev;
> + __entry->type = sc->sm->sm_type;
> + __entry->btnum = cur->bc_btnum;
> + __entry->agno = XFS_FSB_TO_AGNO(cur->bc_mp, fsbno);
> + __entry->bno = XFS_FSB_TO_AGBNO(cur->bc_mp, fsbno);
> + __entry->level = level;
> + __entry->nlevels = cur->bc_nlevels;
> + __entry->ptr = cur->bc_ptrs[level];
> + ),
> + TP_printk("dev %d:%d type %u btnum %d agno %u agbno %u level %d nlevels %d ptr %d",
> + MAJOR(__entry->dev), MINOR(__entry->dev),
> + __entry->type,
> + __entry->btnum,
> + __entry->agno,
> + __entry->bno,
> + __entry->level,
> + __entry->nlevels,
> + __entry->ptr)
> +)
> +#define DEFINE_SCRUB_SBTREE_EVENT(name) \
> +DEFINE_EVENT(xfs_scrub_sbtree_class, name, \
> + TP_PROTO(struct xfs_scrub_context *sc, struct xfs_btree_cur *cur, \
> + int level), \
> + TP_ARGS(sc, cur, level))
> +
> +DEFINE_SCRUB_SBTREE_EVENT(xfs_scrub_btree_rec);
> +DEFINE_SCRUB_SBTREE_EVENT(xfs_scrub_btree_key);
> +
> #endif /* _TRACE_XFS_SCRUB_TRACE_H */
>
> #undef TRACE_INCLUDE_PATH
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2017-10-04 20:52 UTC|newest]
Thread overview: 91+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-10-03 20:40 [PATCH v11 00/25] xfs: online scrub support Darrick J. Wong
2017-10-03 20:40 ` [PATCH 01/25] xfs: create an ioctl to scrub AG metadata Darrick J. Wong
2017-10-03 20:41 ` [PATCH 02/25] xfs: dispatch metadata scrub subcommands Darrick J. Wong
2017-10-03 20:41 ` [PATCH 03/25] xfs: probe the scrub ioctl Darrick J. Wong
2017-10-03 23:32 ` Dave Chinner
2017-10-04 0:02 ` Darrick J. Wong
2017-10-04 1:56 ` Dave Chinner
2017-10-04 3:14 ` Darrick J. Wong
2017-10-03 20:41 ` [PATCH 04/25] xfs: create helpers to record and deal with scrub problems Darrick J. Wong
2017-10-03 23:44 ` Dave Chinner
2017-10-04 0:56 ` Darrick J. Wong
2017-10-03 20:41 ` [PATCH 05/25] xfs: create helpers to scrub a metadata btree Darrick J. Wong
2017-10-03 23:49 ` Dave Chinner
2017-10-04 0:13 ` Darrick J. Wong
2017-10-03 20:41 ` [PATCH 06/25] xfs: scrub the shape of " Darrick J. Wong
2017-10-04 0:15 ` Dave Chinner
2017-10-04 3:51 ` Darrick J. Wong
2017-10-04 5:48 ` Dave Chinner
2017-10-04 17:48 ` Darrick J. Wong
2017-10-03 20:41 ` [PATCH 07/25] xfs: scrub btree keys and records Darrick J. Wong
2017-10-04 20:52 ` Darrick J. Wong [this message]
2017-10-03 20:41 ` [PATCH 08/25] xfs: create helpers to scan an allocation group Darrick J. Wong
2017-10-04 0:46 ` Dave Chinner
2017-10-04 3:58 ` Darrick J. Wong
2017-10-04 5:59 ` Dave Chinner
2017-10-04 17:51 ` Darrick J. Wong
2017-10-03 20:41 ` [PATCH 09/25] xfs: scrub the backup superblocks Darrick J. Wong
2017-10-04 0:57 ` Dave Chinner
2017-10-04 4:06 ` Darrick J. Wong
2017-10-04 6:13 ` Dave Chinner
2017-10-04 17:56 ` Darrick J. Wong
2017-10-03 20:41 ` [PATCH 10/25] xfs: scrub AGF and AGFL Darrick J. Wong
2017-10-04 1:31 ` Dave Chinner
2017-10-04 4:21 ` Darrick J. Wong
2017-10-04 6:28 ` Dave Chinner
2017-10-04 17:57 ` Darrick J. Wong
2017-10-03 20:41 ` [PATCH 11/25] xfs: scrub the AGI Darrick J. Wong
2017-10-04 1:43 ` Dave Chinner
2017-10-04 4:25 ` Darrick J. Wong
2017-10-04 6:43 ` Dave Chinner
2017-10-04 18:02 ` Darrick J. Wong
2017-10-04 22:16 ` Dave Chinner
2017-10-04 23:12 ` Darrick J. Wong
2017-10-03 20:42 ` [PATCH 12/25] xfs: scrub free space btrees Darrick J. Wong
2017-10-05 0:59 ` Dave Chinner
2017-10-05 1:13 ` Darrick J. Wong
2017-10-03 20:42 ` [PATCH 13/25] xfs: scrub inode btrees Darrick J. Wong
2017-10-05 2:08 ` Dave Chinner
2017-10-05 5:47 ` Darrick J. Wong
2017-10-05 7:22 ` Dave Chinner
2017-10-05 18:26 ` Darrick J. Wong
2017-10-03 20:42 ` [PATCH 14/25] xfs: scrub rmap btrees Darrick J. Wong
2017-10-05 2:56 ` Dave Chinner
2017-10-05 5:02 ` Darrick J. Wong
2017-10-03 20:42 ` [PATCH 15/25] xfs: scrub refcount btrees Darrick J. Wong
2017-10-05 2:59 ` Dave Chinner
2017-10-05 5:02 ` Darrick J. Wong
2017-10-03 20:42 ` [PATCH 16/25] xfs: scrub inodes Darrick J. Wong
2017-10-05 4:04 ` Dave Chinner
2017-10-05 5:22 ` Darrick J. Wong
2017-10-05 7:13 ` Dave Chinner
2017-10-05 19:56 ` Darrick J. Wong
2017-10-03 20:42 ` [PATCH 17/25] xfs: scrub inode block mappings Darrick J. Wong
2017-10-06 2:51 ` Dave Chinner
2017-10-06 17:00 ` Darrick J. Wong
2017-10-07 23:10 ` Dave Chinner
2017-10-08 3:54 ` Darrick J. Wong
2017-10-03 20:42 ` [PATCH 18/25] xfs: scrub directory/attribute btrees Darrick J. Wong
2017-10-06 5:07 ` Dave Chinner
2017-10-06 18:30 ` Darrick J. Wong
2017-10-03 20:42 ` [PATCH 19/25] xfs: scrub directory metadata Darrick J. Wong
2017-10-06 7:07 ` Dave Chinner
2017-10-06 19:45 ` Darrick J. Wong
2017-10-06 22:16 ` Dave Chinner
2017-10-03 20:42 ` [PATCH 20/25] xfs: scrub directory freespace Darrick J. Wong
2017-10-09 1:44 ` Dave Chinner
2017-10-09 22:54 ` Darrick J. Wong
2017-10-03 20:43 ` [PATCH 21/25] xfs: scrub extended attributes Darrick J. Wong
2017-10-09 2:13 ` Dave Chinner
2017-10-09 21:14 ` Darrick J. Wong
2017-10-03 20:43 ` [PATCH 22/25] xfs: scrub symbolic links Darrick J. Wong
2017-10-09 2:17 ` Dave Chinner
2017-10-03 20:43 ` [PATCH 23/25] xfs: scrub parent pointers Darrick J. Wong
2017-10-03 20:43 ` [PATCH 24/25] xfs: scrub realtime bitmap/summary Darrick J. Wong
2017-10-09 2:28 ` Dave Chinner
2017-10-09 20:24 ` Darrick J. Wong
2017-10-03 20:43 ` [PATCH 25/25] xfs: scrub quota information Darrick J. Wong
2017-10-09 2:51 ` Dave Chinner
2017-10-09 20:03 ` Darrick J. Wong
2017-10-09 22:17 ` Dave Chinner
2017-10-09 23:08 ` 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=20171004205248.GV6503@magnolia \
--to=darrick.wong@oracle.com \
--cc=david@fromorbit.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).