oparms.fid = pfid;
        oparms.reconnect = false;
 
-       rc = SMB2_open_init(tcon, &rqst[0], &oplock, &oparms, &utf16_path);
+       rc = SMB2_open_init(tcon, server,
+                           &rqst[0], &oplock, &oparms, &utf16_path);
        if (rc)
                goto oshr_free;
        smb2_set_next_command(tcon, &rqst[0]);
        rqst[1].rq_iov = qi_iov;
        rqst[1].rq_nvec = 1;
 
-       rc = SMB2_query_info_init(tcon, &rqst[1], COMPOUND_FID,
+       rc = SMB2_query_info_init(tcon, server,
+                                 &rqst[1], COMPOUND_FID,
                                  COMPOUND_FID, FILE_ALL_INFORMATION,
                                  SMB2_O_INFO_FILE, 0,
                                  sizeof(struct smb2_file_all_info) +
 
        smb2_set_related(&rqst[1]);
 
-       rc = compound_send_recv(xid, ses, flags, 2, rqst,
+       rc = compound_send_recv(xid, ses, server,
+                               flags, 2, rqst,
                                resp_buftype, rsp_iov);
        mutex_lock(&tcon->crfid.fid_mutex);
 
            struct cifs_sb_info *cifs_sb)
 {
        struct cifs_ses *ses = tcon->ses;
+       struct TCP_Server_Info *server = cifs_pick_channel(ses);
        __le16 *utf16_path = NULL;
        int ea_name_len = strlen(ea_name);
        int flags = 0;
        oparms.fid = &fid;
        oparms.reconnect = false;
 
-       rc = SMB2_open_init(tcon, &rqst[0], &oplock, &oparms, utf16_path);
+       rc = SMB2_open_init(tcon, server,
+                           &rqst[0], &oplock, &oparms, utf16_path);
        if (rc)
                goto sea_exit;
        smb2_set_next_command(tcon, &rqst[0]);
        size[0] = len;
        data[0] = ea;
 
-       rc = SMB2_set_info_init(tcon, &rqst[1], COMPOUND_FID,
+       rc = SMB2_set_info_init(tcon, server,
+                               &rqst[1], COMPOUND_FID,
                                COMPOUND_FID, current->tgid,
                                FILE_FULL_EA_INFORMATION,
                                SMB2_O_INFO_FILE, 0, data, size);
        memset(&close_iov, 0, sizeof(close_iov));
        rqst[2].rq_iov = close_iov;
        rqst[2].rq_nvec = 1;
-       rc = SMB2_close_init(tcon, &rqst[2], COMPOUND_FID, COMPOUND_FID, false);
+       rc = SMB2_close_init(tcon, server,
+                            &rqst[2], COMPOUND_FID, COMPOUND_FID, false);
        smb2_set_related(&rqst[2]);
 
-       rc = compound_send_recv(xid, ses, flags, 3, rqst,
+       rc = compound_send_recv(xid, ses, server,
+                               flags, 3, rqst,
                                resp_buftype, rsp_iov);
        /* no need to bump num_remote_opens because handle immediately closed */
 
        struct smb_rqst *rqst;
        struct kvec *rsp_iov;
        struct cifs_ses *ses = tcon->ses;
+       struct TCP_Server_Info *server = cifs_pick_channel(ses);
        char __user *arg = (char __user *)p;
        struct smb_query_info qi;
        struct smb_query_info __user *pqi;
                return -EINVAL;
        }
 
-       if (!ses || !(ses->server)) {
+       if (!ses || !server) {
                kfree(vars);
                return -EIO;
        }
                oparms.desired_access = FILE_READ_ATTRIBUTES | READ_CONTROL;
        }
 
-       rc = SMB2_open_init(tcon, &rqst[0], &oplock, &oparms, path);
+       rc = SMB2_open_init(tcon, server,
+                           &rqst[0], &oplock, &oparms, path);
        if (rc)
                goto iqinf_exit;
        smb2_set_next_command(tcon, &rqst[0]);
                        rqst[1].rq_iov = &vars->io_iov[0];
                        rqst[1].rq_nvec = SMB2_IOCTL_IOV_SIZE;
 
-                       rc = SMB2_ioctl_init(tcon, &rqst[1],
+                       rc = SMB2_ioctl_init(tcon, server,
+                                            &rqst[1],
                                             COMPOUND_FID, COMPOUND_FID,
                                             qi.info_type, true, buffer,
                                             qi.output_buffer_length,
                        size[0] = 8;
                        data[0] = buffer;
 
-                       rc = SMB2_set_info_init(tcon, &rqst[1],
+                       rc = SMB2_set_info_init(tcon, server,
+                                       &rqst[1],
                                        COMPOUND_FID, COMPOUND_FID,
                                        current->tgid,
                                        FILE_END_OF_FILE_INFORMATION,
                rqst[1].rq_iov = &vars->qi_iov[0];
                rqst[1].rq_nvec = 1;
 
-               rc = SMB2_query_info_init(tcon, &rqst[1], COMPOUND_FID,
+               rc = SMB2_query_info_init(tcon, server,
+                                 &rqst[1], COMPOUND_FID,
                                  COMPOUND_FID, qi.file_info_class,
                                  qi.info_type, qi.additional_information,
                                  qi.input_buffer_length,
        rqst[2].rq_iov = &vars->close_iov[0];
        rqst[2].rq_nvec = 1;
 
-       rc = SMB2_close_init(tcon, &rqst[2], COMPOUND_FID, COMPOUND_FID, false);
+       rc = SMB2_close_init(tcon, server,
+                            &rqst[2], COMPOUND_FID, COMPOUND_FID, false);
        if (rc)
                goto iqinf_exit;
        smb2_set_related(&rqst[2]);
 
-       rc = compound_send_recv(xid, ses, flags, 3, rqst,
+       rc = compound_send_recv(xid, ses, server,
+                               flags, 3, rqst,
                                resp_buftype, rsp_iov);
        if (rc)
                goto iqinf_exit;
        struct cifs_open_parms oparms;
        struct smb2_query_directory_rsp *qd_rsp = NULL;
        struct smb2_create_rsp *op_rsp = NULL;
+       struct TCP_Server_Info *server = cifs_pick_channel(tcon->ses);
 
        utf16_path = cifs_convert_path_to_utf16(path, cifs_sb);
        if (!utf16_path)
        oparms.fid = fid;
        oparms.reconnect = false;
 
-       rc = SMB2_open_init(tcon, &rqst[0], &oplock, &oparms, utf16_path);
+       rc = SMB2_open_init(tcon, server,
+                           &rqst[0], &oplock, &oparms, utf16_path);
        if (rc)
                goto qdf_free;
        smb2_set_next_command(tcon, &rqst[0]);
        rqst[1].rq_iov = qd_iov;
        rqst[1].rq_nvec = SMB2_QUERY_DIRECTORY_IOV_SIZE;
 
-       rc = SMB2_query_directory_init(xid, tcon, &rqst[1],
+       rc = SMB2_query_directory_init(xid, tcon, server,
+                                      &rqst[1],
                                       COMPOUND_FID, COMPOUND_FID,
                                       0, srch_inf->info_level);
        if (rc)
 
        smb2_set_related(&rqst[1]);
 
-       rc = compound_send_recv(xid, tcon->ses, flags, 2, rqst,
+       rc = compound_send_recv(xid, tcon->ses, server,
+                               flags, 2, rqst,
                                resp_buftype, rsp_iov);
 
        /* If the open failed there is nothing to do */
                         struct cifs_sb_info *cifs_sb)
 {
        struct cifs_ses *ses = tcon->ses;
+       struct TCP_Server_Info *server = cifs_pick_channel(ses);
        int flags = 0;
        struct smb_rqst rqst[3];
        int resp_buftype[3];
        oparms.fid = &fid;
        oparms.reconnect = false;
 
-       rc = SMB2_open_init(tcon, &rqst[0], &oplock, &oparms, utf16_path);
+       rc = SMB2_open_init(tcon, server,
+                           &rqst[0], &oplock, &oparms, utf16_path);
        if (rc)
                goto qic_exit;
        smb2_set_next_command(tcon, &rqst[0]);
        rqst[1].rq_iov = qi_iov;
        rqst[1].rq_nvec = 1;
 
-       rc = SMB2_query_info_init(tcon, &rqst[1], COMPOUND_FID, COMPOUND_FID,
+       rc = SMB2_query_info_init(tcon, server,
+                                 &rqst[1], COMPOUND_FID, COMPOUND_FID,
                                  class, type, 0,
                                  output_len, 0,
                                  NULL);
        rqst[2].rq_iov = close_iov;
        rqst[2].rq_nvec = 1;
 
-       rc = SMB2_close_init(tcon, &rqst[2], COMPOUND_FID, COMPOUND_FID, false);
+       rc = SMB2_close_init(tcon, server,
+                            &rqst[2], COMPOUND_FID, COMPOUND_FID, false);
        if (rc)
                goto qic_exit;
        smb2_set_related(&rqst[2]);
 
-       rc = compound_send_recv(xid, ses, flags, 3, rqst,
+       rc = compound_send_recv(xid, ses, server,
+                               flags, 3, rqst,
                                resp_buftype, rsp_iov);
        if (rc) {
                free_rsp_buf(resp_buftype[1], rsp_iov[1].iov_base);
        struct kvec err_iov = {NULL, 0};
        struct smb2_err_rsp *err_buf = NULL;
        struct smb2_symlink_err_rsp *symlink;
+       struct TCP_Server_Info *server = cifs_pick_channel(tcon->ses);
        unsigned int sub_len;
        unsigned int sub_offset;
        unsigned int print_len;
        oparms.fid = &fid;
        oparms.reconnect = false;
 
-       rc = SMB2_open_init(tcon, &rqst[0], &oplock, &oparms, utf16_path);
+       rc = SMB2_open_init(tcon, server,
+                           &rqst[0], &oplock, &oparms, utf16_path);
        if (rc)
                goto querty_exit;
        smb2_set_next_command(tcon, &rqst[0]);
        rqst[1].rq_iov = io_iov;
        rqst[1].rq_nvec = SMB2_IOCTL_IOV_SIZE;
 
-       rc = SMB2_ioctl_init(tcon, &rqst[1], fid.persistent_fid,
+       rc = SMB2_ioctl_init(tcon, server,
+                            &rqst[1], fid.persistent_fid,
                             fid.volatile_fid, FSCTL_GET_REPARSE_POINT,
                             true /* is_fctl */, NULL, 0,
                             CIFSMaxBufSize -
        rqst[2].rq_iov = close_iov;
        rqst[2].rq_nvec = 1;
 
-       rc = SMB2_close_init(tcon, &rqst[2], COMPOUND_FID, COMPOUND_FID, false);
+       rc = SMB2_close_init(tcon, server,
+                            &rqst[2], COMPOUND_FID, COMPOUND_FID, false);
        if (rc)
                goto querty_exit;
 
        smb2_set_related(&rqst[2]);
 
-       rc = compound_send_recv(xid, tcon->ses, flags, 3, rqst,
+       rc = compound_send_recv(xid, tcon->ses, server,
+                               flags, 3, rqst,
                                resp_buftype, rsp_iov);
 
        create_rsp = rsp_iov[0].iov_base;
 
 
 static void
 smb2_hdr_assemble(struct smb2_sync_hdr *shdr, __le16 smb2_cmd,
-                 const struct cifs_tcon *tcon)
+                 const struct cifs_tcon *tcon,
+                 struct TCP_Server_Info *server)
 {
        shdr->ProtocolId = SMB2_PROTO_NUMBER;
        shdr->StructureSize = cpu_to_le16(64);
        shdr->Command = smb2_cmd;
-       if (tcon && tcon->ses && tcon->ses->server) {
-               struct TCP_Server_Info *server = tcon->ses->server;
-
+       if (server) {
                spin_lock(&server->req_lock);
                /* Request up to 10 credits but don't go over the limit. */
                if (server->credits >= server->max_credits)
 
        /* GLOBAL_CAP_LARGE_MTU will only be set if dialect > SMB2.02 */
        /* See sections 2.2.4 and 3.2.4.1.5 of MS-SMB2 */
-       if ((tcon->ses) && (tcon->ses->server) &&
-           (tcon->ses->server->capabilities & SMB2_GLOBAL_CAP_LARGE_MTU))
+       if (server && (server->capabilities & SMB2_GLOBAL_CAP_LARGE_MTU))
                shdr->CreditCharge = cpu_to_le16(1);
        /* else CreditCharge MBZ */
 
 /*     if (tcon->share_flags & SHI1005_FLAGS_DFS)
                shdr->Flags |= SMB2_FLAGS_DFS_OPERATIONS; */
 
-       if (tcon->ses && tcon->ses->server && tcon->ses->server->sign &&
-           !smb3_encryption_required(tcon))
+       if (server && server->sign && !smb3_encryption_required(tcon))
                shdr->Flags |= SMB2_FLAGS_SIGNED;
 out:
        return;
 #endif
 
 static int
-smb2_reconnect(__le16 smb2_command, struct cifs_tcon *tcon)
+smb2_reconnect(__le16 smb2_command, struct cifs_tcon *tcon,
+              struct TCP_Server_Info *server)
 {
        int rc;
        struct nls_table *nls_codepage;
        struct cifs_ses *ses;
-       struct TCP_Server_Info *server;
        int retries;
 
        /*
                }
        }
        if ((!tcon->ses) || (tcon->ses->status == CifsExiting) ||
-           (!tcon->ses->server))
+           (!tcon->ses->server) || !server)
                return -EIO;
 
        ses = tcon->ses;
-       server = ses->server;
-
        retries = server->nr_targets;
 
        /*
 }
 
 static void
-fill_small_buf(__le16 smb2_command, struct cifs_tcon *tcon, void *buf,
+fill_small_buf(__le16 smb2_command, struct cifs_tcon *tcon,
+              struct TCP_Server_Info *server,
+              void *buf,
               unsigned int *total_len)
 {
        struct smb2_sync_pdu *spdu = (struct smb2_sync_pdu *)buf;
         */
        memset(buf, 0, 256);
 
-       smb2_hdr_assemble(&spdu->sync_hdr, smb2_command, tcon);
+       smb2_hdr_assemble(&spdu->sync_hdr, smb2_command, tcon, server);
        spdu->StructureSize2 = cpu_to_le16(parmsize);
 
        *total_len = parmsize + sizeof(struct smb2_sync_hdr);
  * function must have filled in request_buf pointer.
  */
 static int __smb2_plain_req_init(__le16 smb2_command, struct cifs_tcon *tcon,
-                                 void **request_buf, unsigned int *total_len)
+                                struct TCP_Server_Info *server,
+                                void **request_buf, unsigned int *total_len)
 {
        /* BB eventually switch this to SMB2 specific small buf size */
        if (smb2_command == SMB2_SET_INFO)
                return -ENOMEM;
        }
 
-       fill_small_buf(smb2_command, tcon,
+       fill_small_buf(smb2_command, tcon, server,
                       (struct smb2_sync_hdr *)(*request_buf),
                       total_len);
 
 }
 
 static int smb2_plain_req_init(__le16 smb2_command, struct cifs_tcon *tcon,
+                              struct TCP_Server_Info *server,
                               void **request_buf, unsigned int *total_len)
 {
        int rc;
 
-       rc = smb2_reconnect(smb2_command, tcon);
+       rc = smb2_reconnect(smb2_command, tcon, server);
        if (rc)
                return rc;
 
-       return __smb2_plain_req_init(smb2_command, tcon, request_buf,
+       return __smb2_plain_req_init(smb2_command, tcon, server, request_buf,
                                     total_len);
 }
 
 static int smb2_ioctl_req_init(u32 opcode, struct cifs_tcon *tcon,
+                              struct TCP_Server_Info *server,
                               void **request_buf, unsigned int *total_len)
 {
        /* Skip reconnect only for FSCTL_VALIDATE_NEGOTIATE_INFO IOCTLs */
        if (opcode == FSCTL_VALIDATE_NEGOTIATE_INFO) {
-               return __smb2_plain_req_init(SMB2_IOCTL, tcon, request_buf,
-                                            total_len);
+               return __smb2_plain_req_init(SMB2_IOCTL, tcon, server,
+                                            request_buf, total_len);
        }
-       return smb2_plain_req_init(SMB2_IOCTL, tcon, request_buf, total_len);
+       return smb2_plain_req_init(SMB2_IOCTL, tcon, server,
+                                  request_buf, total_len);
 }
 
 /* For explanation of negotiate contexts see MS-SMB2 section 2.2.3.1 */
                return -EIO;
        }
 
-       rc = smb2_plain_req_init(SMB2_NEGOTIATE, NULL, (void **) &req, &total_len);
+       rc = smb2_plain_req_init(SMB2_NEGOTIATE, NULL, server,
+                                (void **) &req, &total_len);
        if (rc)
                return rc;
 
        rqst.rq_iov = iov;
        rqst.rq_nvec = 1;
 
-       rc = cifs_send_recv(xid, ses, &rqst, &resp_buftype, flags, &rsp_iov);
+       rc = cifs_send_recv(xid, ses, server,
+                           &rqst, &resp_buftype, flags, &rsp_iov);
        cifs_small_buf_release(req);
        rsp = (struct smb2_negotiate_rsp *)rsp_iov.iov_base;
        /*
        struct TCP_Server_Info *server = cifs_ses_server(ses);
        unsigned int total_len;
 
-       rc = smb2_plain_req_init(SMB2_SESSION_SETUP, NULL, (void **) &req,
-                            &total_len);
+       rc = smb2_plain_req_init(SMB2_SESSION_SETUP, NULL, server,
+                                (void **) &req,
+                                &total_len);
        if (rc)
                return rc;
 
 
        /* BB add code to build os and lm fields */
        rc = cifs_send_recv(sess_data->xid, sess_data->ses,
+                           cifs_ses_server(sess_data->ses),
                            &rqst,
                            &sess_data->buf0_type,
                            CIFS_LOG_ERROR | CIFS_NEG_OP, &rsp_iov);
        if (ses->need_reconnect)
                goto smb2_session_already_dead;
 
-       rc = smb2_plain_req_init(SMB2_LOGOFF, NULL, (void **) &req, &total_len);
+       rc = smb2_plain_req_init(SMB2_LOGOFF, NULL, ses->server,
+                                (void **) &req, &total_len);
        if (rc)
                return rc;
 
        rqst.rq_iov = iov;
        rqst.rq_nvec = 1;
 
-       rc = cifs_send_recv(xid, ses, &rqst, &resp_buf_type, flags, &rsp_iov);
+       rc = cifs_send_recv(xid, ses, ses->server,
+                           &rqst, &resp_buf_type, flags, &rsp_iov);
        cifs_small_buf_release(req);
        /*
         * No tcon so can't do
        __le16 *unc_path = NULL;
        int flags = 0;
        unsigned int total_len;
-       struct TCP_Server_Info *server = ses->server;
+       struct TCP_Server_Info *server;
+
+       /* always use master channel */
+       server = ses->server;
 
        cifs_dbg(FYI, "TCON\n");
 
        /* SMB2 TREE_CONNECT request must be called with TreeId == 0 */
        tcon->tid = 0;
        atomic_set(&tcon->num_remote_opens, 0);
-       rc = smb2_plain_req_init(SMB2_TREE_CONNECT, tcon, (void **) &req,
-                            &total_len);
+       rc = smb2_plain_req_init(SMB2_TREE_CONNECT, tcon, server,
+                                (void **) &req, &total_len);
        if (rc) {
                kfree(unc_path);
                return rc;
        /* Need 64 for max size write so ask for more in case not there yet */
        req->sync_hdr.CreditRequest = cpu_to_le16(64);
 
-       rc = cifs_send_recv(xid, ses, &rqst, &resp_buftype, flags, &rsp_iov);
+       rc = cifs_send_recv(xid, ses, server,
+                           &rqst, &resp_buftype, flags, &rsp_iov);
        cifs_small_buf_release(req);
        rsp = (struct smb2_tree_connect_rsp *)rsp_iov.iov_base;
        trace_smb3_tcon(xid, tcon->tid, ses->Suid, tree, rc);
 
        close_shroot_lease(&tcon->crfid);
 
-       rc = smb2_plain_req_init(SMB2_TREE_DISCONNECT, tcon, (void **) &req,
-                            &total_len);
+       rc = smb2_plain_req_init(SMB2_TREE_DISCONNECT, tcon, ses->server,
+                                (void **) &req,
+                                &total_len);
        if (rc)
                return rc;
 
        rqst.rq_iov = iov;
        rqst.rq_nvec = 1;
 
-       rc = cifs_send_recv(xid, ses, &rqst, &resp_buf_type, flags, &rsp_iov);
+       rc = cifs_send_recv(xid, ses, ses->server,
+                           &rqst, &resp_buf_type, flags, &rsp_iov);
        cifs_small_buf_release(req);
        if (rc)
                cifs_stats_fail_inc(tcon, SMB2_TREE_DISCONNECT_HE);
        int flags = 0;
        unsigned int total_len;
        __le16 *utf16_path = NULL;
+       struct TCP_Server_Info *server = cifs_pick_channel(ses);
 
        cifs_dbg(FYI, "mkdir\n");
 
        if (!utf16_path)
                return -ENOMEM;
 
-       if (!ses || !(ses->server)) {
+       if (!ses || !server) {
                rc = -EIO;
                goto err_free_path;
        }
 
        /* resource #2: request */
-       rc = smb2_plain_req_init(SMB2_CREATE, tcon, (void **) &req, &total_len);
+       rc = smb2_plain_req_init(SMB2_CREATE, tcon, server,
+                                (void **) &req, &total_len);
        if (rc)
                goto err_free_path;
 
        trace_smb3_posix_mkdir_enter(xid, tcon->tid, ses->Suid, CREATE_NOT_FILE,
                                    FILE_WRITE_ATTRIBUTES);
        /* resource #4: response buffer */
-       rc = cifs_send_recv(xid, ses, &rqst, &resp_buftype, flags, &rsp_iov);
+       rc = cifs_send_recv(xid, ses, server,
+                           &rqst, &resp_buftype, flags, &rsp_iov);
        if (rc) {
                cifs_stats_fail_inc(tcon, SMB2_CREATE_HE);
                trace_smb3_posix_mkdir_err(xid, tcon->tid, ses->Suid,
 }
 
 int
-SMB2_open_init(struct cifs_tcon *tcon, struct smb_rqst *rqst, __u8 *oplock,
+SMB2_open_init(struct cifs_tcon *tcon, struct TCP_Server_Info *server,
+              struct smb_rqst *rqst, __u8 *oplock,
               struct cifs_open_parms *oparms, __le16 *path)
 {
-       struct TCP_Server_Info *server = tcon->ses->server;
        struct smb2_create_req *req;
        unsigned int n_iov = 2;
        __u32 file_attributes = 0;
        __le16 *copy_path;
        int rc;
 
-       rc = smb2_plain_req_init(SMB2_CREATE, tcon, (void **) &req, &total_len);
+       rc = smb2_plain_req_init(SMB2_CREATE, tcon, server,
+                                (void **) &req, &total_len);
        if (rc)
                return rc;
 
 {
        struct smb_rqst rqst;
        struct smb2_create_rsp *rsp = NULL;
-       struct TCP_Server_Info *server;
        struct cifs_tcon *tcon = oparms->tcon;
        struct cifs_ses *ses = tcon->ses;
+       struct TCP_Server_Info *server = cifs_pick_channel(ses);
        struct kvec iov[SMB2_CREATE_IOV_SIZE];
        struct kvec rsp_iov = {NULL, 0};
        int resp_buftype = CIFS_NO_BUFFER;
        int flags = 0;
 
        cifs_dbg(FYI, "create/open\n");
-       if (ses && (ses->server))
-               server = ses->server;
-       else
+       if (!ses || !server)
                return -EIO;
 
        if (smb3_encryption_required(tcon))
        rqst.rq_iov = iov;
        rqst.rq_nvec = SMB2_CREATE_IOV_SIZE;
 
-       rc = SMB2_open_init(tcon, &rqst, oplock, oparms, path);
+       rc = SMB2_open_init(tcon, server,
+                           &rqst, oplock, oparms, path);
        if (rc)
                goto creat_exit;
 
        trace_smb3_open_enter(xid, tcon->tid, tcon->ses->Suid,
                oparms->create_options, oparms->desired_access);
 
-       rc = cifs_send_recv(xid, ses, &rqst, &resp_buftype, flags,
+       rc = cifs_send_recv(xid, ses, server,
+                           &rqst, &resp_buftype, flags,
                            &rsp_iov);
        rsp = (struct smb2_create_rsp *)rsp_iov.iov_base;
 
 }
 
 int
-SMB2_ioctl_init(struct cifs_tcon *tcon, struct smb_rqst *rqst,
+SMB2_ioctl_init(struct cifs_tcon *tcon, struct TCP_Server_Info *server,
+               struct smb_rqst *rqst,
                u64 persistent_fid, u64 volatile_fid, u32 opcode,
                bool is_fsctl, char *in_data, u32 indatalen,
                __u32 max_response_size)
        int rc;
        char *in_data_buf;
 
-       rc = smb2_ioctl_req_init(opcode, tcon, (void **) &req, &total_len);
+       rc = smb2_ioctl_req_init(opcode, tcon, server,
+                                (void **) &req, &total_len);
        if (rc)
                return rc;
 
        struct smb_rqst rqst;
        struct smb2_ioctl_rsp *rsp = NULL;
        struct cifs_ses *ses;
+       struct TCP_Server_Info *server;
        struct kvec iov[SMB2_IOCTL_IOV_SIZE];
        struct kvec rsp_iov = {NULL, 0};
        int resp_buftype = CIFS_NO_BUFFER;
        int rc = 0;
        int flags = 0;
-       struct TCP_Server_Info *server;
 
        cifs_dbg(FYI, "SMB2 IOCTL\n");
 
        if (plen)
                *plen = 0;
 
-       if (tcon)
-               ses = tcon->ses;
-       else
+       if (!tcon)
                return -EIO;
 
+       ses = tcon->ses;
        if (!ses)
                return -EIO;
-       server = ses->server;
+
+       server = cifs_pick_channel(ses);
        if (!server)
                return -EIO;
 
        rqst.rq_iov = iov;
        rqst.rq_nvec = SMB2_IOCTL_IOV_SIZE;
 
-       rc = SMB2_ioctl_init(tcon, &rqst, persistent_fid, volatile_fid, opcode,
+       rc = SMB2_ioctl_init(tcon, server,
+                            &rqst, persistent_fid, volatile_fid, opcode,
                             is_fsctl, in_data, indatalen, max_out_data_len);
        if (rc)
                goto ioctl_exit;
 
-       rc = cifs_send_recv(xid, ses, &rqst, &resp_buftype, flags,
+       rc = cifs_send_recv(xid, ses, server,
+                           &rqst, &resp_buftype, flags,
                            &rsp_iov);
        rsp = (struct smb2_ioctl_rsp *)rsp_iov.iov_base;
 
 }
 
 int
-SMB2_close_init(struct cifs_tcon *tcon, struct smb_rqst *rqst,
+SMB2_close_init(struct cifs_tcon *tcon, struct TCP_Server_Info *server,
+               struct smb_rqst *rqst,
                u64 persistent_fid, u64 volatile_fid, bool query_attrs)
 {
        struct smb2_close_req *req;
        unsigned int total_len;
        int rc;
 
-       rc = smb2_plain_req_init(SMB2_CLOSE, tcon, (void **) &req, &total_len);
+       rc = smb2_plain_req_init(SMB2_CLOSE, tcon, server,
+                                (void **) &req, &total_len);
        if (rc)
                return rc;
 
        struct smb_rqst rqst;
        struct smb2_close_rsp *rsp = NULL;
        struct cifs_ses *ses = tcon->ses;
+       struct TCP_Server_Info *server = cifs_pick_channel(ses);
        struct kvec iov[1];
        struct kvec rsp_iov;
        int resp_buftype = CIFS_NO_BUFFER;
 
        cifs_dbg(FYI, "Close\n");
 
-       if (!ses || !(ses->server))
+       if (!ses || !server)
                return -EIO;
 
        if (smb3_encryption_required(tcon))
                query_attrs = true;
 
        trace_smb3_close_enter(xid, persistent_fid, tcon->tid, ses->Suid);
-       rc = SMB2_close_init(tcon, &rqst, persistent_fid, volatile_fid,
+       rc = SMB2_close_init(tcon, server,
+                            &rqst, persistent_fid, volatile_fid,
                             query_attrs);
        if (rc)
                goto close_exit;
 
-       rc = cifs_send_recv(xid, ses, &rqst, &resp_buftype, flags, &rsp_iov);
+       rc = cifs_send_recv(xid, ses, server,
+                           &rqst, &resp_buftype, flags, &rsp_iov);
        rsp = (struct smb2_close_rsp *)rsp_iov.iov_base;
 
        if (rc != 0) {
 }
 
 int
-SMB2_query_info_init(struct cifs_tcon *tcon, struct smb_rqst *rqst,
+SMB2_query_info_init(struct cifs_tcon *tcon, struct TCP_Server_Info *server,
+                    struct smb_rqst *rqst,
                     u64 persistent_fid, u64 volatile_fid,
                     u8 info_class, u8 info_type, u32 additional_info,
                     size_t output_len, size_t input_len, void *input)
        unsigned int total_len;
        int rc;
 
-       rc = smb2_plain_req_init(SMB2_QUERY_INFO, tcon, (void **) &req,
-                            &total_len);
+       rc = smb2_plain_req_init(SMB2_QUERY_INFO, tcon, server,
+                                (void **) &req, &total_len);
        if (rc)
                return rc;
 
 
        if (!ses)
                return -EIO;
-       server = ses->server;
+       server = cifs_pick_channel(ses);
        if (!server)
                return -EIO;
 
        rqst.rq_iov = iov;
        rqst.rq_nvec = 1;
 
-       rc = SMB2_query_info_init(tcon, &rqst, persistent_fid, volatile_fid,
+       rc = SMB2_query_info_init(tcon, server,
+                                 &rqst, persistent_fid, volatile_fid,
                                  info_class, info_type, additional_info,
                                  output_len, 0, NULL);
        if (rc)
        trace_smb3_query_info_enter(xid, persistent_fid, tcon->tid,
                                    ses->Suid, info_class, (__u32)info_type);
 
-       rc = cifs_send_recv(xid, ses, &rqst, &resp_buftype, flags, &rsp_iov);
+       rc = cifs_send_recv(xid, ses, server,
+                           &rqst, &resp_buftype, flags, &rsp_iov);
        rsp = (struct smb2_query_info_rsp *)rsp_iov.iov_base;
 
        if (rc) {
 
 static int
 SMB2_notify_init(const unsigned int xid, struct smb_rqst *rqst,
-               struct cifs_tcon *tcon, u64 persistent_fid, u64 volatile_fid,
-               u32 completion_filter, bool watch_tree)
+                struct cifs_tcon *tcon, struct TCP_Server_Info *server,
+                u64 persistent_fid, u64 volatile_fid,
+                u32 completion_filter, bool watch_tree)
 {
        struct smb2_change_notify_req *req;
        struct kvec *iov = rqst->rq_iov;
        unsigned int total_len;
        int rc;
 
-       rc = smb2_plain_req_init(SMB2_CHANGE_NOTIFY, tcon, (void **) &req, &total_len);
+       rc = smb2_plain_req_init(SMB2_CHANGE_NOTIFY, tcon, server,
+                                (void **) &req, &total_len);
        if (rc)
                return rc;
 
                u32 completion_filter)
 {
        struct cifs_ses *ses = tcon->ses;
+       struct TCP_Server_Info *server = cifs_pick_channel(ses);
        struct smb_rqst rqst;
        struct kvec iov[1];
        struct kvec rsp_iov = {NULL, 0};
        int rc = 0;
 
        cifs_dbg(FYI, "change notify\n");
-       if (!ses || !(ses->server))
+       if (!ses || !server)
                return -EIO;
 
        if (smb3_encryption_required(tcon))
        rqst.rq_iov = iov;
        rqst.rq_nvec = 1;
 
-       rc = SMB2_notify_init(xid, &rqst, tcon, persistent_fid, volatile_fid,
+       rc = SMB2_notify_init(xid, &rqst, tcon, server,
+                             persistent_fid, volatile_fid,
                              completion_filter, watch_tree);
        if (rc)
                goto cnotify_exit;
 
        trace_smb3_notify_enter(xid, persistent_fid, tcon->tid, ses->Suid,
                                (u8)watch_tree, completion_filter);
-       rc = cifs_send_recv(xid, ses, &rqst, &resp_buftype, flags, &rsp_iov);
+       rc = cifs_send_recv(xid, ses, server,
+                           &rqst, &resp_buftype, flags, &rsp_iov);
 
        if (rc != 0) {
                cifs_stats_fail_inc(tcon, SMB2_CHANGE_NOTIFY_HE);
        spin_unlock(&cifs_tcp_ses_lock);
 
        list_for_each_entry_safe(tcon, tcon2, &tmp_list, rlist) {
-               rc = smb2_reconnect(SMB2_INTERNAL_CMD, tcon);
+               rc = smb2_reconnect(SMB2_INTERNAL_CMD, tcon, server);
                if (!rc)
                        cifs_reopen_persistent_handles(tcon);
                else
                return rc;
        }
 
-       rc = smb2_plain_req_init(SMB2_ECHO, NULL, (void **)&req, &total_len);
+       rc = smb2_plain_req_init(SMB2_ECHO, NULL, server,
+                                (void **)&req, &total_len);
        if (rc)
                return rc;
 
 
 int
 SMB2_flush_init(const unsigned int xid, struct smb_rqst *rqst,
-               struct cifs_tcon *tcon, u64 persistent_fid, u64 volatile_fid)
+               struct cifs_tcon *tcon, struct TCP_Server_Info *server,
+               u64 persistent_fid, u64 volatile_fid)
 {
        struct smb2_flush_req *req;
        struct kvec *iov = rqst->rq_iov;
        unsigned int total_len;
        int rc;
 
-       rc = smb2_plain_req_init(SMB2_FLUSH, tcon, (void **) &req, &total_len);
+       rc = smb2_plain_req_init(SMB2_FLUSH, tcon, server,
+                                (void **) &req, &total_len);
        if (rc)
                return rc;
 
        struct smb_rqst rqst;
        struct kvec iov[1];
        struct kvec rsp_iov = {NULL, 0};
+       struct TCP_Server_Info *server = cifs_pick_channel(ses);
        int resp_buftype = CIFS_NO_BUFFER;
        int flags = 0;
        int rc = 0;
        rqst.rq_iov = iov;
        rqst.rq_nvec = 1;
 
-       rc = SMB2_flush_init(xid, &rqst, tcon, persistent_fid, volatile_fid);
+       rc = SMB2_flush_init(xid, &rqst, tcon, server,
+                            persistent_fid, volatile_fid);
        if (rc)
                goto flush_exit;
 
        trace_smb3_flush_enter(xid, persistent_fid, tcon->tid, ses->Suid);
-       rc = cifs_send_recv(xid, ses, &rqst, &resp_buftype, flags, &rsp_iov);
+       rc = cifs_send_recv(xid, ses, server,
+                           &rqst, &resp_buftype, flags, &rsp_iov);
 
        if (rc != 0) {
                cifs_stats_fail_inc(tcon, SMB2_FLUSH_HE);
        int rc = -EACCES;
        struct smb2_read_plain_req *req = NULL;
        struct smb2_sync_hdr *shdr;
-       struct TCP_Server_Info *server;
+       struct TCP_Server_Info *server = io_parms->server;
 
-       rc = smb2_plain_req_init(SMB2_READ, io_parms->tcon, (void **) &req,
-                                total_len);
+       rc = smb2_plain_req_init(SMB2_READ, io_parms->tcon, server,
+                                (void **) &req, total_len);
        if (rc)
                return rc;
 
-       server = io_parms->tcon->ses->server;
        if (server == NULL)
                return -ECONNABORTED;
 
                rdata->bytes >= server->smbd_conn->rdma_readwrite_threshold) {
 
                struct smbd_buffer_descriptor_v1 *v1;
-               bool need_invalidate =
-                       io_parms->tcon->ses->server->dialect == SMB30_PROT_ID;
+               bool need_invalidate = server->dialect == SMB30_PROT_ID;
 
                rdata->mr = smbd_register_mr(
                                server->smbd_conn, rdata->pages,
 {
        struct cifs_readdata *rdata = mid->callback_data;
        struct cifs_tcon *tcon = tlink_tcon(rdata->cfile->tlink);
-       struct TCP_Server_Info *server = tcon->ses->server;
+       struct TCP_Server_Info *server = rdata->server;
        struct smb2_sync_hdr *shdr =
                                (struct smb2_sync_hdr *)rdata->iov[0].iov_base;
        struct cifs_credits credits = { .value = 0, .instance = 0 };
                                 .rq_pagesz = rdata->pagesz,
                                 .rq_tailsz = rdata->tailsz };
 
+       WARN_ONCE(rdata->server != mid->server,
+                 "rdata server %p != mid server %p",
+                 rdata->server, mid->server);
+
        cifs_dbg(FYI, "%s: mid=%llu state=%d result=%d bytes=%u\n",
                 __func__, mid->mid, mid->mid_state, rdata->result,
                 rdata->bytes);
        struct smb_rqst rqst = { .rq_iov = rdata->iov,
                                 .rq_nvec = 1 };
        struct TCP_Server_Info *server;
+       struct cifs_tcon *tcon = tlink_tcon(rdata->cfile->tlink);
        unsigned int total_len;
 
        cifs_dbg(FYI, "%s: offset=%llu bytes=%u\n",
                 __func__, rdata->offset, rdata->bytes);
 
+       if (!rdata->server)
+               rdata->server = cifs_pick_channel(tcon->ses);
+
        io_parms.tcon = tlink_tcon(rdata->cfile->tlink);
+       io_parms.server = server = rdata->server;
        io_parms.offset = rdata->offset;
        io_parms.length = rdata->bytes;
        io_parms.persistent_fid = rdata->cfile->fid.persistent_fid;
        io_parms.volatile_fid = rdata->cfile->fid.volatile_fid;
        io_parms.pid = rdata->pid;
 
-       server = io_parms.tcon->ses->server;
-
        rc = smb2_new_read_req(
                (void **) &buf, &total_len, &io_parms, rdata, 0, 0);
        if (rc)
        }
 
        kref_get(&rdata->refcount);
-       rc = cifs_call_async(io_parms.tcon->ses->server, &rqst,
+       rc = cifs_call_async(server, &rqst,
                             cifs_readv_receive, smb2_readv_callback,
                             smb3_handle_read_data, rdata, flags,
                             &rdata->credits);
        int flags = CIFS_LOG_ERROR;
        struct cifs_ses *ses = io_parms->tcon->ses;
 
+       if (!io_parms->server)
+               io_parms->server = cifs_pick_channel(io_parms->tcon->ses);
+
        *nbytes = 0;
        rc = smb2_new_read_req((void **)&req, &total_len, io_parms, NULL, 0, 0);
        if (rc)
        rqst.rq_iov = iov;
        rqst.rq_nvec = 1;
 
-       rc = cifs_send_recv(xid, ses, &rqst, &resp_buftype, flags, &rsp_iov);
+       rc = cifs_send_recv(xid, ses, io_parms->server,
+                           &rqst, &resp_buftype, flags, &rsp_iov);
        rsp = (struct smb2_read_rsp *)rsp_iov.iov_base;
 
        if (rc) {
 {
        struct cifs_writedata *wdata = mid->callback_data;
        struct cifs_tcon *tcon = tlink_tcon(wdata->cfile->tlink);
-       struct TCP_Server_Info *server = tcon->ses->server;
+       struct TCP_Server_Info *server = wdata->server;
        unsigned int written;
        struct smb2_write_rsp *rsp = (struct smb2_write_rsp *)mid->resp_buf;
        struct cifs_credits credits = { .value = 0, .instance = 0 };
 
+       WARN_ONCE(wdata->server != mid->server,
+                 "wdata server %p != mid server %p",
+                 wdata->server, mid->server);
+
        switch (mid->mid_state) {
        case MID_RESPONSE_RECEIVED:
                credits.value = le16_to_cpu(rsp->sync_hdr.CreditRequest);
        struct smb2_write_req *req = NULL;
        struct smb2_sync_hdr *shdr;
        struct cifs_tcon *tcon = tlink_tcon(wdata->cfile->tlink);
-       struct TCP_Server_Info *server = tcon->ses->server;
+       struct TCP_Server_Info *server = wdata->server;
        struct kvec iov[1];
        struct smb_rqst rqst = { };
        unsigned int total_len;
 
-       rc = smb2_plain_req_init(SMB2_WRITE, tcon, (void **) &req, &total_len);
+       if (!wdata->server)
+               server = wdata->server = cifs_pick_channel(tcon->ses);
+
+       rc = smb2_plain_req_init(SMB2_WRITE, tcon, server,
+                                (void **) &req, &total_len);
        if (rc)
                return rc;
 
        struct kvec rsp_iov;
        int flags = 0;
        unsigned int total_len;
+       struct TCP_Server_Info *server;
 
        *nbytes = 0;
 
        if (n_vec < 1)
                return rc;
 
-       rc = smb2_plain_req_init(SMB2_WRITE, io_parms->tcon, (void **) &req,
-                            &total_len);
+       if (!io_parms->server)
+               io_parms->server = cifs_pick_channel(io_parms->tcon->ses);
+       server = io_parms->server;
+       if (server == NULL)
+               return -ECONNABORTED;
+
+       rc = smb2_plain_req_init(SMB2_WRITE, io_parms->tcon, server,
+                                (void **) &req, &total_len);
        if (rc)
                return rc;
 
-       if (io_parms->tcon->ses->server == NULL)
-               return -ECONNABORTED;
-
        if (smb3_encryption_required(io_parms->tcon))
                flags |= CIFS_TRANSFORM_REQ;
 
        rqst.rq_iov = iov;
        rqst.rq_nvec = n_vec + 1;
 
-       rc = cifs_send_recv(xid, io_parms->tcon->ses, &rqst,
+       rc = cifs_send_recv(xid, io_parms->tcon->ses, server,
+                           &rqst,
                            &resp_buftype, flags, &rsp_iov);
        rsp = (struct smb2_write_rsp *)rsp_iov.iov_base;
 
  * Readdir/FindFirst
  */
 int SMB2_query_directory_init(const unsigned int xid,
-                             struct cifs_tcon *tcon, struct smb_rqst *rqst,
+                             struct cifs_tcon *tcon,
+                             struct TCP_Server_Info *server,
+                             struct smb_rqst *rqst,
                              u64 persistent_fid, u64 volatile_fid,
                              int index, int info_level)
 {
-       struct TCP_Server_Info *server = tcon->ses->server;
        struct smb2_query_directory_req *req;
        unsigned char *bufptr;
        __le16 asteriks = cpu_to_le16('*');
        struct kvec *iov = rqst->rq_iov;
        int len, rc;
 
-       rc = smb2_plain_req_init(SMB2_QUERY_DIRECTORY, tcon, (void **) &req,
-                            &total_len);
+       rc = smb2_plain_req_init(SMB2_QUERY_DIRECTORY, tcon, server,
+                                (void **) &req, &total_len);
        if (rc)
                return rc;
 
        struct kvec rsp_iov;
        int rc = 0;
        struct cifs_ses *ses = tcon->ses;
+       struct TCP_Server_Info *server = cifs_pick_channel(ses);
        int flags = 0;
 
        if (!ses || !(ses->server))
        rqst.rq_iov = iov;
        rqst.rq_nvec = SMB2_QUERY_DIRECTORY_IOV_SIZE;
 
-       rc = SMB2_query_directory_init(xid, tcon, &rqst, persistent_fid,
+       rc = SMB2_query_directory_init(xid, tcon, server,
+                                      &rqst, persistent_fid,
                                       volatile_fid, index,
                                       srch_inf->info_level);
        if (rc)
                goto qdir_exit;
 
-       rc = cifs_send_recv(xid, ses, &rqst, &resp_buftype, flags, &rsp_iov);
+       rc = cifs_send_recv(xid, ses, server,
+                           &rqst, &resp_buftype, flags, &rsp_iov);
        rsp = (struct smb2_query_directory_rsp *)rsp_iov.iov_base;
 
        if (rc) {
 }
 
 int
-SMB2_set_info_init(struct cifs_tcon *tcon, struct smb_rqst *rqst,
-              u64 persistent_fid, u64 volatile_fid, u32 pid, u8 info_class,
-              u8 info_type, u32 additional_info,
-               void **data, unsigned int *size)
+SMB2_set_info_init(struct cifs_tcon *tcon, struct TCP_Server_Info *server,
+                  struct smb_rqst *rqst,
+                  u64 persistent_fid, u64 volatile_fid, u32 pid,
+                  u8 info_class, u8 info_type, u32 additional_info,
+                  void **data, unsigned int *size)
 {
        struct smb2_set_info_req *req;
        struct kvec *iov = rqst->rq_iov;
        unsigned int i, total_len;
        int rc;
 
-       rc = smb2_plain_req_init(SMB2_SET_INFO, tcon, (void **) &req, &total_len);
+       rc = smb2_plain_req_init(SMB2_SET_INFO, tcon, server,
+                                (void **) &req, &total_len);
        if (rc)
                return rc;
 
        int rc = 0;
        int resp_buftype;
        struct cifs_ses *ses = tcon->ses;
+       struct TCP_Server_Info *server = cifs_pick_channel(ses);
        int flags = 0;
 
-       if (!ses || !(ses->server))
+       if (!ses || !server)
                return -EIO;
 
        if (!num)
        rqst.rq_iov = iov;
        rqst.rq_nvec = num;
 
-       rc = SMB2_set_info_init(tcon, &rqst, persistent_fid, volatile_fid, pid,
+       rc = SMB2_set_info_init(tcon, server,
+                               &rqst, persistent_fid, volatile_fid, pid,
                                info_class, info_type, additional_info,
                                data, size);
        if (rc) {
        }
 
 
-       rc = cifs_send_recv(xid, ses, &rqst, &resp_buftype, flags,
+       rc = cifs_send_recv(xid, ses, server,
+                           &rqst, &resp_buftype, flags,
                            &rsp_iov);
        SMB2_set_info_free(&rqst);
        rsp = (struct smb2_set_info_rsp *)rsp_iov.iov_base;
        int rc;
        struct smb2_oplock_break *req = NULL;
        struct cifs_ses *ses = tcon->ses;
+       struct TCP_Server_Info *server = cifs_pick_channel(ses);
        int flags = CIFS_OBREAK_OP;
        unsigned int total_len;
        struct kvec iov[1];
        int resp_buf_type;
 
        cifs_dbg(FYI, "SMB2_oplock_break\n");
-       rc = smb2_plain_req_init(SMB2_OPLOCK_BREAK, tcon, (void **) &req,
-                            &total_len);
+       rc = smb2_plain_req_init(SMB2_OPLOCK_BREAK, tcon, server,
+                                (void **) &req, &total_len);
        if (rc)
                return rc;
 
        rqst.rq_iov = iov;
        rqst.rq_nvec = 1;
 
-       rc = cifs_send_recv(xid, ses, &rqst, &resp_buf_type, flags, &rsp_iov);
+       rc = cifs_send_recv(xid, ses, server,
+                           &rqst, &resp_buf_type, flags, &rsp_iov);
        cifs_small_buf_release(req);
 
        if (rc) {
 }
 
 static int
-build_qfs_info_req(struct kvec *iov, struct cifs_tcon *tcon, int level,
-                  int outbuf_len, u64 persistent_fid, u64 volatile_fid)
+build_qfs_info_req(struct kvec *iov, struct cifs_tcon *tcon,
+                  struct TCP_Server_Info *server,
+                  int level, int outbuf_len, u64 persistent_fid,
+                  u64 volatile_fid)
 {
        int rc;
        struct smb2_query_info_req *req;
 
        cifs_dbg(FYI, "Query FSInfo level %d\n", level);
 
-       if ((tcon->ses == NULL) || (tcon->ses->server == NULL))
+       if ((tcon->ses == NULL) || server == NULL)
                return -EIO;
 
-       rc = smb2_plain_req_init(SMB2_QUERY_INFO, tcon, (void **) &req,
-                            &total_len);
+       rc = smb2_plain_req_init(SMB2_QUERY_INFO, tcon, server,
+                                (void **) &req, &total_len);
        if (rc)
                return rc;
 
        int rc = 0;
        int resp_buftype;
        struct cifs_ses *ses = tcon->ses;
+       struct TCP_Server_Info *server = cifs_pick_channel(ses);
        FILE_SYSTEM_POSIX_INFO *info = NULL;
        int flags = 0;
 
-       rc = build_qfs_info_req(&iov, tcon, FS_POSIX_INFORMATION,
+       rc = build_qfs_info_req(&iov, tcon, server,
+                               FS_POSIX_INFORMATION,
                                sizeof(FILE_SYSTEM_POSIX_INFO),
                                persistent_fid, volatile_fid);
        if (rc)
        rqst.rq_iov = &iov;
        rqst.rq_nvec = 1;
 
-       rc = cifs_send_recv(xid, ses, &rqst, &resp_buftype, flags, &rsp_iov);
+       rc = cifs_send_recv(xid, ses, server,
+                           &rqst, &resp_buftype, flags, &rsp_iov);
        cifs_small_buf_release(iov.iov_base);
        if (rc) {
                cifs_stats_fail_inc(tcon, SMB2_QUERY_INFO_HE);
        int rc = 0;
        int resp_buftype;
        struct cifs_ses *ses = tcon->ses;
+       struct TCP_Server_Info *server = cifs_pick_channel(ses);
        struct smb2_fs_full_size_info *info = NULL;
        int flags = 0;
 
-       rc = build_qfs_info_req(&iov, tcon, FS_FULL_SIZE_INFORMATION,
+       rc = build_qfs_info_req(&iov, tcon, server,
+                               FS_FULL_SIZE_INFORMATION,
                                sizeof(struct smb2_fs_full_size_info),
                                persistent_fid, volatile_fid);
        if (rc)
        rqst.rq_iov = &iov;
        rqst.rq_nvec = 1;
 
-       rc = cifs_send_recv(xid, ses, &rqst, &resp_buftype, flags, &rsp_iov);
+       rc = cifs_send_recv(xid, ses, server,
+                           &rqst, &resp_buftype, flags, &rsp_iov);
        cifs_small_buf_release(iov.iov_base);
        if (rc) {
                cifs_stats_fail_inc(tcon, SMB2_QUERY_INFO_HE);
        int rc = 0;
        int resp_buftype, max_len, min_len;
        struct cifs_ses *ses = tcon->ses;
+       struct TCP_Server_Info *server = cifs_pick_channel(ses);
        unsigned int rsp_len, offset;
        int flags = 0;
 
                return -EINVAL;
        }
 
-       rc = build_qfs_info_req(&iov, tcon, level, max_len,
+       rc = build_qfs_info_req(&iov, tcon, server,
+                               level, max_len,
                                persistent_fid, volatile_fid);
        if (rc)
                return rc;
        rqst.rq_iov = &iov;
        rqst.rq_nvec = 1;
 
-       rc = cifs_send_recv(xid, ses, &rqst, &resp_buftype, flags, &rsp_iov);
+       rc = cifs_send_recv(xid, ses, server,
+                           &rqst, &resp_buftype, flags, &rsp_iov);
        cifs_small_buf_release(iov.iov_base);
        if (rc) {
                cifs_stats_fail_inc(tcon, SMB2_QUERY_INFO_HE);
        unsigned int count;
        int flags = CIFS_NO_RSP_BUF;
        unsigned int total_len;
+       struct TCP_Server_Info *server = cifs_pick_channel(tcon->ses);
 
        cifs_dbg(FYI, "smb2_lockv num lock %d\n", num_lock);
 
-       rc = smb2_plain_req_init(SMB2_LOCK, tcon, (void **) &req, &total_len);
+       rc = smb2_plain_req_init(SMB2_LOCK, tcon, server,
+                                (void **) &req, &total_len);
        if (rc)
                return rc;
 
        rqst.rq_iov = iov;
        rqst.rq_nvec = 2;
 
-       rc = cifs_send_recv(xid, tcon->ses, &rqst, &resp_buf_type, flags,
+       rc = cifs_send_recv(xid, tcon->ses, server,
+                           &rqst, &resp_buf_type, flags,
                            &rsp_iov);
        cifs_small_buf_release(req);
        if (rc) {
        int resp_buf_type;
        __u64 *please_key_high;
        __u64 *please_key_low;
+       struct TCP_Server_Info *server = cifs_pick_channel(tcon->ses);
 
        cifs_dbg(FYI, "SMB2_lease_break\n");
-       rc = smb2_plain_req_init(SMB2_OPLOCK_BREAK, tcon, (void **) &req,
-                            &total_len);
+       rc = smb2_plain_req_init(SMB2_OPLOCK_BREAK, tcon, server,
+                                (void **) &req, &total_len);
        if (rc)
                return rc;
 
        rqst.rq_iov = iov;
        rqst.rq_nvec = 1;
 
-       rc = cifs_send_recv(xid, ses, &rqst, &resp_buf_type, flags, &rsp_iov);
+       rc = cifs_send_recv(xid, ses, server,
+                           &rqst, &resp_buf_type, flags, &rsp_iov);
        cifs_small_buf_release(req);
 
        please_key_low = (__u64 *)lease_key;