Commit 198b5682 authored by Jeff Layton's avatar Jeff Layton Committed by Steve French

cifs: break negotiate protocol calls out of cifs_setup_session

So that we can reasonably set up the secType based on both the
NegotiateProtocol response and the parsed mount options.
Signed-off-by: default avatarJeff Layton <jlayton@redhat.com>
Signed-off-by: default avatarSteve French <sfrench@us.ibm.com>
parent ebe6aa5a
...@@ -138,7 +138,9 @@ extern void cifs_dfs_release_automount_timer(void); ...@@ -138,7 +138,9 @@ extern void cifs_dfs_release_automount_timer(void);
void cifs_proc_init(void); void cifs_proc_init(void);
void cifs_proc_clean(void); void cifs_proc_clean(void);
extern int cifs_setup_session(unsigned int xid, struct cifsSesInfo *pSesInfo, extern int cifs_negotiate_protocol(unsigned int xid,
struct cifsSesInfo *ses);
extern int cifs_setup_session(unsigned int xid, struct cifsSesInfo *ses,
struct nls_table *nls_info); struct nls_table *nls_info);
extern int CIFSSMBNegotiate(unsigned int xid, struct cifsSesInfo *ses); extern int CIFSSMBNegotiate(unsigned int xid, struct cifsSesInfo *ses);
......
...@@ -172,7 +172,8 @@ cifs_reconnect_tcon(struct cifsTconInfo *tcon, int smb_command) ...@@ -172,7 +172,8 @@ cifs_reconnect_tcon(struct cifsTconInfo *tcon, int smb_command)
* reconnect the same SMB session * reconnect the same SMB session
*/ */
mutex_lock(&ses->session_mutex); mutex_lock(&ses->session_mutex);
if (ses->need_reconnect) rc = cifs_negotiate_protocol(0, ses);
if (rc == 0 && ses->need_reconnect)
rc = cifs_setup_session(0, ses, nls_codepage); rc = cifs_setup_session(0, ses, nls_codepage);
/* do we need to reconnect tcon? */ /* do we need to reconnect tcon? */
......
...@@ -1651,6 +1651,14 @@ cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb_vol *volume_info) ...@@ -1651,6 +1651,14 @@ cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb_vol *volume_info)
cifs_put_tcp_session(server); cifs_put_tcp_session(server);
mutex_lock(&ses->session_mutex); mutex_lock(&ses->session_mutex);
rc = cifs_negotiate_protocol(xid, ses);
if (rc) {
mutex_unlock(&ses->session_mutex);
/* problem -- put our ses reference */
cifs_put_smb_ses(ses);
FreeXid(xid);
return ERR_PTR(rc);
}
if (ses->need_reconnect) { if (ses->need_reconnect) {
cFYI(1, "Session needs reconnect"); cFYI(1, "Session needs reconnect");
rc = cifs_setup_session(xid, ses, rc = cifs_setup_session(xid, ses,
...@@ -1702,6 +1710,8 @@ cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb_vol *volume_info) ...@@ -1702,6 +1710,8 @@ cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb_vol *volume_info)
ses->overrideSecFlg = volume_info->secFlg; ses->overrideSecFlg = volume_info->secFlg;
mutex_lock(&ses->session_mutex); mutex_lock(&ses->session_mutex);
rc = cifs_negotiate_protocol(xid, ses);
if (!rc)
rc = cifs_setup_session(xid, ses, volume_info->local_nls); rc = cifs_setup_session(xid, ses, volume_info->local_nls);
mutex_unlock(&ses->session_mutex); mutex_unlock(&ses->session_mutex);
if (rc) if (rc)
...@@ -2874,18 +2884,19 @@ cifs_umount(struct super_block *sb, struct cifs_sb_info *cifs_sb) ...@@ -2874,18 +2884,19 @@ cifs_umount(struct super_block *sb, struct cifs_sb_info *cifs_sb)
return rc; return rc;
} }
int cifs_setup_session(unsigned int xid, struct cifsSesInfo *pSesInfo, int cifs_negotiate_protocol(unsigned int xid, struct cifsSesInfo *ses)
struct nls_table *nls_info)
{ {
int rc = 0; int rc = 0;
struct TCP_Server_Info *server = pSesInfo->server; struct TCP_Server_Info *server = ses->server;
/* only send once per connect */
if (server->maxBuf != 0)
return 0;
/* what if server changes its buffer size after dropping the session? */ rc = CIFSSMBNegotiate(xid, ses);
if (server->maxBuf == 0) /* no need to send on reconnect */ {
rc = CIFSSMBNegotiate(xid, pSesInfo);
if (rc == -EAGAIN) { if (rc == -EAGAIN) {
/* retry only once on 1st time connection */ /* retry only once on 1st time connection */
rc = CIFSSMBNegotiate(xid, pSesInfo); rc = CIFSSMBNegotiate(xid, ses);
if (rc == -EAGAIN) if (rc == -EAGAIN)
rc = -EHOSTDOWN; rc = -EHOSTDOWN;
} }
...@@ -2898,31 +2909,36 @@ int cifs_setup_session(unsigned int xid, struct cifsSesInfo *pSesInfo, ...@@ -2898,31 +2909,36 @@ int cifs_setup_session(unsigned int xid, struct cifsSesInfo *pSesInfo,
spin_unlock(&GlobalMid_Lock); spin_unlock(&GlobalMid_Lock);
} }
}
if (rc) return rc;
goto ss_err_exit; }
int cifs_setup_session(unsigned int xid, struct cifsSesInfo *ses,
struct nls_table *nls_info)
{
int rc = 0;
struct TCP_Server_Info *server = ses->server;
pSesInfo->flags = 0; ses->flags = 0;
pSesInfo->capabilities = server->capabilities; ses->capabilities = server->capabilities;
if (linuxExtEnabled == 0) if (linuxExtEnabled == 0)
pSesInfo->capabilities &= (~CAP_UNIX); ses->capabilities &= (~CAP_UNIX);
cFYI(1, "Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d", cFYI(1, "Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d",
server->secMode, server->capabilities, server->timeAdj); server->secMode, server->capabilities, server->timeAdj);
rc = CIFS_SessSetup(xid, pSesInfo, nls_info); rc = CIFS_SessSetup(xid, ses, nls_info);
if (rc) { if (rc) {
cERROR(1, "Send error in SessSetup = %d", rc); cERROR(1, "Send error in SessSetup = %d", rc);
} else { } else {
cFYI(1, "CIFS Session Established successfully"); cFYI(1, "CIFS Session Established successfully");
spin_lock(&GlobalMid_Lock); spin_lock(&GlobalMid_Lock);
pSesInfo->status = CifsGood; ses->status = CifsGood;
pSesInfo->need_reconnect = false; ses->need_reconnect = false;
spin_unlock(&GlobalMid_Lock); spin_unlock(&GlobalMid_Lock);
} }
ss_err_exit:
return rc; return rc;
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment