lkml.org 
[lkml]   [2016]   [Mar]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.2.y-ckt 35/98] CIFS: Fix SMB2+ interim response processing for read requests
    Date
    4.2.8-ckt6 -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 672ef35..5a6f639 100644
    --- a/fs/cifs/cifssmb.c
    +++ b/fs/cifs/cifssmb.c
    @@ -1394,11 +1394,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;
    @@ -1412,10 +1411,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)
    {
    @@ -1444,6 +1453,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 01:41    [W:4.210 / U:0.144 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site