Re: [PATCH 5/8] generic/772: actually check for file_getattr special file support

Darrick J. Wong
2025-10-20T16:26:14Z

On Sat, Oct 18, 2025 at 03:57:08PM +0800, Zorro Lang wrote:
> On Fri, Oct 17, 2025 at 03:54:48PM -0700, Darrick J. Wong wrote:
> > On Sat, Oct 18, 2025 at 01:46:33AM +0800, Zorro Lang wrote:
> > > On Wed, Oct 15, 2025 at 09:38:01AM -0700, Darrick J. Wong wrote:
> > > > From: Darrick J. Wong <djwong@kernel.org>
> > > >
> > > > On XFS in 6.17, this test fails with:
> > > >
> > > > --- /run/fstests/bin/tests/generic/772.out 2025-10-06 08:27:10.834318149 -0700
> > > > +++ /var/tmp/fstests/generic/772.out.bad 2025-10-08 18:00:34.713388178 -0700
> > > > @@ -9,29 +9,34 @@ Can not get fsxattr on ./foo: Invalid ar
> > > > Can not set fsxattr on ./foo: Invalid argument
> > > > Initial attributes state
> > > > ----------------- SCRATCH_MNT/prj
> > > > ------------------ ./fifo
> > > > ------------------ ./chardev
> > > > ------------------ ./blockdev
> > > > ------------------ ./socket
> > > > ------------------ ./foo
> > > > ------------------ ./symlink
> > > > +Can not get fsxattr on ./fifo: Inappropriate ioctl for device
> > > > +Can not get fsxattr on ./chardev: Inappropriate ioctl for device
> > > > +Can not get fsxattr on ./blockdev: Inappropriate ioctl for device
> > > > +Can not get fsxattr on ./socket: Inappropriate ioctl for device
> > > >
> > > > This is a result of XFS' file_getattr implementation rejecting special
> > > > files prior to 6.18. Therefore, skip this new test on old kernels.
> > > >
> > > > Signed-off-by: "Darrick J. Wong" <djwong@kernel.org>
> > > > ---
> > > > tests/generic/772 | 3 +++
> > > > tests/xfs/648 | 3 +++
> > > > 2 files changed, 6 insertions(+)
> > > >
> > > >
> > > > diff --git a/tests/generic/772 b/tests/generic/772
> > > > index cc1a1bb5bf655c..e68a6724654450 100755
> > > > --- a/tests/generic/772
> > > > +++ b/tests/generic/772
> > > > @@ -43,6 +43,9 @@ touch $projectdir/bar
> > > > ln -s $projectdir/bar $projectdir/broken-symlink
> > > > rm -f $projectdir/bar
> > > >
> > > > +file_attr --get $projectdir ./fifo &>/dev/null || \
> > > > + _notrun "file_getattr not supported on $FSTYP"
> > >
> > > I'm wondering if a _require_file_attr() is better?
> >
> > It's checking specifically that the new getattr syscall works on special
> > files. I suppose you could wrap that in a helper, but I think this is a
> > lot more direct about what it's looking for.
>
> Please correct me if I'm wrong. The new syscall is created for setting extended
> attributes on special files, therefore I suppose if there's file_setattr syscall
> and it can work on regular file, then it can work on any other files the fs supports.
> If this's correct, _require_file_attr can use file_attr to try to set and get
> attr on a regular file in $TEST_DIR, to make sure the whole file_set/getattr
> feature is supported. Is that right?

No. The new new syscall allows programs to specify a {dir fd, path}
input that points to a special file, but it uses the existing per-fs
get/setattr implementations. All of those implementations have to
remove their copy-pasta'd code:

if (d_is_special(dentry))
return -ENOTTY;

before the new syscall will return non-error for special files. This
wasn't done for all of the filesystems before 6.18, which means that
6.17 has the syscall but none of the filesystems support accessing
special files. As of 6.18-rc2, gfs, jfs, and ubifs still have that
code.

TLDR: You can't assume that the new syscall works with special files.

--D

> Thanks,
> Zorro
>
> >
> > --D
> >
> > > Thanks,
> > > Zorro
> > >
> > > > +
> > > > echo "Error codes"
> > > > # wrong AT_ flags
> > > > file_attr --get --invalid-at $projectdir ./foo
> > > > diff --git a/tests/xfs/648 b/tests/xfs/648
> > > > index 215c809887b609..e3c2fbe00b666a 100755
> > > > --- a/tests/xfs/648
> > > > +++ b/tests/xfs/648
> > > > @@ -47,6 +47,9 @@ touch $projectdir/bar
> > > > ln -s $projectdir/bar $projectdir/broken-symlink
> > > > rm -f $projectdir/bar
> > > >
> > > > +$here/src/file_attr --get $projectdir ./fifo &>/dev/null || \
> > > > + _notrun "file_getattr not supported on $FSTYP"
> > > > +
> > > > $XFS_QUOTA_PROG -D $tmp.projects -P $tmp.projid -x \
> > > > -c "project -sp $projectdir $id" $SCRATCH_DEV | filter_quota
> > > > $XFS_QUOTA_PROG -D $tmp.projects -P $tmp.projid -x \
> > > >
> > >
> > >
> >
>
>