]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
smb3: do not log confusing message when server returns no network interfaces
authorSteve French <stfrench@microsoft.com>
Sat, 1 Oct 2022 16:44:08 +0000 (11:44 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 24 Oct 2022 07:56:51 +0000 (09:56 +0200)
commit 4659f01e3cd94f64d9bd06764ace2ef8fe1b6227 upstream.

Some servers can return an empty network interface list so, unless
multichannel is requested, no need to log an error for this, and
when multichannel is requested on mount but no interfaces, log
something less confusing.  For this case change
   parse_server_interfaces: malformed interface info
to
   empty network interface list returned by server localhost

Also do not relog this error every ten minutes (only log on mount, once)

Cc: <stable@vger.kernel.org>
Reviewed-by: Paulo Alcantara (SUSE) <pc@cjr.nz>
Signed-off-by: Steve French <stfrench@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
fs/cifs/cifsproto.h
fs/cifs/connect.c
fs/cifs/smb2ops.c

index d59aebefa71cd3a93e9495073728059e0cc0a7d9..66305d11cd6d0a1bf87a93cc51f675b889ac84fd 100644 (file)
@@ -642,7 +642,7 @@ cifs_chan_is_iface_active(struct cifs_ses *ses,
 int
 cifs_chan_update_iface(struct cifs_ses *ses, struct TCP_Server_Info *server);
 int
-SMB3_request_interfaces(const unsigned int xid, struct cifs_tcon *tcon);
+SMB3_request_interfaces(const unsigned int xid, struct cifs_tcon *tcon, bool in_mount);
 
 void extract_unc_hostname(const char *unc, const char **h, size_t *len);
 int copy_path_name(char *dst, const char *src);
index bdc3efdb12219eff74d44767c07330360588a5e9..999d6fd31ac9a52045b6c3813ea2515f5be3648b 100644 (file)
@@ -155,7 +155,7 @@ static void smb2_query_server_interfaces(struct work_struct *work)
        /*
         * query server network interfaces, in case they change
         */
-       rc = SMB3_request_interfaces(0, tcon);
+       rc = SMB3_request_interfaces(0, tcon, false);
        if (rc) {
                cifs_dbg(FYI, "%s: failed to query server interfaces: %d\n",
                                __func__, rc);
index cc180d37b8ce183307b687a5b2d4f062f2362480..60b006d982c25649c058d0204151c21fd42a7692 100644 (file)
@@ -511,8 +511,7 @@ smb3_negotiate_rsize(struct cifs_tcon *tcon, struct smb3_fs_context *ctx)
 
 static int
 parse_server_interfaces(struct network_interface_info_ioctl_rsp *buf,
-                       size_t buf_len,
-                       struct cifs_ses *ses)
+                       size_t buf_len, struct cifs_ses *ses, bool in_mount)
 {
        struct network_interface_info_ioctl_rsp *p;
        struct sockaddr_in *addr4;
@@ -542,6 +541,20 @@ parse_server_interfaces(struct network_interface_info_ioctl_rsp *buf,
        }
        spin_unlock(&ses->iface_lock);
 
+       /*
+        * Samba server e.g. can return an empty interface list in some cases,
+        * which would only be a problem if we were requesting multichannel
+        */
+       if (bytes_left == 0) {
+               /* avoid spamming logs every 10 minutes, so log only in mount */
+               if ((ses->chan_max > 1) && in_mount)
+                       cifs_dbg(VFS,
+                                "empty network interface list returned by server %s\n",
+                                ses->server->hostname);
+               rc = -EINVAL;
+               goto out;
+       }
+
        while (bytes_left >= sizeof(*p)) {
                memset(&tmp_iface, 0, sizeof(tmp_iface));
                tmp_iface.speed = le64_to_cpu(p->LinkSpeed);
@@ -672,7 +685,7 @@ out:
 }
 
 int
-SMB3_request_interfaces(const unsigned int xid, struct cifs_tcon *tcon)
+SMB3_request_interfaces(const unsigned int xid, struct cifs_tcon *tcon, bool in_mount)
 {
        int rc;
        unsigned int ret_data_len = 0;
@@ -692,7 +705,7 @@ SMB3_request_interfaces(const unsigned int xid, struct cifs_tcon *tcon)
                goto out;
        }
 
-       rc = parse_server_interfaces(out_buf, ret_data_len, ses);
+       rc = parse_server_interfaces(out_buf, ret_data_len, ses, in_mount);
        if (rc)
                goto out;
 
@@ -1022,7 +1035,7 @@ smb3_qfs_tcon(const unsigned int xid, struct cifs_tcon *tcon,
        if (rc)
                return;
 
-       SMB3_request_interfaces(xid, tcon);
+       SMB3_request_interfaces(xid, tcon, true /* called during  mount */);
 
        SMB2_QFS_attr(xid, tcon, fid.persistent_fid, fid.volatile_fid,
                        FS_ATTRIBUTE_INFORMATION);