Re: [PATCH v2 2/6] fat: Implement fileattr_get for case sensitivity

OGAWA Hirofumi
2025-12-12T04:47:59Z

Chuck Lever <cel@kernel.org> writes:

> From: Chuck Lever <chuck.lever@oracle.com>
>
> Report FAT's case sensitivity behavior via the new file_kattr
> case_info field. FAT filesystems are case-insensitive and do not
> preserve case at rest (stored names are uppercased).
>
> The case folding type depends on the mount options: when utf8 is
> enabled, Unicode case folding is used; otherwise ASCII case folding.
>
> Signed-off-by: Chuck Lever <chuck.lever@oracle.com>

I can't see the who and how to use this though, in msdos case, looks
like this should check "nocase" option.

Thanks.

> ---
> fs/fat/fat.h | 3 +++
> fs/fat/file.c | 18 ++++++++++++++++++
> fs/fat/namei_msdos.c | 1 +
> fs/fat/namei_vfat.c | 1 +
> 4 files changed, 23 insertions(+)
>
> diff --git a/fs/fat/fat.h b/fs/fat/fat.h
> index d3e426de5f01..38da08d8fec4 100644
> --- a/fs/fat/fat.h
> +++ b/fs/fat/fat.h
> @@ -10,6 +10,8 @@
> #include <linux/fs_context.h>
> #include <linux/fs_parser.h>
>
> +struct file_kattr;
> +
> /*
> * vfat shortname flags
> */
> @@ -407,6 +409,7 @@ extern void fat_truncate_blocks(struct inode *inode, loff_t offset);
> extern int fat_getattr(struct mnt_idmap *idmap,
> const struct path *path, struct kstat *stat,
> u32 request_mask, unsigned int flags);
> +extern int fat_fileattr_get(struct dentry *dentry, struct file_kattr *fa);
> extern int fat_file_fsync(struct file *file, loff_t start, loff_t end,
> int datasync);
>
> diff --git a/fs/fat/file.c b/fs/fat/file.c
> index 4fc49a614fb8..123f4c1efdf4 100644
> --- a/fs/fat/file.c
> +++ b/fs/fat/file.c
> @@ -16,6 +16,7 @@
> #include <linux/fsnotify.h>
> #include <linux/security.h>
> #include <linux/falloc.h>
> +#include <linux/fileattr.h>
> #include "fat.h"
>
> static long fat_fallocate(struct file *file, int mode,
> @@ -395,6 +396,22 @@ void fat_truncate_blocks(struct inode *inode, loff_t offset)
> fat_flush_inodes(inode->i_sb, inode, NULL);
> }
>
> +int fat_fileattr_get(struct dentry *dentry, struct file_kattr *fa)
> +{
> + struct inode *inode = d_inode(dentry);
> + struct msdos_sb_info *sbi = MSDOS_SB(inode->i_sb);
> +
> + /*
> + * FAT filesystems do not preserve case: stored names are
> + * uppercased. They are case-insensitive, using either ASCII
> + * or Unicode comparison depending on mount options.
> + */
> + fa->case_info = sbi->options.utf8 ?
> + FILEATTR_CASEFOLD_UNICODE : FILEATTR_CASEFOLD_ASCII;
> + return 0;
> +}
> +EXPORT_SYMBOL_GPL(fat_fileattr_get);
> +
> int fat_getattr(struct mnt_idmap *idmap, const struct path *path,
> struct kstat *stat, u32 request_mask, unsigned int flags)
> {
> @@ -574,5 +591,6 @@ EXPORT_SYMBOL_GPL(fat_setattr);
> const struct inode_operations fat_file_inode_operations = {
> .setattr = fat_setattr,
> .getattr = fat_getattr,
> + .fileattr_get = fat_fileattr_get,
> .update_time = fat_update_time,
> };
> diff --git a/fs/fat/namei_msdos.c b/fs/fat/namei_msdos.c
> index 0b920ee40a7f..380add5c6c66 100644
> --- a/fs/fat/namei_msdos.c
> +++ b/fs/fat/namei_msdos.c
> @@ -640,6 +640,7 @@ static const struct inode_operations msdos_dir_inode_operations = {
> .rename = msdos_rename,
> .setattr = fat_setattr,
> .getattr = fat_getattr,
> + .fileattr_get = fat_fileattr_get,
> .update_time = fat_update_time,
> };
>
> diff --git a/fs/fat/namei_vfat.c b/fs/fat/namei_vfat.c
> index 5dbc4cbb8fce..6cf513f97afa 100644
> --- a/fs/fat/namei_vfat.c
> +++ b/fs/fat/namei_vfat.c
> @@ -1180,6 +1180,7 @@ static const struct inode_operations vfat_dir_inode_operations = {
> .rename = vfat_rename2,
> .setattr = fat_setattr,
> .getattr = fat_getattr,
> + .fileattr_get = fat_fileattr_get,
> .update_time = fat_update_time,
> };

--
OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>