]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
cifs: Fix querying and creating MF symlinks over SMB1
authorPali Rohár <pali@kernel.org>
Sat, 28 Dec 2024 20:09:54 +0000 (21:09 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 29 May 2025 09:12:22 +0000 (11:12 +0200)
[ Upstream commit 4236ac9fe5b8b42756070d4abfb76fed718e87c2 ]

Old SMB1 servers without CAP_NT_SMBS do not support CIFS_open() function
and instead SMBLegacyOpen() needs to be used. This logic is already handled
in cifs_open_file() function, which is server->ops->open callback function.

So for querying and creating MF symlinks use open callback function instead
of CIFS_open() function directly.

This change fixes querying and creating new MF symlinks on Windows 98.
Currently cifs_query_mf_symlink() is not able to detect MF symlink and
cifs_create_mf_symlink() is failing with EIO error.

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

index 6e6c09cc5ce7abad829282923730c114de212cd7..34a026243287f97a14e4d95e42a96e8495857c2c 100644 (file)
@@ -258,7 +258,7 @@ cifs_query_mf_symlink(unsigned int xid, struct cifs_tcon *tcon,
        struct cifs_open_parms oparms;
        struct cifs_io_parms io_parms = {0};
        int buf_type = CIFS_NO_BUFFER;
-       FILE_ALL_INFO file_info;
+       struct cifs_open_info_data query_data;
 
        oparms = (struct cifs_open_parms) {
                .tcon = tcon,
@@ -270,11 +270,11 @@ cifs_query_mf_symlink(unsigned int xid, struct cifs_tcon *tcon,
                .fid = &fid,
        };
 
-       rc = CIFS_open(xid, &oparms, &oplock, &file_info);
+       rc = tcon->ses->server->ops->open(xid, &oparms, &oplock, &query_data);
        if (rc)
                return rc;
 
-       if (file_info.EndOfFile != cpu_to_le64(CIFS_MF_SYMLINK_FILE_SIZE)) {
+       if (query_data.fi.EndOfFile != cpu_to_le64(CIFS_MF_SYMLINK_FILE_SIZE)) {
                rc = -ENOENT;
                /* it's not a symlink */
                goto out;
@@ -313,7 +313,7 @@ cifs_create_mf_symlink(unsigned int xid, struct cifs_tcon *tcon,
                .fid = &fid,
        };
 
-       rc = CIFS_open(xid, &oparms, &oplock, NULL);
+       rc = tcon->ses->server->ops->open(xid, &oparms, &oplock, NULL);
        if (rc)
                return rc;