From: Chuck Lever <[email protected]>

Upper layers such as NFSD need to query whether a filesystem
is case-sensitive. Add FS_XFLAG_CASEFOLD to xfs_ip2xflags()
when the filesystem is formatted with the ASCIICI feature
flag. This serves both FS_IOC_FSGETXATTR (via xfs_fill_fsxattr()
in xfs_fileattr_get()) and XFS_IOC_BULKSTAT (which populates
bs_xflags directly from xfs_ip2xflags()), so bulkstat consumers
and per-inode queries see a consistent view of the filesystem's
case-folding behavior.

FS_XFLAG_CASEFOLD is read-only: FS_XFLAG_RDONLY_MASK ensures
FS_IOC_FSSETXATTR strips it, and xfs_flags2diflags() has no
clause for CASEFOLD so the on-disk diflags are unaffected.
The legacy FS_IOC_SETFLAGS path in xfs_fileattr_set() also
allows FS_CASEFOLD_FL through its allowlist on ASCIICI
filesystems so that a chattr read-modify-write cycle does
not fail with EOPNOTSUPP.

XFS always preserves case. XFS is case-sensitive by default,
but supports ASCII case-insensitive lookups when formatted
with the ASCIICI feature flag.

Reviewed-by: Roland Mainz <[email protected]>
Signed-off-by: Chuck Lever <[email protected]>
---
 fs/xfs/libxfs/xfs_inode_util.c |  2 ++
 fs/xfs/xfs_ioctl.c             | 20 +++++++++++++++++---
 2 files changed, 19 insertions(+), 3 deletions(-)

diff --git a/fs/xfs/libxfs/xfs_inode_util.c b/fs/xfs/libxfs/xfs_inode_util.c
index 551fa51befb6..82be54b6f8d3 100644
--- a/fs/xfs/libxfs/xfs_inode_util.c
+++ b/fs/xfs/libxfs/xfs_inode_util.c
@@ -130,6 +130,8 @@ xfs_ip2xflags(
 
        if (xfs_inode_has_attr_fork(ip))
                flags |= FS_XFLAG_HASATTR;
+       if (xfs_has_asciici(ip->i_mount))
+               flags |= FS_XFLAG_CASEFOLD;
        return flags;
 }
 
diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c
index ed9b4846c05f..f8216f74679f 100644
--- a/fs/xfs/xfs_ioctl.c
+++ b/fs/xfs/xfs_ioctl.c
@@ -755,9 +755,23 @@ xfs_fileattr_set(
        trace_xfs_ioctl_setattr(ip);
 
        if (!fa->fsx_valid) {
-               if (fa->flags & ~(FS_IMMUTABLE_FL | FS_APPEND_FL |
-                                 FS_NOATIME_FL | FS_NODUMP_FL |
-                                 FS_SYNC_FL | FS_DAX_FL | FS_PROJINHERIT_FL))
+               unsigned int allowed = FS_IMMUTABLE_FL | FS_APPEND_FL |
+                                      FS_NOATIME_FL | FS_NODUMP_FL |
+                                      FS_SYNC_FL | FS_DAX_FL |
+                                      FS_PROJINHERIT_FL;
+
+               /*
+                * FS_CASEFOLD_FL reflects the ASCIICI superblock feature,
+                * a read-only property. Accept it as a no-op so chattr's
+                * RMW round-trip succeeds; reject any attempt to enable
+                * it on a non-ASCIICI filesystem. xfs_flags2diflags()
+                * has no clause for CASEFOLD, so the bit is dropped from
+                * the on-disk diflags regardless.
+                */
+               if (xfs_has_asciici(mp))
+                       allowed |= FS_CASEFOLD_FL;
+
+               if (fa->flags & ~allowed)
                        return -EOPNOTSUPP;
        }
 

-- 
2.53.0



_______________________________________________
Linux-f2fs-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

Reply via email to