Re: [PATCH 1/3] xfs: move kernel-specific superblock validation out of libxfs

Dave Chinner
2020-12-04T23:30:16Z

On Fri, Dec 04, 2020 at 03:46:19PM -0600, Eric Sandeen wrote:
> On 12/4/20 3:12 PM, Darrick J. Wong wrote:
> > On Fri, Dec 04, 2020 at 02:35:45PM -0600, Eric Sandeen wrote:
> >> On 11/30/20 9:37 PM, Darrick J. Wong wrote:
> >>> From: Darrick J. Wong <darrick.wong@oracle.com>
> >>>
> >>> A couple of the superblock validation checks apply only to the kernel,
> >>> so move them to xfs_mount.c before we start changing sb_inprogress.
>
> oh also, you're not changing sb_inprogress anymore, right? ;)
>
> >>> This also reduces the diff between kernel and userspace libxfs.
> >>
> >> My only complaint is that "xfs_sb_validate_mount" isn't really descriptive
> >> at all, and nobody reading the code or comments will know why we've chosen
> >> to move just these two checks out of the common validator...
> >>
> >> What does "compatible with this mount" mean?
> >
> > Compatible with this implementation?
>
> Hm.
>
> So most of xfs_validate_sb_common is doing internal consistency checking
> that has nothing at all to do with the host's core capabilities or filesystem
> "state" (other than version/features I guess).
>
> You've moved out the PAGE_SIZE check, which depends on the host.
>
> You've also moved the inprogress check, which depends on state.
> (and that's not really "kernel-specific" is it?)
>
> You'll later move the NEEDSREPAIR check, which I guess is state.
>
> But you haven't moved the fsb_count-vs-host check, which depends on the host.
>
> (and ... I think that one may actually be kernel-specific,
> because it depends on pagecache limitations in the kernel, so maybe it
> should be moved out as well?)
>
> So maybe the distinction is internal consistency checks, vs
> host-compatibility-and-filesystem-state checks.
>
> How about ultimately:
>
> /*
> * Do host compatibility and filesystem state checks here; these are unique
> * to the kernel, and may differ in userspace.
> */
> xfs_validate_sb_host(
> struct xfs_mount *mp,
> struct xfs_buf *bp,
> struct xfs_sb *sbp)
> {

THis host stuff should be checked in xfs_fs_fill_super(), right?

i.e. it's not really part of the superblock validation, but checking
if the host can actually run this filesystem. That's what we do in
xfs_fc_fill_super(), such as the max file size support, whether
mount options are valid for the superblock config (e.g. reflink vs
rt) and so on. IOWs, these aren't corruption verifiers, just config
checks, so we should put them with all the other config checks we do
at mount time...

i.e. call it something like xfs_fs_validate_sb_config() and move all
the config and experimental function checks into it, call it only
from xfs_fs_fill_super() once we've already read in and validated
the superblock is within the bounds defined by the on-disk format.

Oh, and just another thing: can we rename all the "xfs_fc_*"
functions in xfs_super.c back to xfs_fs_*? I'm getting tired of not
being about to find the superblock init functions in xfs_super.c
(e.g. xfs_fs_fill_super()) with grep or cscope because they have a
whacky, one-off namespace now...

Cheers,

Dave.

--
Dave Chinner
david@fromorbit.com