Skip site navigation (1)Skip section navigation (2)
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>