index | | raw e-mail
On Mon, 27 Apr 2026 14:30:10 -0700
Rick Macklem <rick.macklem@gmail.com> wrote:
> On Mon, Apr 27, 2026 at 12:13 AM Cedric Blancher
> <cedric.blancher@gmail.com> 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.
So the behavior matches with original {PC|MS}-DOS FAT filesystem driver.
As a filesystem "format", FAT doesn't matter whether or not the filename
is upper case or not. Just store what's written in the directory entry.
As a filesystem "driver" on {PC|MS}-DOS, FAT always convert filenames
into upper cases (capital) on writes and matces, but not listings.
This was why file operations via filesystem driver causes filenames
to be written all upper cases.
And also, this was why so-called "filers" like original FD by A.Idei
could create/rename/delete or even open wanted one when there are
something like "ReadMe, readMe, README and readme coexists in
the same directory" cases. This was possible because FD (and maybe
other filers, too) doesn't use genuine FAT filesystem "driver",
but read/write FAT filesystem in disks directly with cluster (sector)
reads/writes. And openes files by specifying directory entry number,
not by specifying filenames.
And for anything accessing via filesyste "driver" like editors,
the first one appears alone (in my above example, "ReadMe")
could be opened, as the filesystem driver seems to open "first
match" in directory entries. And if the user attempt to save file
as "readME" with "Save as..." functionalities of an editor,
it caused "file exists" warnings.
This also means that once reordering the above example like
"readme, readMe, README and ReadMe coexists in the same directory"
and write to the disk (directory) using FD or alike, "readme"
was preferred.
>
> rick
>
> >
> > Ced
> >
> > ---------- Forwarded message ---------
> > From: Chuck Lever <cel@kernel.org>
> > Date: Sat, 25 Apr 2026 at 03:53
> > Subject: [PATCH v11 03/15] fat: Implement fileattr_get for case sensitivity
> > To: Al Viro <viro@zeniv.linux.org.uk>, Christian Brauner
> > <brauner@kernel.org>, Jan Kara <jack@suse.cz>
> > Cc: <linux-fsdevel@vger.kernel.org>, <linux-ext4@vger.kernel.org>,
> > <linux-xfs@vger.kernel.org>, <linux-cifs@vger.kernel.org>,
> > <linux-nfs@vger.kernel.org>, <linux-api@vger.kernel.org>,
> > <linux-f2fs-devel@lists.sourceforge.net>,
> > <hirofumi@mail.parknet.co.jp>, <linkinjeon@kernel.org>,
> > <sj1557.seo@samsung.com>, <yuezhang.mo@sony.com>,
> > <almaz.alexandrovich@paragon-software.com>, <slava@dubeyko.com>,
> > <glaubitz@physik.fu-berlin.de>, <frank.li@vivo.com>, <tytso@mit.edu>,
> > <adilger.kernel@dilger.ca>, <cem@kernel.org>, <sfrench@samba.org>,
> > <pc@manguebit.org>, <ronniesahlberg@gmail.com>,
> > <sprasad@microsoft.com>, <trondmy@kernel.org>, <anna@kernel.org>,
> > <jaegeuk@kernel.org>, <chao@kernel.org>, <hansg@kernel.org>,
> > <senozhatsky@chromium.org>, Chuck Lever <chuck.lever@oracle.com>,
> > Roland Mainz <roland.mainz@nrubsig.org>
> >
> >
> > From: Chuck Lever <chuck.lever@oracle.com>
> >
> > 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 <jack@suse.cz>
> > Reviewed-by: Roland Mainz <roland.mainz@nrubsig.org>
> > Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
> > ---
> > 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 <cedric.blancher@gmail.com>
> > [https://plus.google.com/u/0/+CedricBlancher/]
> > Institute Pasteur
--
Tomoaki AOKI <junchoon@dec.sakura.ne.jp>
home |
help
