Date: Mon, 27 Apr 2026 14:30:10 -0700 From: Rick Macklem <rick.macklem@gmail.com> To: Cedric Blancher <cedric.blancher@gmail.com> Cc: freebsd-hackers@freebsd.org Subject: Re: FreeBSD NFSv4.1 server exporting FreeBSD FAT filesystem - case-insensitive=true? Fwd: [PATCH v11 03/15] fat: Implement fileattr_get for case sensitivity Message-ID: <CAM5tNy7wwc5v1fJ=CkmUH0rQjMVFvCKUwpA=UmkRjR_SZtQ%2BYg@mail.gmail.com> In-Reply-To: <CALXu0UcMyEw-6EUM2MBgJUPzaTdm%2BnNHGNJ=97zTkXyDDp1Vxw@mail.gmail.com> References: <20260424-case-sensitivity-v11-0-de5619beddaf@oracle.com> <20260424-case-sensitivity-v11-3-de5619beddaf@oracle.com> <CALXu0UcMyEw-6EUM2MBgJUPzaTdm%2BnNHGNJ=97zTkXyDDp1Vxw@mail.gmail.com>
index | next in thread | previous in thread | raw e-mail
On Mon, Apr 27, 2026 at 12:13=E2=80=AFAM 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=3Dtrue?
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 <cel@kernel.org>
> Date: Sat, 25 Apr 2026 at 03:53
> Subject: [PATCH v11 03/15] fat: Implement fileattr_get for case sensitivi=
ty
> 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 =3D MSDOS_SB(dentry->d_sb);
> + bool case_sensitive;
> +
> + /*
> + * FAT filesystems are case-insensitive by default. VFAT
> + * becomes case-sensitive when mounted with 'check=3Dstrict',
> + * 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 =3D sbi->options.name_check =3D=3D 's';
> + else
> + case_sensitive =3D sbi->options.nocase;
> +
> + if (!case_sensitive) {
> + fa->fsx_xflags |=3D FS_XFLAG_CASEFOLD;
> + fa->flags |=3D FS_CASEFOLD_FL;
> + if (!sbi->options.isvfat)
> + fa->fsx_xflags |=3D 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 =3D {
> .setattr =3D fat_setattr,
> .getattr =3D fat_getattr,
> + .fileattr_get =3D fat_fileattr_get,
> .update_time =3D 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 =3D {
> .rename =3D msdos_rename,
> .setattr =3D fat_setattr,
> .getattr =3D fat_getattr,
> + .fileattr_get =3D fat_fileattr_get,
> .update_time =3D 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 =3D {
> .rename =3D vfat_rename2,
> .setattr =3D fat_setattr,
> .getattr =3D fat_getattr,
> + .fileattr_get =3D fat_fileattr_get,
> .update_time =3D fat_update_time,
> };
>
>
> --
> 2.53.0
>
>
>
>
> --
> Cedric Blancher <cedric.blancher@gmail.com>
> [https://plus.google.com/u/0/+CedricBlancher/]
> Institute Pasteur
>
home |
help
Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAM5tNy7wwc5v1fJ=CkmUH0rQjMVFvCKUwpA=UmkRjR_SZtQ%2BYg>
