diff options
Diffstat (limited to 'fs/cifs/transport.c')
-rw-r--r-- | fs/cifs/transport.c | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/fs/cifs/transport.c b/fs/cifs/transport.c index b12cb8a7da7c..3da80409466c 100644 --- a/fs/cifs/transport.c +++ b/fs/cifs/transport.c | |||
@@ -309,17 +309,16 @@ SendReceive2(const unsigned int xid, struct cifsSesInfo *ses, | |||
309 | 309 | ||
310 | *pRespBufType = CIFS_NO_BUFFER; /* no response buf yet */ | 310 | *pRespBufType = CIFS_NO_BUFFER; /* no response buf yet */ |
311 | 311 | ||
312 | if (ses == NULL) { | 312 | if ((ses == NULL) || (ses->server == NULL)) { |
313 | cERROR(1,("Null smb session")); | 313 | cifs_small_buf_release(in_buf); |
314 | return -EIO; | 314 | cERROR(1,("Null session")); |
315 | } | ||
316 | if(ses->server == NULL) { | ||
317 | cERROR(1,("Null tcp session")); | ||
318 | return -EIO; | 315 | return -EIO; |
319 | } | 316 | } |
320 | 317 | ||
321 | if(ses->server->tcpStatus == CifsExiting) | 318 | if(ses->server->tcpStatus == CifsExiting) { |
319 | cifs_small_buf_release(in_buf); | ||
322 | return -ENOENT; | 320 | return -ENOENT; |
321 | } | ||
323 | 322 | ||
324 | /* Ensure that we do not send more than 50 overlapping requests | 323 | /* Ensure that we do not send more than 50 overlapping requests |
325 | to the same server. We may make this configurable later or | 324 | to the same server. We may make this configurable later or |
@@ -346,6 +345,7 @@ SendReceive2(const unsigned int xid, struct cifsSesInfo *ses, | |||
346 | } else { | 345 | } else { |
347 | if(ses->server->tcpStatus == CifsExiting) { | 346 | if(ses->server->tcpStatus == CifsExiting) { |
348 | spin_unlock(&GlobalMid_Lock); | 347 | spin_unlock(&GlobalMid_Lock); |
348 | cifs_small_buf_release(in_buf); | ||
349 | return -ENOENT; | 349 | return -ENOENT; |
350 | } | 350 | } |
351 | 351 | ||
@@ -385,6 +385,7 @@ SendReceive2(const unsigned int xid, struct cifsSesInfo *ses, | |||
385 | midQ = AllocMidQEntry(in_buf, ses); | 385 | midQ = AllocMidQEntry(in_buf, ses); |
386 | if (midQ == NULL) { | 386 | if (midQ == NULL) { |
387 | up(&ses->server->tcpSem); | 387 | up(&ses->server->tcpSem); |
388 | cifs_small_buf_release(in_buf); | ||
388 | /* If not lock req, update # of requests on wire to server */ | 389 | /* If not lock req, update # of requests on wire to server */ |
389 | if(long_op < 3) { | 390 | if(long_op < 3) { |
390 | atomic_dec(&ses->server->inFlight); | 391 | atomic_dec(&ses->server->inFlight); |
@@ -408,14 +409,18 @@ SendReceive2(const unsigned int xid, struct cifsSesInfo *ses, | |||
408 | if(rc < 0) { | 409 | if(rc < 0) { |
409 | DeleteMidQEntry(midQ); | 410 | DeleteMidQEntry(midQ); |
410 | up(&ses->server->tcpSem); | 411 | up(&ses->server->tcpSem); |
412 | cifs_small_buf_release(in_buf); | ||
411 | /* If not lock req, update # of requests on wire to server */ | 413 | /* If not lock req, update # of requests on wire to server */ |
412 | if(long_op < 3) { | 414 | if(long_op < 3) { |
413 | atomic_dec(&ses->server->inFlight); | 415 | atomic_dec(&ses->server->inFlight); |
414 | wake_up(&ses->server->request_q); | 416 | wake_up(&ses->server->request_q); |
415 | } | 417 | } |
416 | return rc; | 418 | return rc; |
417 | } else | 419 | } else { |
418 | up(&ses->server->tcpSem); | 420 | up(&ses->server->tcpSem); |
421 | cifs_small_buf_release(in_buf); | ||
422 | } | ||
423 | |||
419 | if (long_op == -1) | 424 | if (long_op == -1) |
420 | goto cifs_no_response_exit2; | 425 | goto cifs_no_response_exit2; |
421 | else if (long_op == 2) /* writes past end of file can take loong time */ | 426 | else if (long_op == 2) /* writes past end of file can take loong time */ |
@@ -543,6 +548,7 @@ cifs_no_response_exit2: | |||
543 | 548 | ||
544 | out_unlock2: | 549 | out_unlock2: |
545 | up(&ses->server->tcpSem); | 550 | up(&ses->server->tcpSem); |
551 | cifs_small_buf_release(in_buf); | ||
546 | /* If not lock req, update # of requests on wire to server */ | 552 | /* If not lock req, update # of requests on wire to server */ |
547 | if(long_op < 3) { | 553 | if(long_op < 3) { |
548 | atomic_dec(&ses->server->inFlight); | 554 | atomic_dec(&ses->server->inFlight); |