Merge tag 'fuse-fixes-5.2-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/mszer...
[platform/kernel/linux-rpi.git] / fs / cifs / connect.c
index 4c0e444..8c4121d 100644 (file)
@@ -323,8 +323,6 @@ static int ip_connect(struct TCP_Server_Info *server);
 static int generic_ip_connect(struct TCP_Server_Info *server);
 static void tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink);
 static void cifs_prune_tlinks(struct work_struct *work);
-static int cifs_setup_volume_info(struct smb_vol *volume_info, char *mount_data,
-                                       const char *devname, bool is_smb3);
 static char *extract_hostname(const char *unc);
 
 /*
@@ -566,6 +564,12 @@ cifs_reconnect(struct TCP_Server_Info *server)
                mid_entry->callback(mid_entry);
        }
 
+       if (cifs_rdma_enabled(server)) {
+               mutex_lock(&server->srv_mutex);
+               smbd_destroy(server);
+               mutex_unlock(&server->srv_mutex);
+       }
+
        do {
                try_to_freeze();
 
@@ -931,10 +935,8 @@ static void clean_demultiplex_info(struct TCP_Server_Info *server)
        wake_up_all(&server->request_q);
        /* give those requests time to exit */
        msleep(125);
-       if (cifs_rdma_enabled(server) && server->smbd_conn) {
-               smbd_destroy(server->smbd_conn);
-               server->smbd_conn = NULL;
-       }
+       if (cifs_rdma_enabled(server))
+               smbd_destroy(server);
        if (server->ssocket) {
                sock_release(server->ssocket);
                server->ssocket = NULL;
@@ -2444,6 +2446,10 @@ match_port(struct TCP_Server_Info *server, struct sockaddr *addr)
 {
        __be16 port, *sport;
 
+       /* SMBDirect manages its own ports, don't match it here */
+       if (server->rdma)
+               return true;
+
        switch (addr->sa_family) {
        case AF_INET:
                sport = &((struct sockaddr_in *) &server->dstaddr)->sin_port;
@@ -2904,8 +2910,7 @@ cifs_find_smb_ses(struct TCP_Server_Info *server, struct smb_vol *vol)
        return NULL;
 }
 
-static void
-cifs_put_smb_ses(struct cifs_ses *ses)
+void cifs_put_smb_ses(struct cifs_ses *ses)
 {
        unsigned int rc, xid;
        struct TCP_Server_Info *server = ses->server;
@@ -3082,7 +3087,7 @@ cifs_set_cifscreds(struct smb_vol *vol __attribute__((unused)),
  * already got a server reference (server refcount +1). See
  * cifs_get_tcon() for refcount explanations.
  */
-static struct cifs_ses *
+struct cifs_ses *
 cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb_vol *volume_info)
 {
        int rc = -ENOMEM;
@@ -4389,7 +4394,7 @@ static int mount_do_dfs_failover(const char *path,
 }
 #endif
 
-static int
+int
 cifs_setup_volume_info(struct smb_vol *volume_info, char *mount_data,
                        const char *devname, bool is_smb3)
 {
@@ -4543,7 +4548,7 @@ int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *vol)
        struct cifs_tcon *tcon = NULL;
        struct TCP_Server_Info *server;
        char *root_path = NULL, *full_path = NULL;
-       char *old_mountdata;
+       char *old_mountdata, *origin_mountdata = NULL;
        int count;
 
        rc = mount_get_conns(vol, cifs_sb, &xid, &server, &ses, &tcon);
@@ -4602,6 +4607,14 @@ int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *vol)
                goto error;
        }
 
+       /* Save DFS root volume information for DFS refresh worker */
+       origin_mountdata = kstrndup(cifs_sb->mountdata,
+                                   strlen(cifs_sb->mountdata), GFP_KERNEL);
+       if (!origin_mountdata) {
+               rc = -ENOMEM;
+               goto error;
+       }
+
        if (cifs_sb->mountdata != old_mountdata) {
                /* If we were redirected, reconnect to new target server */
                mount_put_conns(cifs_sb, xid, server, ses, tcon);
@@ -4710,7 +4723,7 @@ int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *vol)
        }
        spin_unlock(&cifs_tcp_ses_lock);
 
-       rc = dfs_cache_add_vol(vol, cifs_sb->origin_fullpath);
+       rc = dfs_cache_add_vol(origin_mountdata, vol, cifs_sb->origin_fullpath);
        if (rc) {
                kfree(cifs_sb->origin_fullpath);
                goto error;
@@ -4728,6 +4741,7 @@ out:
 error:
        kfree(full_path);
        kfree(root_path);
+       kfree(origin_mountdata);
        mount_put_conns(cifs_sb, xid, server, ses, tcon);
        return rc;
 }