From: Chuck Lever <[email protected]>

Add case sensitivity reporting to the existing hfsplus_fileattr_get()
function via the FS_XFLAG_CASEFOLD flag. HFS+ always preserves case
at rest.

Case sensitivity depends on how the volume was formatted: HFSX
volumes may be either case-sensitive or case-insensitive, indicated
by the HFSPLUS_SB_CASEFOLD superblock flag.

FS_XFLAG_CASEFOLD is read-only: FS_XFLAG_RDONLY_MASK ensures
FS_IOC_FSSETXATTR strips it. The legacy FS_IOC_SETFLAGS path in
hfsplus_fileattr_set() also allows FS_CASEFOLD_FL through its
allowlist on case-insensitive volumes so that a chattr
read-modify-write cycle does not fail with EOPNOTSUPP.

Reviewed-by: Viacheslav Dubeyko <[email protected]>
Reviewed-by: Roland Mainz <[email protected]>
Signed-off-by: Chuck Lever <[email protected]>
---
 fs/hfsplus/inode.c | 16 +++++++++++++++-
 1 file changed, 15 insertions(+), 1 deletion(-)

diff --git a/fs/hfsplus/inode.c b/fs/hfsplus/inode.c
index d05891ec492e..5565c14b4bf6 100644
--- a/fs/hfsplus/inode.c
+++ b/fs/hfsplus/inode.c
@@ -740,6 +740,7 @@ int hfsplus_fileattr_get(struct dentry *dentry, struct 
file_kattr *fa)
 {
        struct inode *inode = d_inode(dentry);
        struct hfsplus_inode_info *hip = HFSPLUS_I(inode);
+       struct hfsplus_sb_info *sbi = HFSPLUS_SB(inode->i_sb);
        unsigned int flags = 0;
 
        if (inode->i_flags & S_IMMUTABLE)
@@ -748,6 +749,8 @@ int hfsplus_fileattr_get(struct dentry *dentry, struct 
file_kattr *fa)
                flags |= FS_APPEND_FL;
        if (hip->userflags & HFSPLUS_FLG_NODUMP)
                flags |= FS_NODUMP_FL;
+       if (test_bit(HFSPLUS_SB_CASEFOLD, &sbi->flags))
+               flags |= FS_CASEFOLD_FL;
 
        fileattr_fill_flags(fa, flags);
 
@@ -759,13 +762,24 @@ int hfsplus_fileattr_set(struct mnt_idmap *idmap,
 {
        struct inode *inode = d_inode(dentry);
        struct hfsplus_inode_info *hip = HFSPLUS_I(inode);
+       struct hfsplus_sb_info *sbi = HFSPLUS_SB(inode->i_sb);
+       unsigned int allowed = FS_IMMUTABLE_FL | FS_APPEND_FL | FS_NODUMP_FL;
        unsigned int new_fl = 0;
 
        if (fileattr_has_fsx(fa))
                return -EOPNOTSUPP;
 
+       /*
+        * FS_CASEFOLD_FL reflects HFSPLUS_SB_CASEFOLD, a mount-time
+        * property. Accept it as a no-op so chattr's RMW round-trip
+        * succeeds; reject any attempt to enable it on a volume that
+        * was not formatted case-insensitive.
+        */
+       if (test_bit(HFSPLUS_SB_CASEFOLD, &sbi->flags))
+               allowed |= FS_CASEFOLD_FL;
+
        /* don't silently ignore unsupported ext2 flags */
-       if (fa->flags & ~(FS_IMMUTABLE_FL|FS_APPEND_FL|FS_NODUMP_FL))
+       if (fa->flags & ~allowed)
                return -EOPNOTSUPP;
 
        if (fa->flags & FS_IMMUTABLE_FL)

-- 
2.53.0



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

Reply via email to