CIFS: Respect negotiated MaxMpxCount
Some servers sets this value less than 50 that was hardcoded and we lost the connection if when we exceed this limit. Fix this by respecting this value - not sending more than the server allows. Cc: stable@kernel.org Reviewed-by: Jeff Layton <jlayton@samba.org> Signed-off-by: Pavel Shilovsky <piastry@etersoft.ru> Signed-off-by: Steve French <stevef@smf-gateway.(none)>
Šī revīzija ir iekļauta:

revīziju iesūtīja
Steve French

vecāks
ce85852b90
revīzija
10b9b98e41
@@ -642,14 +642,10 @@ static void clean_demultiplex_info(struct TCP_Server_Info *server)
|
||||
spin_unlock(&GlobalMid_Lock);
|
||||
wake_up_all(&server->response_q);
|
||||
|
||||
/*
|
||||
* Check if we have blocked requests that need to free. Note that
|
||||
* cifs_max_pending is normally 50, but can be set at module install
|
||||
* time to as little as two.
|
||||
*/
|
||||
/* Check if we have blocked requests that need to free. */
|
||||
spin_lock(&GlobalMid_Lock);
|
||||
if (atomic_read(&server->inFlight) >= cifs_max_pending)
|
||||
atomic_set(&server->inFlight, cifs_max_pending - 1);
|
||||
if (atomic_read(&server->inFlight) >= server->maxReq)
|
||||
atomic_set(&server->inFlight, server->maxReq - 1);
|
||||
/*
|
||||
* We do not want to set the max_pending too low or we could end up
|
||||
* with the counter going negative.
|
||||
@@ -1910,6 +1906,7 @@ cifs_get_tcp_session(struct smb_vol *volume_info)
|
||||
tcp_ses->noautotune = volume_info->noautotune;
|
||||
tcp_ses->tcp_nodelay = volume_info->sockopt_tcp_nodelay;
|
||||
atomic_set(&tcp_ses->inFlight, 0);
|
||||
tcp_ses->maxReq = 1; /* enough to send negotiate request */
|
||||
init_waitqueue_head(&tcp_ses->response_q);
|
||||
init_waitqueue_head(&tcp_ses->request_q);
|
||||
INIT_LIST_HEAD(&tcp_ses->pending_mid_q);
|
||||
|
Atsaukties uz šo jaunā problēmā
Block a user