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

Reply via email to