Linux XFS filesystem development
 help / color / mirror / Atom feed
From: "Darrick J. Wong" <darrick.wong@oracle.com>
To: Brian Foster <bfoster@redhat.com>
Cc: linux-xfs@vger.kernel.org
Subject: Re: [PATCH] xfs: compile time offset checks for common v4/v5 metadata
Date: Fri, 8 Feb 2019 09:06:26 -0800	[thread overview]
Message-ID: <20190208170626.GP7991@magnolia> (raw)
In-Reply-To: <20190208152442.22862-1-bfoster@redhat.com>

On Fri, Feb 08, 2019 at 10:24:42AM -0500, Brian Foster wrote:
> The v5 superblock format added various metadata fields (such as crc,
> metadata lsn, owner uuid, etc.) to v4 metadata headers or created
> new v5 headers for blocks where no such headers existed on v4. Where
> v4 headers did exist, the v5 structures are careful to place v4
> metadata at the original location. For example, the magic value is
> expected to be at the same location in certain blocks to facilitate
> version detection.
> 
> While failure of this invariant is likely to cause severe and
> obvious problems at runtime, we can detect this condition at compile
> time via the more recently added on-disk format check
> infrastructure. Since there is no runtime cost, add some offset
> checks that start with v5 structure definitions, traverse down to
> the first bit of common metadata with v4 and ensure that common
> metadata is at the expected offset. Note that we don't care about
> blocks which had no v4 header because there is no common metadata in
> those cases. No functional changes.
> 
> Signed-off-by: Brian Foster <bfoster@redhat.com>
> ---
> 
> Hi all,
> 
> This patch is inspired from debug checks that were initially in the
> verifier magic fixup series. I originally had some assert checks to make
> sure magic values were in the same location across v4 and v5 structures.
> Darrick suggested that these were perhaps better suited as build time
> offset checks. My subsequent attempt to convert the magic offset checks
> resulted in somewhat confusing and convoluted build time checks.
> 
> As a result, I opted to remove this stuff from the verifier series to be
> replaced with an independent patch that attempts to verify v5 structures
> place v4 metadata at the expected location in general. This is not a
> known problem or anything, just something that's easy to check for with
> the on-disk format infrastructure already in place and helps validate
> common code.
> 
> I think this covers all structures handled by the verifier series at
> least (some are "internal" in that they are between the top-level v5
> structs and v4 structs), but I could have missed some. Thoughts?

Looks ok to me,
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>

(In my fantasyland we would have comprehensive build-time checks for
every field offset of every on-disk structure, but that's a totally
separate patchset.)

--D

> 
> Brian
> 
>  fs/xfs/xfs_ondisk.h | 21 +++++++++++++++++++++
>  1 file changed, 21 insertions(+)
> 
> diff --git a/fs/xfs/xfs_ondisk.h b/fs/xfs/xfs_ondisk.h
> index d3e04d20d8d4..c8ba98fae30a 100644
> --- a/fs/xfs/xfs_ondisk.h
> +++ b/fs/xfs/xfs_ondisk.h
> @@ -125,6 +125,27 @@ xfs_check_ondisk_structs(void)
>  	XFS_CHECK_STRUCT_SIZE(struct xfs_inode_log_format,	56);
>  	XFS_CHECK_STRUCT_SIZE(struct xfs_qoff_logformat,	20);
>  	XFS_CHECK_STRUCT_SIZE(struct xfs_trans_header,		16);
> +
> +	/*
> +	 * The v5 superblock format extended several v4 header structures with
> +	 * additional data. While new fields are only accessible on v5
> +	 * superblocks, it's important that the v5 structures place original v4
> +	 * fields/headers in the correct location on-disk. For example, we must
> +	 * be able to find magic values at the same location in certain blocks
> +	 * regardless of superblock version.
> +	 *
> +	 * The following checks ensure that various v5 data structures place the
> +	 * subset of v4 metadata associated with the same type of block at the
> +	 * start of the on-disk block. If there is no data structure definition
> +	 * for certain types of v4 blocks, traverse down to the first field of
> +	 * common metadata (e.g., magic value) and make sure it is at offset
> +	 * zero.
> +	 */
> +	XFS_CHECK_OFFSET(struct xfs_dir3_leaf, hdr.info.hdr,	0);
> +	XFS_CHECK_OFFSET(struct xfs_da3_intnode, hdr.info.hdr,	0);
> +	XFS_CHECK_OFFSET(struct xfs_dir3_data_hdr, hdr.magic,	0);
> +	XFS_CHECK_OFFSET(struct xfs_dir3_free, hdr.hdr.magic,	0);
> +	XFS_CHECK_OFFSET(struct xfs_attr3_leafblock, hdr.info.hdr, 0);
>  }
>  
>  #endif /* __XFS_ONDISK_H */
> -- 
> 2.17.2
> 

  reply	other threads:[~2019-02-08 17:06 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-02-08 15:24 [PATCH] xfs: compile time offset checks for common v4/v5 metadata Brian Foster
2019-02-08 17:06 ` Darrick J. Wong [this message]
2019-02-11  8:10 ` Christoph Hellwig

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=20190208170626.GP7991@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