cifs: Check for timeout on Negotiate stage
Some servers seem to accept connections while booting but never send
the SMBNegotiate response neither close the connection, causing all
processes accessing the share hang on uninterruptible sleep state.
This happens when the cifs_demultiplex_thread detects the server is
unresponsive so releases the socket and start trying to reconnect.
At some point, the faulty server will accept the socket and the TCP
status will be set to NeedNegotiate. The first issued command accessing
the share will start the negotiation (pid 5828 below), but the response
will never arrive so other commands will be blocked waiting on the mutex
(pid 55352).
This patch checks for unresponsive servers also on the negotiate stage
releasing the socket and reconnecting if the response is not received
and checking again the tcp state when the mutex is acquired.
PID: 55352 TASK:
ffff880fd6cc02c0 CPU: 0 COMMAND: "ls"
#0 [
ffff880fd9add9f0] schedule at
ffffffff81467eb9
#1 [
ffff880fd9addb38] __mutex_lock_slowpath at
ffffffff81468fe0
#2 [
ffff880fd9addba8] mutex_lock at
ffffffff81468b1a
#3 [
ffff880fd9addbc0] cifs_reconnect_tcon at
ffffffffa042f905 [cifs]
#4 [
ffff880fd9addc60] smb_init at
ffffffffa042faeb [cifs]
#5 [
ffff880fd9addca0] CIFSSMBQPathInfo at
ffffffffa04360b5 [cifs]
....
Which is waiting a mutex owned by:
PID: 5828 TASK:
ffff880fcc55e400 CPU: 0 COMMAND: "xxxx"
#0 [
ffff880fbfdc19b8] schedule at
ffffffff81467eb9
#1 [
ffff880fbfdc1b00] wait_for_response at
ffffffffa044f96d [cifs]
#2 [
ffff880fbfdc1b60] SendReceive at
ffffffffa04505ce [cifs]
#3 [
ffff880fbfdc1bb0] CIFSSMBNegotiate at
ffffffffa0438d79 [cifs]
#4 [
ffff880fbfdc1c50] cifs_negotiate_protocol at
ffffffffa043b383 [cifs]
#5 [
ffff880fbfdc1c80] cifs_reconnect_tcon at
ffffffffa042f911 [cifs]
#6 [
ffff880fbfdc1d20] smb_init at
ffffffffa042faeb [cifs]
#7 [
ffff880fbfdc1d60] CIFSSMBQFSInfo at
ffffffffa0434eb0 [cifs]
....
Signed-off-by: Samuel Cabrero <scabrero@suse.de>
Reviewed-by: Aurélien Aptel <aaptel@suse.de>
Reviewed-by: Ronnie Sahlberg <lsahlber@redhat.com>
Signed-off-by: Steve French <smfrench@gmail.com>