On Sun, 12 Dec 2010 17:29:58 -0600 Shirish Pargaonkar <shirishpargaonkar@xxxxxxxxx> wrote: > 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. > I agree, but my goal with this patch is to consolidate the cut-and-pasted code as-is into a single spot. A later patch will clean it up. > > + } > > + } > > + 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 > > -- Jeff Layton <jlayton@xxxxxxxxxx> -- 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