Re: FreeBSD NFSv4.1 server exporting FreeBSD FAT filesystem - case-insensitive=true? Fwd: [PATCH v11 03/15] fat: Implement fileattr_get for case sensitivity
Rick Macklem <[email protected]>
| Newsgroups | gmane.os.freebsd.devel.hackers |
|---|---|
| Message-ID | <CAM5tNy7wwc5v1fJ=CkmUH0rQjMVFvCKUwpA=UmkRjR_SZtQ+Yg@mail.gmail.com> |
On Mon, Apr 27, 2026 at 12:13 AM Cedric Blancher <[email protected]> wrote: > > Good morning! > > How does the FreeBSD NFSv4.1 server behave when it exports a FreeBSD > FAT filesystem? Does it set the case-insensitive and > case-nonpreserving FATTR4 attributes to case-insensitive=true? It replies case-insensitive and case-preserving as both true. (When I create a file called Readme, ls returns Readme, so I believe that means case-preserving should be true.) The file can be open'd with any combination of case: README, readme or Readme, for example. rick > > Ced > > ---------- Forwarded message --------- > From: Chuck Lever <[email protected]> > Date: Sat, 25 Apr 2026 at 03:53 > Subject: [PATCH v11 03/15] fat: Implement fileattr_get for case sensitivity > To: Al Viro <[email protected]>, Christian Brauner > <[email protected]>, Jan Kara <[email protected]> > Cc: <[email protected]>, <[email protected]>, > <[email protected]>, <[email protected]>, > <[email protected]>, <[email protected]>, > <[email protected]>, > <[email protected]>, <[email protected]>, > <[email protected]>, <[email protected]>, > <[email protected]>, <[email protected]>, > <[email protected]>, <[email protected]>, <[email protected]>, > <[email protected]>, <[email protected]>, <[email protected]>, > <[email protected]>, <[email protected]>, > <[email protected]>, <[email protected]>, <[email protected]>, > <[email protected]>, <[email protected]>, <[email protected]>, > <[email protected]>, Chuck Lever <[email protected]>, > Roland Mainz <[email protected]> > > > 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. > > Reviewed-by: Jan Kara <[email protected]> > Reviewed-by: Roland Mainz <[email protected]> > Signed-off-by: Chuck Lever <[email protected]> > --- > fs/fat/fat.h | 3 +++ > fs/fat/file.c | 32 ++++++++++++++++++++++++++++++++ > fs/fat/namei_msdos.c | 1 + > fs/fat/namei_vfat.c | 1 + > 4 files changed, 37 insertions(+) > > diff --git a/fs/fat/fat.h b/fs/fat/fat.h > index 5a58f0bf8ce8..99ed9228a677 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 > */ > @@ -408,6 +410,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 becccdd2e501..5f0178fc2ede 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, > @@ -398,6 +399,36 @@ 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); > + bool case_sensitive; > + > + /* > + * FAT filesystems are case-insensitive by default. VFAT > + * becomes case-sensitive when mounted with 'check=strict', > + * which installs vfat_dentry_ops. MSDOS has no such option; > + * its 'nocase' mount option selects case-sensitive matching. > + * > + * 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.isvfat) > + case_sensitive = sbi->options.name_check == 's'; > + else > + case_sensitive = sbi->options.nocase; > + > + if (!case_sensitive) { > + fa->fsx_xflags |= FS_XFLAG_CASEFOLD; > + fa->flags |= FS_CASEFOLD_FL; > + if (!sbi->options.isvfat) > + 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) > { > @@ -575,5 +606,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 4cc65f330fb7..0fd2971ad4b1 100644 > --- a/fs/fat/namei_msdos.c > +++ b/fs/fat/namei_msdos.c > @@ -644,6 +644,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 918b3756674c..e909447873e3 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 > > > > > -- > Cedric Blancher <[email protected]> > [https://plus.google.com/u/0/+CedricBlancher/] > Institute Pasteur >