]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
fs: Add case sensitivity flags to file_kattr
authorChuck Lever <chuck.lever@oracle.com>
Thu, 7 May 2026 08:52:55 +0000 (04:52 -0400)
committerChristian Brauner <brauner@kernel.org>
Mon, 11 May 2026 14:50:27 +0000 (16:50 +0200)
Enable upper layers such as NFSD to retrieve case sensitivity
information from file systems by adding FS_XFLAG_CASEFOLD and
FS_XFLAG_CASENONPRESERVING flags.

Filesystems report case-insensitive or case-nonpreserving behavior
by setting these flags directly in fa->fsx_xflags. The default
(flags unset) indicates POSIX semantics: case-sensitive and
case-preserving. Both flags are added to FS_XFLAG_RDONLY_MASK so
FS_IOC_FSSETXATTR silently strips them, keeping the new xflags
strictly a reporting interface. Callers that want to toggle
casefolding continue to use FS_IOC_SETFLAGS with FS_CASEFOLD_FL,
the established UAPI on filesystems that support the operation
(ext4 and f2fs on empty directories).

Case sensitivity information is exported to userspace via the
fa_xflags field in the FS_IOC_FSGETXATTR ioctl and file_getattr()
system call.

Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
Reviewed-by: Jan Kara <jack@suse.cz>
Reviewed-by: Roland Mainz <roland.mainz@nrubsig.org>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Link: https://patch.msgid.link/20260507-case-sensitivity-v14-2-e62cc8200435@oracle.com
Signed-off-by: Christian Brauner <brauner@kernel.org>
fs/file_attr.c
include/linux/fileattr.h
include/uapi/linux/fs.h

index f429da66a317cce65a7fb660bf90871219f6965b..bfb00d256dd560d6090059c991be657d42e8c515 100644 (file)
@@ -37,6 +37,8 @@ void fileattr_fill_xflags(struct file_kattr *fa, u32 xflags)
                fa->flags |= FS_PROJINHERIT_FL;
        if (fa->fsx_xflags & FS_XFLAG_VERITY)
                fa->flags |= FS_VERITY_FL;
+       if (fa->fsx_xflags & FS_XFLAG_CASEFOLD)
+               fa->flags |= FS_CASEFOLD_FL;
 }
 EXPORT_SYMBOL(fileattr_fill_xflags);
 
@@ -67,6 +69,8 @@ void fileattr_fill_flags(struct file_kattr *fa, u32 flags)
                fa->fsx_xflags |= FS_XFLAG_PROJINHERIT;
        if (fa->flags & FS_VERITY_FL)
                fa->fsx_xflags |= FS_XFLAG_VERITY;
+       if (fa->flags & FS_CASEFOLD_FL)
+               fa->fsx_xflags |= FS_XFLAG_CASEFOLD;
 }
 EXPORT_SYMBOL(fileattr_fill_flags);
 
index 3780904a63a6c760f3ad684a72361001bf1bf2c9..58044b598016205e7091fdbe52ccebf7b407bcc1 100644 (file)
@@ -16,7 +16,8 @@
 
 /* Read-only inode flags */
 #define FS_XFLAG_RDONLY_MASK \
-       (FS_XFLAG_PREALLOC | FS_XFLAG_HASATTR | FS_XFLAG_VERITY)
+       (FS_XFLAG_PREALLOC | FS_XFLAG_HASATTR | FS_XFLAG_VERITY | \
+        FS_XFLAG_CASEFOLD | FS_XFLAG_CASENONPRESERVING)
 
 /* Flags to indicate valid value of fsx_ fields */
 #define FS_XFLAG_VALUES_MASK \
index 13f71202845e8f9ebd5178e1dbf69b4c3a02363f..2ea4c81df08f10f18b5b2dbce3f0f4fc929ff212 100644 (file)
@@ -254,6 +254,13 @@ struct file_attr {
 #define FS_XFLAG_DAX           0x00008000      /* use DAX for IO */
 #define FS_XFLAG_COWEXTSIZE    0x00010000      /* CoW extent size allocator hint */
 #define FS_XFLAG_VERITY                0x00020000      /* fs-verity enabled */
+/*
+ * Case handling flags (read-only, cannot be set via ioctl).
+ * Default (neither set) indicates POSIX semantics: case-sensitive
+ * lookups and case-preserving storage.
+ */
+#define FS_XFLAG_CASEFOLD      0x00040000      /* case-insensitive lookups */
+#define FS_XFLAG_CASENONPRESERVING 0x00080000  /* case not preserved */
 #define FS_XFLAG_HASATTR       0x80000000      /* no DIFLAG for this   */
 
 /* the read-only stuff doesn't really belong here, but any other place is