]> www.infradead.org Git - users/hch/misc.git/commitdiff
cifs: Ensure that all non-client-specific reparse points are processed by the server
authorPali Rohár <pali@kernel.org>
Sat, 5 Apr 2025 17:51:07 +0000 (19:51 +0200)
committerSteve French <stfrench@microsoft.com>
Mon, 7 Apr 2025 06:07:22 +0000 (01:07 -0500)
Fix regression in mounts to e.g. onedrive shares.

Generally, reparse points are processed by the SMB server during the
SMB OPEN request, but there are few reparse points which do not have
OPEN-like meaning for the SMB server and has to be processed by the SMB
client. Those are symlinks and special files (fifo, socket, block, char).

For Linux SMB client, it is required to process also name surrogate reparse
points as they represent another entity on the SMB server system. Linux
client will mark them as separate mount points. Examples of name surrogate
reparse points are NTFS junction points (e.g. created by the "mklink" tool
on Windows servers).

So after processing the name surrogate reparse points, clear the
-EOPNOTSUPP error code returned from the parse_reparse_point() to let SMB
server to process reparse points.

And remove printing misleading error message "unhandled reparse tag:" as
reparse points are handled by SMB server and hence unhandled fact is normal
operation.

Fixes: cad3fc0a4c8c ("cifs: Throw -EOPNOTSUPP error on unsupported reparse point type from parse_reparse_point()")
Fixes: b587fd128660 ("cifs: Treat unhandled directory name surrogate reparse points as mount directory nodes")
Cc: stable@vger.kernel.org
Reported-by: Junwen Sun <sunjw8888@gmail.com>
Tested-by: Junwen Sun <sunjw8888@gmail.com>
Signed-off-by: Pali Rohár <pali@kernel.org>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/smb/client/inode.c
fs/smb/client/reparse.c

index a00a9d91d0da3cef654ad6e962c500ff98849367..9b56198f7230314393b0bfe5cc6a5802a32658bf 100644 (file)
@@ -1228,6 +1228,16 @@ static int reparse_info_to_fattr(struct cifs_open_info_data *data,
                                cifs_create_junction_fattr(fattr, sb);
                                goto out;
                        }
+                       /*
+                        * If the reparse point is unsupported by the Linux SMB
+                        * client then let it process by the SMB server. So mask
+                        * the -EOPNOTSUPP error code. This will allow Linux SMB
+                        * client to send SMB OPEN request to server. If server
+                        * does not support this reparse point too then server
+                        * will return error during open the path.
+                        */
+                       if (rc == -EOPNOTSUPP)
+                               rc = 0;
                }
 
                if (data->reparse.tag == IO_REPARSE_TAG_SYMLINK && !rc) {
index 2b9e9885dc425829d6c2a25a4494d8d3644964e8..f85dd40f34aff7b58363126526d9b7b83bcbed9b 100644 (file)
@@ -1062,8 +1062,6 @@ int parse_reparse_point(struct reparse_data_buffer *buf,
                        const char *full_path,
                        struct cifs_open_info_data *data)
 {
-       struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
-
        data->reparse.buf = buf;
 
        /* See MS-FSCC 2.1.2 */
@@ -1090,8 +1088,6 @@ int parse_reparse_point(struct reparse_data_buffer *buf,
                }
                return 0;
        default:
-               cifs_tcon_dbg(VFS | ONCE, "unhandled reparse tag: 0x%08x\n",
-                             le32_to_cpu(buf->ReparseTag));
                return -EOPNOTSUPP;
        }
 }