cifs: Avoid umount hangs with smb2 when server is unresponsive
Do not send SMB2 Logoff command when reconnecting, the way smb1 code base works. Also, no need to wait for a credit for an echo command when one is already in flight. Without these changes, umount command hangs if the server is unresponsive e.g. hibernating. Signed-off-by: Shirish Pargaonkar <shirishpargaonkar@gmail.com> Acked-by: Jeff Layton <jlayton@redhat.com> Signed-off-by: Steve French <smfrench@us.ibm.com>
This commit is contained in:
parent
c31f330719
commit
eb4c7df6c2
@ -687,6 +687,10 @@ SMB2_logoff(const unsigned int xid, struct cifs_ses *ses)
|
||||
else
|
||||
return -EIO;
|
||||
|
||||
/* no need to send SMB logoff if uid already closed due to reconnect */
|
||||
if (ses->need_reconnect)
|
||||
goto smb2_session_already_dead;
|
||||
|
||||
rc = small_smb2_init(SMB2_LOGOFF, NULL, (void **) &req);
|
||||
if (rc)
|
||||
return rc;
|
||||
@ -701,6 +705,8 @@ SMB2_logoff(const unsigned int xid, struct cifs_ses *ses)
|
||||
* No tcon so can't do
|
||||
* cifs_stats_inc(&tcon->stats.smb2_stats.smb2_com_fail[SMB2...]);
|
||||
*/
|
||||
|
||||
smb2_session_already_dead:
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
@ -410,8 +410,13 @@ static int
|
||||
wait_for_free_request(struct TCP_Server_Info *server, const int timeout,
|
||||
const int optype)
|
||||
{
|
||||
return wait_for_free_credits(server, timeout,
|
||||
server->ops->get_credits_field(server, optype));
|
||||
int *val;
|
||||
|
||||
val = server->ops->get_credits_field(server, optype);
|
||||
/* Since an echo is already inflight, no need to wait to send another */
|
||||
if (*val <= 0 && optype == CIFS_ECHO_OP)
|
||||
return -EAGAIN;
|
||||
return wait_for_free_credits(server, timeout, val);
|
||||
}
|
||||
|
||||
static int allocate_mid(struct cifs_ses *ses, struct smb_hdr *in_buf,
|
||||
|
Loading…
Reference in New Issue
Block a user