Re: [PATCH] xfs: honor init_xattrs in xfs_init_new_inode for !attr && attr2 fs

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, Jul 01, 2024 at 04:37:49PM -0700, Darrick J. Wong wrote:
> On Mon, Jul 01, 2024 at 11:27:09AM +1000, Dave Chinner wrote:
> > On Tue, Jun 18, 2024 at 06:06:22PM -0700, Darrick J. Wong wrote:
> > > On Tue, Jun 18, 2024 at 04:21:12PM -0700, Darrick J. Wong wrote:
> > > > From: Darrick J. Wong <djwong@xxxxxxxxxx>
> > > > 
> > > > xfs_init_new_inode ignores the init_xattrs parameter for filesystems
> > > > that have ATTR2 enabled but not ATTR.  As a result, the first file to be
> > > > created by the kernel will not have an attr fork created to store acls.
> > > > Storing that first acl will add ATTR to the superblock flags, so chances
> > > > are nobody has noticed this previously.
> > > > 
> > > > However, this is disastrous on a filesystem with parent pointers because
> > > > it requires that a new linkable file /must/ have a pre-existing attr
> > > > fork.
> > 
> > How are we creating a parent pointer filesystem that doesn't have
> > XFS_SB_VERSION_ATTRBIT set in it? I thought that mkfs.xfs was going
> > to always set this....
> 
> <shrug> The first three versions didn't set ATTRBIT; somewhere between
> v4 and v5 Allison changed mkfs to set ATTRBIT; and as of v13 it still
> does.
> 
> That said, there aren't actually any parent pointers on an empty
> filesystem because the root dir is empty and the rt/quota inode are
> children of the superblock.  So, technically speaking, it's not
> *required* for mkfs to set it, at least not until we start adding
> metadir inodes.
> 
> At no point during the development of parent pointers has xfs_repair
> ever validated that ATTRBIT is set if PARENT is enabled -- it only
> checks that ATTRBIT is set if any attr forks are found.

Right, that's the oversight we need to correct. mkfs.xfs is already
setting it, so adding checks to the suerpblock verifier, repair, etc
isn't going to break anything.

> > > > The preproduction version of mkfs.xfs have always set this, but
> > > > as xfs_sb.c doesn't validate that pptrs filesystems have ATTR set, we
> > > > must catch this case.
> > 
> > Which is sounds like it is supposed to - how is parent pointers
> > getting enabled such that XFS_SB_VERSION_ATTRBIT is not actually
> > set?
> 
> Someone who fuzzes the filesystem could turn off ATTRBIT on an empty fs.
> That's a valid configuration since there are also no parent pointers.

No, it's not. The parent pointer feature bit it set, mkfs.xfs always
sets the ATTRBIT in that case, so the superblock feature bit checker
needs to error out if (PARENT | ATTRBIT) == PARENT.

This is basic on-disk format verification stuff, Darrick, and you
know this as well as I do.

> Or at least I'm assuming it is since xfs_repair has never complained
> about ATTRBIT being set on a filesystem with no attr forks, and nobody's
> suggested adding that enforcement in the 6 years the parent pointer
> series has been out for review.

Which is a classic demonstration of an oversight. We're not
omniscent, and hindsight is wonderful for making things we missed
obvious.

Also, xfs_repair failing to catch something doesn't mean the
behaviour is correct or good. It just means we failed to consider
that specific failure mode and so haven't added the code to catch
it. Fixing this sort of oversight is exactly why we have
EXPERIMENTAL tags....

> Getting back to the story, if someone mounts that empty filesystem and
> tries to create a directory structure, the fs blows up.  This patch
> fixes that situation without adding more ways that mount can fail.

But that's the issue: we should not be working around feature bit
bugs in core XFS code. PARENT is dependent on ATTRBIT being set, and
the whole point of our feature bit checks is to catch on-disk format
bugs like this at mount time. Ignoring the bad feature flag
combination and workign around them in core code is the antithesis
of the XFS on-disk format verification architecture.

The fact is that mount *should fail* if PARENT is set and ATTRBIT is
not. xfs_repair should flag this as an error and fix it. mkfs.xfs
has set both PARENT and ATTRBIT for a long long time, and so we
should be enforcing that config everywhere. We should not be working
around an invalid feature bit combination anywhere in the XFS code,
ever.

> > > > Note that the sb verifier /does/ require ATTR2 for V5 filesystems, so we
> > > > can fix both problems by amending xfs_init_new_inode to set up the attr
> > > > fork for either ATTR or ATTR2.
> > 
> > True, but it still seems to me like we should be fixing mkfs.xfs and
> > the superblock verifier to do the right thing given this is all
> > still experimental and we're allowed to fix on-disk format bugs
> > like this.
> > 
> > Can we add that to the superblock verifier so that the parent
> > pointer filesystems will not mount if mkfs is not setting the 
> > XFS_SB_VERSION_ATTRBIT correctly when the parent pointer feature is
> > enabled?
> > 
> > Worst case is that early testers will need to use xfs_db to set the
> > XFS_SB_VERSION_ATTRBIT and then the filesystem will mount again...
> 
> Patches welcome.

It's taken me a long time to calm down after reading these two
words.

One of the reasons we have an EXPERIMENTAL period for new features
is to provide scope for correcting on-disk format screwups like this
properly. This means we don't need to carry hacks around stupid
thinko's and straight out bugs in the on-disk format and initial
implementation forever.

We also work under the guidelines that it is largely the
responsibility of the engineer who asked for the new functionality
to be merged to do most of the heavy lifting to fix such issues
during the EXPERIMENTAL period.

Suggesting that someone else should do the work to tidy up the loose
on-disk format ends in the kernel and userspace in preference to a
one line hack that works around the problem goes against all the
agreements we've had for bringing experimental code up to production
quality. This isn't how to engineer high quality, robust long lived
code...

-Dave.
-- 
Dave Chinner
david@xxxxxxxxxxxxx




[Index of Archives]     [XFS Filesystem Development (older mail)]     [Linux Filesystem Development]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux RAID]     [Linux SCSI]


  Powered by Linux