All of lore.kernel.org
 help / color / mirror / Atom feed
From: Chuck Lever <cel@kernel.org>
To: Al Viro <viro@zeniv.linux.org.uk>,
	Christian Brauner <brauner@kernel.org>
Cc: <linux-fsdevel@vger.kernel.org>,
	linux-ext4@vger.kernel.org, <linux-nfs@vger.kernel.org>,
	<linux-kernel@vger.kernel.org>,
	hirofumi@mail.parknet.co.jp,
	almaz.alexandrovich@paragon-software.com, tytso@mit.edu,
	adilger.kernel@dilger.ca, Volker.Lendecke@sernet.de,
	Chuck Lever <chuck.lever@oracle.com>
Subject: [PATCH v2 1/6] fs: Add case sensitivity info to file_kattr
Date: Thu, 11 Dec 2025 10:21:11 -0500	[thread overview]
Message-ID: <20251211152116.480799-2-cel@kernel.org> (raw)
In-Reply-To: <20251211152116.480799-1-cel@kernel.org>

From: Chuck Lever <chuck.lever@oracle.com>

Enable upper layers such as NFSD to retrieve case sensitivity
information from file systems by adding a case_info field to struct
file_kattr.

Add vfs_get_case_info() as a convenience helper for kernel
consumers. If a filesystem does not provide a fileattr_get hook, it
returns the default POSIX behavior (case-sensitive,
case-preserving), which is correct for the majority of Linux
file systems implementations.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
 fs/file_attr.c           | 31 +++++++++++++++++++++++++++++++
 include/linux/fileattr.h | 23 +++++++++++++++++++++++
 2 files changed, 54 insertions(+)

diff --git a/fs/file_attr.c b/fs/file_attr.c
index 1dcec88c0680..609e890b5101 100644
--- a/fs/file_attr.c
+++ b/fs/file_attr.c
@@ -94,6 +94,37 @@ int vfs_fileattr_get(struct dentry *dentry, struct file_kattr *fa)
 }
 EXPORT_SYMBOL(vfs_fileattr_get);
 
+/**
+ * vfs_get_case_info - retrieve case sensitivity info for a filesystem
+ * @dentry:	the object to retrieve from
+ * @case_info:	pointer to store result
+ *
+ * Call i_op->fileattr_get() to retrieve case sensitivity information.
+ * If the filesystem does not provide a fileattr_get hook, return
+ * the default POSIX behavior (case-sensitive, case-preserving).
+ *
+ * Return: 0 on success, or a negative error on failure.
+ */
+int vfs_get_case_info(struct dentry *dentry, u32 *case_info)
+{
+	struct file_kattr fa = {};
+	int error;
+
+	/* Default: POSIX semantics (case-sensitive, case-preserving) */
+	*case_info = FILEATTR_CASEFOLD_NONE | FILEATTR_CASE_PRESERVING;
+
+	error = vfs_fileattr_get(dentry, &fa);
+	if (error == -ENOIOCTLCMD)
+		return 0;
+	if (error)
+		return error;
+
+	if (fa.case_info)
+		*case_info = fa.case_info;
+	return 0;
+}
+EXPORT_SYMBOL(vfs_get_case_info);
+
 static void fileattr_to_file_attr(const struct file_kattr *fa,
 				  struct file_attr *fattr)
 {
diff --git a/include/linux/fileattr.h b/include/linux/fileattr.h
index f89dcfad3f8f..55674d14f697 100644
--- a/include/linux/fileattr.h
+++ b/include/linux/fileattr.h
@@ -48,11 +48,33 @@ struct file_kattr {
 	u32	fsx_nextents;	/* nextents field value (get)	*/
 	u32	fsx_projid;	/* project identifier (get/set) */
 	u32	fsx_cowextsize;	/* CoW extsize field value (get/set)*/
+	u32	case_info;	/* case sensitivity behavior */
 	/* selectors: */
 	bool	flags_valid:1;
 	bool	fsx_valid:1;
 };
 
+/*
+ * Values for file_kattr.case_info.
+ */
+
+/* File name case is preserved at rest. */
+#define FILEATTR_CASE_PRESERVING	0x80000000
+
+/* Values stored in the low-order byte */
+enum fileattr_case_folding {
+	/* Code points are compared directly with no case folding. */
+	FILEATTR_CASEFOLD_NONE = 0,
+
+	/* ASCII case-insensitive: A-Z are treated as a-z. */
+	FILEATTR_CASEFOLD_ASCII,
+
+	/* Unicode case-insensitive matching. */
+	FILEATTR_CASEFOLD_UNICODE,
+};
+
+#define FILEATTR_CASEFOLD_TYPE		0x000000ff
+
 int copy_fsxattr_to_user(const struct file_kattr *fa, struct fsxattr __user *ufa);
 
 void fileattr_fill_xflags(struct file_kattr *fa, u32 xflags);
@@ -75,6 +97,7 @@ static inline bool fileattr_has_fsx(const struct file_kattr *fa)
 int vfs_fileattr_get(struct dentry *dentry, struct file_kattr *fa);
 int vfs_fileattr_set(struct mnt_idmap *idmap, struct dentry *dentry,
 		     struct file_kattr *fa);
+int vfs_get_case_info(struct dentry *dentry, u32 *case_info);
 int ioctl_getflags(struct file *file, unsigned int __user *argp);
 int ioctl_setflags(struct file *file, unsigned int __user *argp);
 int ioctl_fsgetxattr(struct file *file, void __user *argp);
-- 
2.52.0


  reply	other threads:[~2025-12-11 15:21 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-12-11 15:21 [PATCH v2 0/6] Exposing case folding behavior Chuck Lever
2025-12-11 15:21 ` Chuck Lever [this message]
2025-12-11 23:41   ` [PATCH v2 1/6] fs: Add case sensitivity info to file_kattr Eric Biggers
2025-12-12  1:16     ` Chuck Lever
2025-12-12  2:18       ` Theodore Tso
2025-12-12 15:08         ` Chuck Lever
2025-12-12 21:23           ` Theodore Tso
2025-12-12 22:49             ` Trond Myklebust
2025-12-13 16:43             ` Chuck Lever
2025-12-15 12:37   ` Christian Brauner
2025-12-11 15:21 ` [PATCH v2 2/6] fat: Implement fileattr_get for case sensitivity Chuck Lever
2025-12-12  4:42   ` OGAWA Hirofumi
2025-12-11 15:21 ` [PATCH v2 3/6] ntfs3: " Chuck Lever
2025-12-11 15:21 ` [PATCH v2 4/6] ext4: Report case sensitivity in fileattr_get Chuck Lever
2025-12-11 15:21 ` [PATCH v2 5/6] nfsd: Report export case-folding via NFSv3 PATHCONF Chuck Lever
2025-12-11 15:21 ` [PATCH v2 6/6] nfsd: Implement NFSv4 FATTR4_CASE_INSENSITIVE and FATTR4_CASE_PRESERVING Chuck Lever
2025-12-12  5:20 ` [PATCH v2 0/6] Exposing case folding behavior Christoph Hellwig

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20251211152116.480799-2-cel@kernel.org \
    --to=cel@kernel.org \
    --cc=Volker.Lendecke@sernet.de \
    --cc=adilger.kernel@dilger.ca \
    --cc=almaz.alexandrovich@paragon-software.com \
    --cc=brauner@kernel.org \
    --cc=chuck.lever@oracle.com \
    --cc=hirofumi@mail.parknet.co.jp \
    --cc=linux-ext4@vger.kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-nfs@vger.kernel.org \
    --cc=tytso@mit.edu \
    --cc=viro@zeniv.linux.org.uk \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.