Re: [PATCH 1/6] cifs: fix status checks in cifs_tree_connect

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

 



tentatively merged into cifs-2.6.git for-next

On Fri, Jun 9, 2023 at 12:47 PM Shyam Prasad N <nspmangalore@xxxxxxxxx> wrote:
>
> The ordering of status checks at the beginning of
> cifs_tree_connect is wrong. As a result, a tcon
> which is good may stay marked as needing reconnect
> infinitely.
>
> Fixes: 2f0e4f034220 ("cifs: check only tcon status on tcon related functions")
> Signed-off-by: Shyam Prasad N <sprasad@xxxxxxxxxxxxx>
> ---
>  fs/smb/client/connect.c | 9 +++++----
>  fs/smb/client/dfs.c     | 9 +++++----
>  2 files changed, 10 insertions(+), 8 deletions(-)
>
> diff --git a/fs/smb/client/connect.c b/fs/smb/client/connect.c
> index 8e9a672320ab..1250d156619b 100644
> --- a/fs/smb/client/connect.c
> +++ b/fs/smb/client/connect.c
> @@ -4086,16 +4086,17 @@ int cifs_tree_connect(const unsigned int xid, struct cifs_tcon *tcon, const stru
>
>         /* only send once per connect */
>         spin_lock(&tcon->tc_lock);
> +       if (tcon->status == TID_GOOD) {
> +               spin_unlock(&tcon->tc_lock);
> +               return 0;
> +       }
> +
>         if (tcon->status != TID_NEW &&
>             tcon->status != TID_NEED_TCON) {
>                 spin_unlock(&tcon->tc_lock);
>                 return -EHOSTDOWN;
>         }
>
> -       if (tcon->status == TID_GOOD) {
> -               spin_unlock(&tcon->tc_lock);
> -               return 0;
> -       }
>         tcon->status = TID_IN_TCON;
>         spin_unlock(&tcon->tc_lock);
>
> diff --git a/fs/smb/client/dfs.c b/fs/smb/client/dfs.c
> index 2f93bf8c3325..2390b2fedd6a 100644
> --- a/fs/smb/client/dfs.c
> +++ b/fs/smb/client/dfs.c
> @@ -575,16 +575,17 @@ int cifs_tree_connect(const unsigned int xid, struct cifs_tcon *tcon, const stru
>
>         /* only send once per connect */
>         spin_lock(&tcon->tc_lock);
> +       if (tcon->status == TID_GOOD) {
> +               spin_unlock(&tcon->tc_lock);
> +               return 0;
> +       }
> +
>         if (tcon->status != TID_NEW &&
>             tcon->status != TID_NEED_TCON) {
>                 spin_unlock(&tcon->tc_lock);
>                 return -EHOSTDOWN;
>         }
>
> -       if (tcon->status == TID_GOOD) {
> -               spin_unlock(&tcon->tc_lock);
> -               return 0;
> -       }
>         tcon->status = TID_IN_TCON;
>         spin_unlock(&tcon->tc_lock);
>
> --
> 2.34.1
>


-- 
Thanks,

Steve




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

  Powered by Linux