Messages in this thread Patch in this message |  | | Date | Fri, 13 Jun 2025 18:44:20 +0800 | | Subject | [PATCH] smb: client: fix first failure in negotiation after server reboot | | From | "zhangjian (CG)" <> |
| |
After fabc4ed200f9, server_unresponsive add a condition to check whether client need to reconnect depending on server->lstrp. When client failed to reconnect in 180s, client will abort connection and update server->lstrp for the last time. In the following scene, server->lstrp is too old, which may cause failure for the first negotiation.
client | server -------------------------------------------------------+------------------ mount to cifs server | ls | | reboot stuck for 180s and return EHOSTDOWN | abort connection and update server->lstrp | | sleep 21s | service smb restart ls | smb_negotiate | server_unresponsive cause reconnect [in cifsd] | ( tcpStatus == CifsInNegotiate && | jiffies > server->lstrp + 20s ) | cifs_sync_mid_result return EAGAIN | smb_negotiate return EHOSTDOWN | ls failed |
The condition (tcpStatus == CifsInNegotiate && jiffies > server->lstrp + 20s) expect client stay in CifsInNegotiate state for more than 20s. So we update server->lstrp before last switching into CifsInNegotiate state to avoid this failure.
Fixes: fabc4ed200f9 ("smb: client: fix hang in wait_for_response() for negproto") Signed-off-by: zhangjian <zhangjian496@huawei.com> --- fs/smb/client/connect.c | 1 + 1 file changed, 1 insertion(+)
diff --git a/fs/smb/client/connect.c b/fs/smb/client/connect.c index 28bc33496..f9aef60f1 100644 --- a/fs/smb/client/connect.c +++ b/fs/smb/client/connect.c @@ -4193,6 +4193,7 @@ cifs_negotiate_protocol(const unsigned int xid, struct cifs_ses *ses, return 0; } + server->lstrp = jiffies; server->tcpStatus = CifsInNegotiate; spin_unlock(&server->srv_lock); -- 2.33.0
|  |