lkml.org 
[lkml]   [2021]   [Mar]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.11 040/306] cifs: fix credit accounting for extra channel
    Date
    From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    From: Aurelien Aptel <aaptel@suse.com>

    commit a249cc8bc2e2fed680047d326eb9a50756724198 upstream.

    With multichannel, operations like the queries
    from "ls -lR" can cause all credits to be used and
    errors to be returned since max_credits was not
    being set correctly on the secondary channels and
    thus the client was requesting 0 credits incorrectly
    in some cases (which can lead to not having
    enough credits to perform any operation on that
    channel).

    Signed-off-by: Aurelien Aptel <aaptel@suse.com>
    CC: <stable@vger.kernel.org> # v5.8+
    Reviewed-by: Shyam Prasad N <sprasad@microsoft.com>
    Signed-off-by: Steve French <stfrench@microsoft.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    fs/cifs/connect.c | 10 +++++-----
    fs/cifs/sess.c | 1 +
    2 files changed, 6 insertions(+), 5 deletions(-)

    --- a/fs/cifs/connect.c
    +++ b/fs/cifs/connect.c
    @@ -1405,6 +1405,11 @@ smbd_connected:
    tcp_ses->min_offload = ctx->min_offload;
    tcp_ses->tcpStatus = CifsNeedNegotiate;

    + if ((ctx->max_credits < 20) || (ctx->max_credits > 60000))
    + tcp_ses->max_credits = SMB2_MAX_CREDITS_AVAILABLE;
    + else
    + tcp_ses->max_credits = ctx->max_credits;
    +
    tcp_ses->nr_targets = 1;
    tcp_ses->ignore_signature = ctx->ignore_signature;
    /* thread spawned, put it on the list */
    @@ -2806,11 +2811,6 @@ static int mount_get_conns(struct smb3_f

    *nserver = server;

    - if ((ctx->max_credits < 20) || (ctx->max_credits > 60000))
    - server->max_credits = SMB2_MAX_CREDITS_AVAILABLE;
    - else
    - server->max_credits = ctx->max_credits;
    -
    /* get a reference to a SMB session */
    ses = cifs_get_smb_ses(server, ctx);
    if (IS_ERR(ses)) {
    --- a/fs/cifs/sess.c
    +++ b/fs/cifs/sess.c
    @@ -230,6 +230,7 @@ cifs_ses_add_channel(struct cifs_sb_info
    ctx.noautotune = ses->server->noautotune;
    ctx.sockopt_tcp_nodelay = ses->server->tcp_nodelay;
    ctx.echo_interval = ses->server->echo_interval / HZ;
    + ctx.max_credits = ses->server->max_credits;

    /*
    * This will be used for encoding/decoding user/domain/pw

    \
     
     \ /
      Last update: 2021-03-15 15:10    [W:2.183 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site