On Fri, Dec 10, 2010 at 9:44 AM, Jeff Layton <jlayton@xxxxxxxxxx> wrote: > Signed-off-by: Jeff Layton <jlayton@xxxxxxxxxx> > --- > 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 9763f89..2d21bbd 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; I think this else part is redundant. If rc is not EHOSTDOWN, which means it is 0, midState will always be MID_RETRY_NEEDED. > + } > + } > + 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 majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html > -- To unsubscribe from this list: send the line "unsubscribe linux-cifs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html