lkml.org 
[lkml]   [2022]   [Jun]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.17 720/772] ksmbd: fix outstanding credits related bugs
    Date
    From: Hyunchul Lee <hyc.lee@gmail.com>

    commit 376b9133826865568167b4091ef92a68c4622b87 upstream.

    outstanding credits must be initialized to 0,
    because it means the sum of credits consumed by
    in-flight requests.
    And outstanding credits must be compared with
    total credits in smb2_validate_credit_charge(),
    because total credits are the sum of credits
    granted by ksmbd.

    This patch fix the following error,
    while frametest with Windows clients:

    Limits exceeding the maximum allowable outstanding requests,
    given : 128, pending : 8065

    Fixes: b589f5db6d4a ("ksmbd: limits exceeding the maximum allowable outstanding requests")
    Cc: stable@vger.kernel.org
    Signed-off-by: Hyunchul Lee <hyc.lee@gmail.com>
    Reported-by: Yufan Chen <wiz.chen@gmail.com>
    Tested-by: Yufan Chen <wiz.chen@gmail.com>
    Acked-by: Namjae Jeon <linkinjeon@kernel.org>
    Signed-off-by: Steve French <stfrench@microsoft.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    fs/ksmbd/connection.c | 2 +-
    fs/ksmbd/smb2misc.c | 2 +-
    fs/ksmbd/smb_common.c | 4 +++-
    3 files changed, 5 insertions(+), 3 deletions(-)

    --- a/fs/ksmbd/connection.c
    +++ b/fs/ksmbd/connection.c
    @@ -62,7 +62,7 @@ struct ksmbd_conn *ksmbd_conn_alloc(void
    atomic_set(&conn->req_running, 0);
    atomic_set(&conn->r_count, 0);
    conn->total_credits = 1;
    - conn->outstanding_credits = 1;
    + conn->outstanding_credits = 0;

    init_waitqueue_head(&conn->req_running_q);
    INIT_LIST_HEAD(&conn->conns_list);
    --- a/fs/ksmbd/smb2misc.c
    +++ b/fs/ksmbd/smb2misc.c
    @@ -338,7 +338,7 @@ static int smb2_validate_credit_charge(s
    ret = 1;
    }

    - if ((u64)conn->outstanding_credits + credit_charge > conn->vals->max_credits) {
    + if ((u64)conn->outstanding_credits + credit_charge > conn->total_credits) {
    ksmbd_debug(SMB, "Limits exceeding the maximum allowable outstanding requests, given : %u, pending : %u\n",
    credit_charge, conn->outstanding_credits);
    ret = 1;
    --- a/fs/ksmbd/smb_common.c
    +++ b/fs/ksmbd/smb_common.c
    @@ -140,8 +140,10 @@ int ksmbd_verify_smb_message(struct ksmb

    hdr = work->request_buf;
    if (*(__le32 *)hdr->Protocol == SMB1_PROTO_NUMBER &&
    - hdr->Command == SMB_COM_NEGOTIATE)
    + hdr->Command == SMB_COM_NEGOTIATE) {
    + work->conn->outstanding_credits++;
    return 0;
    + }

    return -EINVAL;
    }

    \
     
     \ /
      Last update: 2022-06-07 23:51    [W:4.148 / U:0.520 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site