Re: [PATCH] smb: client: fix hang in wait_for_response() for negproto

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

 



when I tried this - it took much longer than expected to time out.
How long do you expect mount to hang with your patch?

On Sat, Aug 31, 2024 at 8:47 PM Paulo Alcantara <pc@xxxxxxxxxxxxx> wrote:
>
> Call cifs_reconnect() to wake up processes waiting on negotiate
> protocol to handle the case where server abruptly shut down and had no
> chance to properly close the socket.
>
> Simple reproducer:
>
>   ssh 192.168.2.100 pkill -STOP smbd
>   mount.cifs //192.168.2.100/test /mnt -o ... [never returns]
>
> Cc: Rickard Andersson <rickaran@xxxxxxxx>
> Signed-off-by: Paulo Alcantara (Red Hat) <pc@xxxxxxxxxxxxx>
> ---
>  fs/smb/client/connect.c | 14 +++++++++++++-
>  1 file changed, 13 insertions(+), 1 deletion(-)
>
> diff --git a/fs/smb/client/connect.c b/fs/smb/client/connect.c
> index c1c14274930a..e004b515e321 100644
> --- a/fs/smb/client/connect.c
> +++ b/fs/smb/client/connect.c
> @@ -656,6 +656,19 @@ allocate_buffers(struct TCP_Server_Info *server)
>  static bool
>  server_unresponsive(struct TCP_Server_Info *server)
>  {
> +       /*
> +        * If we're in the process of mounting a share or reconnecting a session
> +        * and the server abruptly shut down (e.g. socket wasn't closed properly),
> +        * wait for at least an echo interval (+7s from rcvtimeo) when attempting
> +        * to negotiate protocol.
> +        */
> +       spin_lock(&server->srv_lock);
> +       if (server->tcpStatus == CifsInNegotiate &&
> +           time_after(jiffies, server->lstrp + server->echo_interval)) {
> +               spin_unlock(&server->srv_lock);
> +               cifs_reconnect(server, false);
> +               return true;
> +       }
>         /*
>          * We need to wait 3 echo intervals to make sure we handle such
>          * situations right:
> @@ -667,7 +680,6 @@ server_unresponsive(struct TCP_Server_Info *server)
>          * 65s kernel_recvmsg times out, and we see that we haven't gotten
>          *     a response in >60s.
>          */
> -       spin_lock(&server->srv_lock);
>         if ((server->tcpStatus == CifsGood ||
>             server->tcpStatus == CifsNeedNegotiate) &&
>             (!server->ops->can_echo || server->ops->can_echo(server)) &&
> --
> 2.46.0
>


-- 
Thanks,

Steve





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

  Powered by Linux