From: Dave Chinner <david@fromorbit.com>
To: "Darrick J. Wong" <darrick.wong@oracle.com>
Cc: linux-xfs@vger.kernel.org
Subject: Re: [PATCH 06/22] xfs: scrub the backup superblocks
Date: Tue, 25 Jul 2017 14:05:00 +1000 [thread overview]
Message-ID: <20170725040500.GI17762@dastard> (raw)
In-Reply-To: <150061194700.14732.436243943528759418.stgit@magnolia>
On Thu, Jul 20, 2017 at 09:39:07PM -0700, Darrick J. Wong wrote:
> From: Darrick J. Wong <darrick.wong@oracle.com>
>
> Ensure that the geometry presented in the backup superblocks matches
> the primary superblock so that repair can recover the filesystem if
> that primary gets corrupted.
>
> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
....
> +int
> +xfs_scrub_setup_ag_header(
> + struct xfs_scrub_context *sc,
> + struct xfs_inode *ip)
> +{
> + struct xfs_mount *mp = sc->mp;
> +
> + if (sc->sm->sm_agno >= mp->m_sb.sb_agcount ||
> + sc->sm->sm_ino || sc->sm->sm_gen)
> + return -EINVAL;
> + return xfs_scrub_setup_fs(sc, ip);
> +}
Could we create a superblock buffer here that contains just the bits
we expect the secondary superblocks to have up to date (everything
else should be zero!), and then just use a memcmp() on the raw
secondary superblock buffer?
If there is a difference, then we can dig further to find what's
wrong?
> +/* Superblock */
> +
> +#define XFS_SCRUB_SB_CHECK(fs_ok) \
> + XFS_SCRUB_CHECK(sc, bp, "superblock", fs_ok)
> +#define XFS_SCRUB_SB_PREEN(fs_ok) \
> + XFS_SCRUB_PREEN(sc, bp, "superblock", fs_ok)
I don't understand from reading the code why some fields are checked
and others are preened. A comment explaining this would be helpful.
> +#define XFS_SCRUB_SB_OP_ERROR_GOTO(label) \
> + XFS_SCRUB_OP_ERROR_GOTO(sc, agno, 0, "superblock", &error, out)
> +/* Scrub the filesystem superblock. */
> +int
> +xfs_scrub_superblock(
> + struct xfs_scrub_context *sc)
> +{
> + struct xfs_mount *mp = sc->mp;
> + struct xfs_buf *bp;
> + struct xfs_sb sb;
> + xfs_agnumber_t agno;
> + uint32_t v2_ok;
> + int error;
> +
> + agno = sc->sm->sm_agno;
> +
> + error = xfs_trans_read_buf(mp, sc->tp, mp->m_ddev_targp,
> + XFS_AGB_TO_DADDR(mp, agno, XFS_SB_BLOCK(mp)),
> + XFS_FSS_TO_BB(mp, 1), 0, &bp, &xfs_sb_buf_ops);
> + if (error) {
> + trace_xfs_scrub_block_error(mp, agno, XFS_SB_BLOCK(mp),
> + "superblock", "error != 0", __func__, __LINE__);
> + error = 0;
> + sc->sm->sm_flags |= XFS_SCRUB_FLAG_CORRUPT;
> + goto out;
> + }
> +
> + /*
> + * The in-core sb is a more up-to-date copy of AG 0's sb,
> + * so there's no point in comparing the two.
> + */
> + if (agno == 0)
> + goto out;
Check this before reading the sb buffer?
> + xfs_sb_from_disk(&sb, XFS_BUF_TO_SBP(bp));
Ok, there's a problem here - the on-disk superblock needs all unused
fields, empty space and feature bit conditional fields to be zero on
disk. Unused and feature dependent fields aren't necessarily zero in
memory, so we're not really scrubbing the on-disk superblock here.
ALso, all the space between the end of the defined superblock and
the end of the superblock sector must be zero, so scrubbing needs to
verify that, too.
> +
> + /* Verify the geometries match. */
> +#define XFS_SCRUB_SB_FIELD(fn) \
> + XFS_SCRUB_SB_CHECK(sb.sb_##fn == mp->m_sb.sb_##fn)
> +#define XFS_PREEN_SB_FIELD(fn) \
> + XFS_SCRUB_SB_PREEN(sb.sb_##fn == mp->m_sb.sb_##fn)
> + XFS_SCRUB_SB_FIELD(blocksize);
> + XFS_SCRUB_SB_FIELD(dblocks);
> + XFS_SCRUB_SB_FIELD(rblocks);
> + XFS_SCRUB_SB_FIELD(rextents);
> + XFS_SCRUB_SB_PREEN(uuid_equal(&sb.sb_uuid, &mp->m_sb.sb_uuid));
Isn't this dependent on the xfs_sb_version_hasmetauuid() feature?
Regardless, I think this should be part of the checks done based on
that feature bit below...
....
> + if (xfs_sb_version_hascrc(&mp->m_sb)) {
> + XFS_SCRUB_SB_CHECK(!xfs_sb_has_compat_feature(&sb,
> + XFS_SB_FEAT_COMPAT_UNKNOWN));
> + XFS_SCRUB_SB_CHECK(!xfs_sb_has_ro_compat_feature(&sb,
> + XFS_SB_FEAT_RO_COMPAT_UNKNOWN));
> + XFS_SCRUB_SB_CHECK(!xfs_sb_has_incompat_feature(&sb,
> + XFS_SB_FEAT_INCOMPAT_UNKNOWN));
> + XFS_SCRUB_SB_CHECK(!xfs_sb_has_incompat_log_feature(&sb,
> + XFS_SB_FEAT_INCOMPAT_LOG_UNKNOWN));
> + XFS_SCRUB_SB_FIELD(spino_align);
> + XFS_PREEN_SB_FIELD(pquotino);
> + }
else all these fields should be zero on disk.
> + if (xfs_sb_version_hasmetauuid(&mp->m_sb)) {
> + XFS_SCRUB_SB_CHECK(uuid_equal(&sb.sb_meta_uuid,
> + &mp->m_sb.sb_meta_uuid));
> + XFS_SCRUB_SB_CHECK(uuid_equal(&sb.sb_uuid,
> + &mp->m_sb.sb_uuid));
> + } else
> + XFS_SCRUB_SB_CHECK(uuid_equal(&sb.sb_uuid,
> + &mp->m_sb.sb_meta_uuid));
That's checking in-memory state is valid, not that the on-disk
sb_meta_uuid field is zero for this case.
> +#undef XFS_SCRUB_SB_FIELD
> +
> +#define XFS_SCRUB_SB_FEAT(fn) \
> + XFS_SCRUB_SB_CHECK(xfs_sb_version_has##fn(&sb) == \
> + xfs_sb_version_has##fn(&mp->m_sb))
> + XFS_SCRUB_SB_FEAT(align);
> + XFS_SCRUB_SB_FEAT(dalign);
> + XFS_SCRUB_SB_FEAT(logv2);
> + XFS_SCRUB_SB_FEAT(extflgbit);
> + XFS_SCRUB_SB_FEAT(sector);
> + XFS_SCRUB_SB_FEAT(asciici);
> + XFS_SCRUB_SB_FEAT(morebits);
> + XFS_SCRUB_SB_FEAT(lazysbcount);
> + XFS_SCRUB_SB_FEAT(crc);
> + XFS_SCRUB_SB_FEAT(_pquotino);
> + XFS_SCRUB_SB_FEAT(ftype);
> + XFS_SCRUB_SB_FEAT(finobt);
> + XFS_SCRUB_SB_FEAT(sparseinodes);
> + XFS_SCRUB_SB_FEAT(metauuid);
> + XFS_SCRUB_SB_FEAT(rmapbt);
> + XFS_SCRUB_SB_FEAT(reflink);
> +#undef XFS_SCRUB_SB_FEAT
Do we need bit by bit feature checks? It's trivial to look up the
mismatched bits from just the raw values....
Cheers,
Dave.
--
Dave Chinner
david@fromorbit.com
next prev parent reply other threads:[~2017-07-25 4:05 UTC|newest]
Thread overview: 63+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-07-21 4:38 [PATCH v8 00/22] xfs: online scrub support Darrick J. Wong
2017-07-21 4:38 ` [PATCH 01/22] xfs: query the per-AG reservation counters Darrick J. Wong
2017-07-23 16:16 ` Allison Henderson
2017-07-23 22:25 ` Dave Chinner
2017-07-24 19:07 ` Darrick J. Wong
2017-07-21 4:38 ` [PATCH 02/22] xfs: add scrub tracepoints Darrick J. Wong
2017-07-23 16:23 ` Allison Henderson
2017-07-21 4:38 ` [PATCH 03/22] xfs: create an ioctl to scrub AG metadata Darrick J. Wong
2017-07-23 16:37 ` Allison Henderson
2017-07-23 23:45 ` Dave Chinner
2017-07-24 21:14 ` Darrick J. Wong
2017-07-21 4:38 ` [PATCH 04/22] xfs: generic functions to scrub metadata and btrees Darrick J. Wong
2017-07-23 16:40 ` Allison Henderson
2017-07-24 1:05 ` Dave Chinner
2017-07-24 21:58 ` Darrick J. Wong
2017-07-24 23:15 ` Dave Chinner
2017-07-25 0:39 ` Darrick J. Wong
2017-07-21 4:39 ` [PATCH 05/22] xfs: scrub in-memory metadata buffers Darrick J. Wong
2017-07-23 16:48 ` Allison Henderson
2017-07-24 1:43 ` Dave Chinner
2017-07-24 22:36 ` Darrick J. Wong
2017-07-24 23:38 ` Dave Chinner
2017-07-25 0:14 ` Darrick J. Wong
2017-07-25 3:32 ` Dave Chinner
2017-07-25 5:27 ` Darrick J. Wong
2017-07-21 4:39 ` [PATCH 06/22] xfs: scrub the backup superblocks Darrick J. Wong
2017-07-23 16:50 ` Allison Henderson
2017-07-25 4:05 ` Dave Chinner [this message]
2017-07-25 5:42 ` Darrick J. Wong
2017-07-21 4:39 ` [PATCH 07/22] xfs: scrub AGF and AGFL Darrick J. Wong
2017-07-23 16:59 ` Allison Henderson
2017-07-21 4:39 ` [PATCH 08/22] xfs: scrub the AGI Darrick J. Wong
2017-07-23 17:02 ` Allison Henderson
2017-07-21 4:39 ` [PATCH 09/22] xfs: scrub free space btrees Darrick J. Wong
2017-07-23 17:09 ` Allison Henderson
2017-07-21 4:39 ` [PATCH 10/22] xfs: scrub inode btrees Darrick J. Wong
2017-07-23 17:15 ` Allison Henderson
2017-07-21 4:39 ` [PATCH 11/22] xfs: scrub rmap btrees Darrick J. Wong
2017-07-23 17:21 ` Allison Henderson
2017-07-21 4:39 ` [PATCH 12/22] xfs: scrub refcount btrees Darrick J. Wong
2017-07-23 17:25 ` Allison Henderson
2017-07-21 4:39 ` [PATCH 13/22] xfs: scrub inodes Darrick J. Wong
2017-07-23 17:38 ` Allison Henderson
2017-07-24 20:02 ` Darrick J. Wong
2017-07-21 4:40 ` [PATCH 14/22] xfs: scrub inode block mappings Darrick J. Wong
2017-07-23 17:41 ` Allison Henderson
2017-07-24 20:05 ` Darrick J. Wong
2017-07-21 4:40 ` [PATCH 15/22] xfs: scrub directory/attribute btrees Darrick J. Wong
2017-07-23 17:45 ` Allison Henderson
2017-07-21 4:40 ` [PATCH 16/22] xfs: scrub directory metadata Darrick J. Wong
2017-07-23 17:51 ` Allison Henderson
2017-07-21 4:40 ` [PATCH 17/22] xfs: scrub directory freespace Darrick J. Wong
2017-07-23 17:55 ` Allison Henderson
2017-07-21 4:40 ` [PATCH 18/22] xfs: scrub extended attributes Darrick J. Wong
2017-07-23 17:57 ` Allison Henderson
2017-07-21 4:40 ` [PATCH 19/22] xfs: scrub symbolic links Darrick J. Wong
2017-07-23 17:59 ` Allison Henderson
2017-07-21 4:40 ` [PATCH 20/22] xfs: scrub parent pointers Darrick J. Wong
2017-07-23 18:03 ` Allison Henderson
2017-07-21 4:40 ` [PATCH 21/22] xfs: scrub realtime bitmap/summary Darrick J. Wong
2017-07-23 18:05 ` Allison Henderson
2017-07-21 4:40 ` [PATCH 22/22] xfs: scrub quota information Darrick J. Wong
2017-07-23 18:07 ` Allison Henderson
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=20170725040500.GI17762@dastard \
--to=david@fromorbit.com \
--cc=darrick.wong@oracle.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