From: Chuck Lever <[email protected]>

Report NTFS case sensitivity behavior via the file_kattr boolean
fields. NTFS always preserves case at rest.

Case sensitivity depends on mount options: with "nocase", NTFS
is case-insensitive; otherwise it is case-sensitive.

Signed-off-by: Chuck Lever <[email protected]>
---
 fs/ntfs3/file.c    | 22 ++++++++++++++++++++++
 fs/ntfs3/inode.c   |  1 +
 fs/ntfs3/namei.c   |  2 ++
 fs/ntfs3/ntfs_fs.h |  1 +
 4 files changed, 26 insertions(+)

diff --git a/fs/ntfs3/file.c b/fs/ntfs3/file.c
index 2e7b2e566ebe..434a2d48db02 100644
--- a/fs/ntfs3/file.c
+++ b/fs/ntfs3/file.c
@@ -146,6 +146,27 @@ long ntfs_compat_ioctl(struct file *filp, u32 cmd, 
unsigned long arg)
 }
 #endif
 
+/*
+ * ntfs_fileattr_get - inode_operations::fileattr_get
+ */
+int ntfs_fileattr_get(struct dentry *dentry, struct file_kattr *fa)
+{
+       struct inode *inode = d_inode(dentry);
+       struct ntfs_sb_info *sbi = inode->i_sb->s_fs_info;
+
+       /* Avoid any operation if inode is bad. */
+       if (unlikely(is_bad_ni(ntfs_i(inode))))
+               return -EINVAL;
+
+       /*
+        * NTFS preserves case (the default). Case sensitivity depends on
+        * mount options: with "nocase", NTFS is case-insensitive;
+        * otherwise it is case-sensitive.
+        */
+       fa->case_insensitive = sbi->options && sbi->options->nocase;
+       return 0;
+}
+
 /*
  * ntfs_getattr - inode_operations::getattr
  */
@@ -1460,6 +1481,7 @@ const struct inode_operations ntfs_file_inode_operations 
= {
        .get_acl        = ntfs_get_acl,
        .set_acl        = ntfs_set_acl,
        .fiemap         = ntfs_fiemap,
+       .fileattr_get   = ntfs_fileattr_get,
 };
 
 const struct file_operations ntfs_file_operations = {
diff --git a/fs/ntfs3/inode.c b/fs/ntfs3/inode.c
index 0a9ac5efeb67..205083e8a6e0 100644
--- a/fs/ntfs3/inode.c
+++ b/fs/ntfs3/inode.c
@@ -2089,6 +2089,7 @@ const struct inode_operations ntfs_link_inode_operations 
= {
        .get_link       = ntfs_get_link,
        .setattr        = ntfs_setattr,
        .listxattr      = ntfs_listxattr,
+       .fileattr_get   = ntfs_fileattr_get,
 };
 
 const struct address_space_operations ntfs_aops = {
diff --git a/fs/ntfs3/namei.c b/fs/ntfs3/namei.c
index 3b24ca02de61..d09414711016 100644
--- a/fs/ntfs3/namei.c
+++ b/fs/ntfs3/namei.c
@@ -519,6 +519,7 @@ const struct inode_operations ntfs_dir_inode_operations = {
        .getattr        = ntfs_getattr,
        .listxattr      = ntfs_listxattr,
        .fiemap         = ntfs_fiemap,
+       .fileattr_get   = ntfs_fileattr_get,
 };
 
 const struct inode_operations ntfs_special_inode_operations = {
@@ -527,6 +528,7 @@ const struct inode_operations ntfs_special_inode_operations 
= {
        .listxattr      = ntfs_listxattr,
        .get_acl        = ntfs_get_acl,
        .set_acl        = ntfs_set_acl,
+       .fileattr_get   = ntfs_fileattr_get,
 };
 
 const struct dentry_operations ntfs_dentry_ops = {
diff --git a/fs/ntfs3/ntfs_fs.h b/fs/ntfs3/ntfs_fs.h
index a4559c9f64e6..a578b75f31fc 100644
--- a/fs/ntfs3/ntfs_fs.h
+++ b/fs/ntfs3/ntfs_fs.h
@@ -504,6 +504,7 @@ extern const struct file_operations ntfs_dir_operations;
 extern const struct file_operations ntfs_legacy_dir_operations;
 
 /* Globals from file.c */
+int ntfs_fileattr_get(struct dentry *dentry, struct file_kattr *fa);
 int ntfs_getattr(struct mnt_idmap *idmap, const struct path *path,
                 struct kstat *stat, u32 request_mask, u32 flags);
 int ntfs_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
-- 
2.52.0



_______________________________________________
Linux-f2fs-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

Reply via email to