On Tue 17-02-26 16:47:27, Chuck Lever wrote: > From: Chuck Lever <[email protected]> > > 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 <[email protected]>
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 <[email protected]> Honza > --- > 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 <[email protected]> SUSE Labs, CR _______________________________________________ Linux-f2fs-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
