On Fri, Dec 10, 2010 at 9:44 AM, Jeff Layton <[email protected]> wrote:
> 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 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 [email protected]
> 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 [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html