lkml.org 
[lkml]   [2016]   [Mar]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.19.y-ckt 27/70] CIFS: Fix SMB2+ interim response processing for read requests
    Date
    v3.19.8-ckt17 -stable review patch.  If anyone has any objections, please let me know.

    ---8<------------------------------------------------------------

    From: Pavel Shilovsky <pshilovsky@samba.org>

    commit 6cc3b24235929b54acd5ecc987ef11a425bd209e upstream.

    For interim responses we only need to parse a header and update
    a number credits. Now it is done for all SMB2+ command except
    SMB2_READ which is wrong. Fix this by adding such processing.

    Signed-off-by: Pavel Shilovsky <pshilovsky@samba.org>
    Tested-by: Shirish Pargaonkar <shirishpargaonkar@gmail.com>
    Signed-off-by: Steve French <smfrench@gmail.com>
    Signed-off-by: Kamal Mostafa <kamal@canonical.com>
    ---
    fs/cifs/cifssmb.c | 21 ++++++++++++++++++---
    1 file changed, 18 insertions(+), 3 deletions(-)

    diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c
    index fa13d5e..d2f8ae7 100644
    --- a/fs/cifs/cifssmb.c
    +++ b/fs/cifs/cifssmb.c
    @@ -1395,11 +1395,10 @@ openRetry:
    * current bigbuf.
    */
    static int
    -cifs_readv_discard(struct TCP_Server_Info *server, struct mid_q_entry *mid)
    +discard_remaining_data(struct TCP_Server_Info *server)
    {
    unsigned int rfclen = get_rfc1002_length(server->smallbuf);
    int remaining = rfclen + 4 - server->total_read;
    - struct cifs_readdata *rdata = mid->callback_data;

    while (remaining > 0) {
    int length;
    @@ -1413,10 +1412,20 @@ cifs_readv_discard(struct TCP_Server_Info *server, struct mid_q_entry *mid)
    remaining -= length;
    }

    - dequeue_mid(mid, rdata->result);
    return 0;
    }

    +static int
    +cifs_readv_discard(struct TCP_Server_Info *server, struct mid_q_entry *mid)
    +{
    + int length;
    + struct cifs_readdata *rdata = mid->callback_data;
    +
    + length = discard_remaining_data(server);
    + dequeue_mid(mid, rdata->result);
    + return length;
    +}
    +
    int
    cifs_readv_receive(struct TCP_Server_Info *server, struct mid_q_entry *mid)
    {
    @@ -1445,6 +1454,12 @@ cifs_readv_receive(struct TCP_Server_Info *server, struct mid_q_entry *mid)
    return length;
    server->total_read += length;

    + if (server->ops->is_status_pending &&
    + server->ops->is_status_pending(buf, server, 0)) {
    + discard_remaining_data(server);
    + return -1;
    + }
    +
    /* Was the SMB read successful? */
    rdata->result = server->ops->map_error(buf, false);
    if (rdata->result != 0) {
    --
    2.7.0
    \
     
     \ /
      Last update: 2016-03-16 22:01    [W:2.839 / U:0.248 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site