Re: [PATCH v8 03/17] fat: Implement fileattr_get for case sensitivity
From: Jan Kara <jack@suse.cz>
Date: 2026-02-27 11:41:57
Also in:
linux-cifs, linux-ext4, linux-f2fs-devel, linux-fsdevel, linux-nfs, linux-xfs
On Tue 17-02-26 16:47:27, Chuck Lever wrote:
From: Chuck Lever <redacted> Report FAT's case sensitivity behavior via the FS_XFLAG_CASEFOLD and FS_XFLAG_CASENONPRESERVING flags. FAT filesystems are case-insensitive by default. MSDOS supports a 'nocase' mount option that enables case-sensitive behavior; check this option when reporting case sensitivity. VFAT long filename entries preserve case; without VFAT, only uppercased 8.3 short names are stored. MSDOS with 'nocase' also preserves case since the name-formatting code skips upcasing when 'nocase' is set. Check both options when reporting case preservation. Signed-off-by: Chuck Lever <redacted>
Looks good to me from general POV. It would be good to get confirmation from FAT maintainer you've got all the corner cases of FAT configuration right :) Anyway, feel free to add: Reviewed-by: Jan Kara <jack@suse.cz> Honza
quoted hunk ↗ jump to hunk
--- fs/fat/fat.h | 3 +++ fs/fat/file.c | 22 ++++++++++++++++++++++ fs/fat/namei_msdos.c | 1 + fs/fat/namei_vfat.c | 1 + 4 files changed, 27 insertions(+)diff --git a/fs/fat/fat.h b/fs/fat/fat.h index 0d269dba897b..c5bcd1063f9c 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); +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 124d9c5431c8..6823269a8604 100644 --- a/fs/fat/file.c +++ b/fs/fat/file.c@@ -17,6 +17,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,@@ -396,6 +397,26 @@ 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 msdos_sb_info *sbi = MSDOS_SB(dentry->d_sb); + + /* + * FAT filesystems are case-insensitive by default. MSDOS + * supports a 'nocase' mount option for case-sensitive behavior. + * + * VFAT long filename entries preserve case. Without VFAT, only + * uppercased 8.3 short names are stored. MSDOS with 'nocase' + * also preserves case. + */ + if (!sbi->options.nocase) + fa->fsx_xflags |= FS_XFLAG_CASEFOLD; + if (!sbi->options.isvfat && !sbi->options.nocase) + fa->fsx_xflags |= FS_XFLAG_CASENONPRESERVING; + 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) {@@ -573,5 +594,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 048c103b506a..4a3db08e51c0 100644 --- a/fs/fat/namei_msdos.c +++ b/fs/fat/namei_msdos.c@@ -642,6 +642,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 2acfe3123a72..18f4c316aa05 100644 --- a/fs/fat/namei_vfat.c +++ b/fs/fat/namei_vfat.c@@ -1185,6 +1185,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, };-- 2.53.0
-- Jan Kara [off-list ref] SUSE Labs, CR