]> www.infradead.org Git - users/hch/misc.git/commitdiff
cifs: Improve handling of name surrogate reparse points in reparse.c
authorPali Rohár <pali@kernel.org>
Thu, 3 Oct 2024 19:06:34 +0000 (21:06 +0200)
committerSteve French <stfrench@microsoft.com>
Wed, 9 Apr 2025 20:37:26 +0000 (15:37 -0500)
Like previous changes for file inode.c, handle directory name surrogate
reparse points generally also in reparse.c.

Signed-off-by: Pali Rohár <pali@kernel.org>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/smb/client/reparse.c

index 1416b9ffaca12466508a60a4a5aef84a53b73283..d79d88e324f4660b7957ab5c8be8a884e0a3424e 100644 (file)
@@ -1236,16 +1236,6 @@ bool cifs_reparse_point_to_fattr(struct cifs_sb_info *cifs_sb,
        bool ok;
 
        switch (tag) {
-       case IO_REPARSE_TAG_INTERNAL:
-               if (!(fattr->cf_cifsattrs & ATTR_DIRECTORY))
-                       return false;
-               fallthrough;
-       case IO_REPARSE_TAG_DFS:
-       case IO_REPARSE_TAG_DFSR:
-       case IO_REPARSE_TAG_MOUNT_POINT:
-               /* See cifs_create_junction_fattr() */
-               fattr->cf_mode = S_IFDIR | 0711;
-               break;
        case IO_REPARSE_TAG_LX_SYMLINK:
        case IO_REPARSE_TAG_LX_FIFO:
        case IO_REPARSE_TAG_AF_UNIX:
@@ -1265,7 +1255,14 @@ bool cifs_reparse_point_to_fattr(struct cifs_sb_info *cifs_sb,
                fattr->cf_mode |= S_IFLNK;
                break;
        default:
-               return false;
+               if (!(fattr->cf_cifsattrs & ATTR_DIRECTORY))
+                       return false;
+               if (!IS_REPARSE_TAG_NAME_SURROGATE(tag) &&
+                   tag != IO_REPARSE_TAG_INTERNAL)
+                       return false;
+               /* See cifs_create_junction_fattr() */
+               fattr->cf_mode = S_IFDIR | 0711;
+               break;
        }
 
        fattr->cf_dtype = S_DT(fattr->cf_mode);