Signed-off-by: Jeff Layton <[email protected]>
---
 fs/cifs/transport.c |  131 ++++++++++++++++++--------------------------------
 1 files changed, 47 insertions(+), 84 deletions(-)

diff --git a/fs/cifs/transport.c b/fs/cifs/transport.c
index e0588cd..8b9dd0b 100644
--- a/fs/cifs/transport.c
+++ b/fs/cifs/transport.c
@@ -382,6 +382,46 @@ SendReceiveNoRsp(const unsigned int xid, struct 
cifsSesInfo *ses,
        return rc;
 }
 
+static int
+handle_mid_result(struct mid_q_entry *mid, struct TCP_Server_Info *server)
+{
+       int rc = 0;
+
+       spin_lock(&GlobalMid_Lock);
+
+       if (mid->resp_buf) {
+               spin_unlock(&GlobalMid_Lock);
+               return rc;
+       }
+
+       cERROR(1, "No response to cmd %d mid %d", mid->command, mid->mid);
+       if (mid->midState == MID_REQUEST_SUBMITTED) {
+               if (server->tcpStatus == CifsExiting)
+                       rc = -EHOSTDOWN;
+               else {
+                       server->tcpStatus = CifsNeedReconnect;
+                       mid->midState = MID_RETRY_NEEDED;
+               }
+       }
+
+       if (rc != -EHOSTDOWN) {
+               if (mid->midState == MID_RETRY_NEEDED) {
+                       rc = -EAGAIN;
+                       cFYI(1, "marking request for retry");
+               } else {
+                       rc = -EIO;
+               }
+       }
+       spin_unlock(&GlobalMid_Lock);
+
+       DeleteMidQEntry(mid);
+       /* Update # of requests on wire to server */
+       atomic_dec(&server->inFlight);
+       wake_up(&server->request_q);
+
+       return rc;
+}
+
 int
 SendReceive2(const unsigned int xid, struct cifsSesInfo *ses,
             struct kvec *iov, int n_vec, int *pRespBufType /* ret */,
@@ -485,37 +525,10 @@ SendReceive2(const unsigned int xid, struct cifsSesInfo 
*ses,
        /* No user interrupts in wait - wreaks havoc with performance */
        wait_for_response(ses, midQ, timeout, 10 * HZ);
 
-       spin_lock(&GlobalMid_Lock);
-
-       if (midQ->resp_buf == NULL) {
-               cERROR(1, "No response to cmd %d mid %d",
-                       midQ->command, midQ->mid);
-               if (midQ->midState == MID_REQUEST_SUBMITTED) {
-                       if (ses->server->tcpStatus == CifsExiting)
-                               rc = -EHOSTDOWN;
-                       else {
-                               ses->server->tcpStatus = CifsNeedReconnect;
-                               midQ->midState = MID_RETRY_NEEDED;
-                       }
-               }
-
-               if (rc != -EHOSTDOWN) {
-                       if (midQ->midState == MID_RETRY_NEEDED) {
-                               rc = -EAGAIN;
-                               cFYI(1, "marking request for retry");
-                       } else {
-                               rc = -EIO;
-                       }
-               }
-               spin_unlock(&GlobalMid_Lock);
-               DeleteMidQEntry(midQ);
-               /* Update # of requests on wire to server */
-               atomic_dec(&ses->server->inFlight);
-               wake_up(&ses->server->request_q);
+       rc = handle_mid_result(midQ, ses->server);
+       if (rc != 0)
                return rc;
-       }
 
-       spin_unlock(&GlobalMid_Lock);
        receive_len = midQ->resp_buf->smb_buf_length;
 
        if (receive_len > CIFSMaxBufSize + MAX_CIFS_HDR_SIZE) {
@@ -677,36 +690,10 @@ SendReceive(const unsigned int xid, struct cifsSesInfo 
*ses,
        /* No user interrupts in wait - wreaks havoc with performance */
        wait_for_response(ses, midQ, timeout, 10 * HZ);
 
-       spin_lock(&GlobalMid_Lock);
-       if (midQ->resp_buf == NULL) {
-               cERROR(1, "No response for cmd %d mid %d",
-                         midQ->command, midQ->mid);
-               if (midQ->midState == MID_REQUEST_SUBMITTED) {
-                       if (ses->server->tcpStatus == CifsExiting)
-                               rc = -EHOSTDOWN;
-                       else {
-                               ses->server->tcpStatus = CifsNeedReconnect;
-                               midQ->midState = MID_RETRY_NEEDED;
-                       }
-               }
-
-               if (rc != -EHOSTDOWN) {
-                       if (midQ->midState == MID_RETRY_NEEDED) {
-                               rc = -EAGAIN;
-                               cFYI(1, "marking request for retry");
-                       } else {
-                               rc = -EIO;
-                       }
-               }
-               spin_unlock(&GlobalMid_Lock);
-               DeleteMidQEntry(midQ);
-               /* Update # of requests on wire to server */
-               atomic_dec(&ses->server->inFlight);
-               wake_up(&ses->server->request_q);
+       rc = handle_mid_result(midQ, ses->server);
+       if (rc != 0)
                return rc;
-       }
 
-       spin_unlock(&GlobalMid_Lock);
        receive_len = midQ->resp_buf->smb_buf_length;
 
        if (receive_len > CIFSMaxBufSize + MAX_CIFS_HDR_SIZE) {
@@ -926,35 +913,11 @@ SendReceiveBlockingLock(const unsigned int xid, struct 
cifsTconInfo *tcon,
                }
        }
 
-       spin_lock(&GlobalMid_Lock);
-       if (midQ->resp_buf) {
-               spin_unlock(&GlobalMid_Lock);
-               receive_len = midQ->resp_buf->smb_buf_length;
-       } else {
-               cERROR(1, "No response for cmd %d mid %d",
-                         midQ->command, midQ->mid);
-               if (midQ->midState == MID_REQUEST_SUBMITTED) {
-                       if (ses->server->tcpStatus == CifsExiting)
-                               rc = -EHOSTDOWN;
-                       else {
-                               ses->server->tcpStatus = CifsNeedReconnect;
-                               midQ->midState = MID_RETRY_NEEDED;
-                       }
-               }
-
-               if (rc != -EHOSTDOWN) {
-                       if (midQ->midState == MID_RETRY_NEEDED) {
-                               rc = -EAGAIN;
-                               cFYI(1, "marking request for retry");
-                       } else {
-                               rc = -EIO;
-                       }
-               }
-               spin_unlock(&GlobalMid_Lock);
-               DeleteMidQEntry(midQ);
+       rc = handle_mid_result(midQ, ses->server);
+       if (rc != 0)
                return rc;
-       }
 
+       receive_len = midQ->resp_buf->smb_buf_length;
        if (receive_len > CIFSMaxBufSize + MAX_CIFS_HDR_SIZE) {
                cERROR(1, "Frame too large received.  Length: %d  Xid: %d",
                        receive_len, xid);
-- 
1.7.3.2

--
To unsubscribe from this list: send the line "unsubscribe linux-cifs" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to