Re: [PATCH] cifs: cancel all remaining requests if one failed in a compound

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



shouldn't this be cc:stable

On Thu, Dec 20, 2018 at 9:18 PM Ronnie Sahlberg <lsahlber@xxxxxxxxxx> wrote:
>
> If we failed to get a reply to a request in a compound we should cancel
> the current request and also all further requests in the chain.
>
> Reported-by: Pavel Shilovsky <piastryyy@xxxxxxxxx>
> Signed-off-by: Ronnie Sahlberg <lsahlber@xxxxxxxxxx>
> ---
>  fs/cifs/transport.c | 11 +++++------
>  1 file changed, 5 insertions(+), 6 deletions(-)
>
> diff --git a/fs/cifs/transport.c b/fs/cifs/transport.c
> index 83ff0c25710d..ed6cd5066396 100644
> --- a/fs/cifs/transport.c
> +++ b/fs/cifs/transport.c
> @@ -873,7 +873,11 @@ compound_send_recv(const unsigned int xid, struct cifs_ses *ses,
>
>         for (i = 0; i < num_rqst; i++) {
>                 rc = wait_for_response(ses->server, midQ[i]);
> -               if (rc != 0) {
> +               if (rc != 0)
> +                       break;
> +       }
> +       if (rc != 0) {
> +               for (; i < num_rqst; i++) {
>                         cifs_dbg(VFS, "Cancelling wait for mid %llu cmd: %d\n",
>                                  midQ[i]->mid, le16_to_cpu(midQ[i]->command));
>                         send_cancel(ses->server, &rqst[i], midQ[i]);
> @@ -881,9 +885,6 @@ compound_send_recv(const unsigned int xid, struct cifs_ses *ses,
>                         if (midQ[i]->mid_state == MID_REQUEST_SUBMITTED) {
>                                 midQ[i]->mid_flags |= MID_WAIT_CANCELLED;
>                                 midQ[i]->callback = DeleteMidQEntry;
> -                               spin_unlock(&GlobalMid_Lock);
> -                               add_credits(ses->server, 1, optype);
> -                               return rc;
>                         }
>                         spin_unlock(&GlobalMid_Lock);
>                 }
> @@ -892,8 +893,6 @@ compound_send_recv(const unsigned int xid, struct cifs_ses *ses,
>         for (i = 0; i < num_rqst; i++)
>                 if (midQ[i]->resp_buf)
>                         credits += ses->server->ops->get_credits(midQ[i]);
> -       if (!credits)
> -               credits = 1;
>
>         for (i = 0; i < num_rqst; i++) {
>                 if (rc < 0)
> --
> 2.13.6
>


-- 
Thanks,

Steve



[Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux