Message ID | 20200130195251.15789-1-lsahlber@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | cifs: fix soft mounts hanging in the reconnect code | expand |
Added cc:stable and Reviewed-by and merged into cifs-2.6.git for-next On Thu, Jan 30, 2020 at 1:53 PM Ronnie Sahlberg <lsahlber@redhat.com> wrote: > > RHBZ: 1795429 > > In recent DFS updates we have a new variable controlling how many times we will > retry to reconnect the share. > If DFS is not used, then this variable is initialized to 0 in: > > static inline int > dfs_cache_get_nr_tgts(const struct dfs_cache_tgt_list *tl) > { > return tl ? tl->tl_numtgts : 0; > } > > This means that in the reconnect loop in smb2_reconnect() we will immediately wrap retries to -1 > and never actually get to pass this conditional: > > if (--retries) > continue; > > The effect is that we no longer reach the point where we fail the commands with -EHOSTDOWN > and basically the kernel threads are virtually hung and unkillable. > > Fixes: a3a53b7603798fd8 (cifs: Add support for failover in smb2_reconnect()) > Signed-off-by: Ronnie Sahlberg <lsahlber@redhat.com> > --- > fs/cifs/smb2pdu.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c > index 7edba3e6d5e6..14f209f7376f 100644 > --- a/fs/cifs/smb2pdu.c > +++ b/fs/cifs/smb2pdu.c > @@ -312,7 +312,7 @@ smb2_reconnect(__le16 smb2_command, struct cifs_tcon *tcon) > if (server->tcpStatus != CifsNeedReconnect) > break; > > - if (--retries) > + if (retries && --retries) > continue; > > /* > -- > 2.13.6 >
diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c index 7edba3e6d5e6..14f209f7376f 100644 --- a/fs/cifs/smb2pdu.c +++ b/fs/cifs/smb2pdu.c @@ -312,7 +312,7 @@ smb2_reconnect(__le16 smb2_command, struct cifs_tcon *tcon) if (server->tcpStatus != CifsNeedReconnect) break; - if (--retries) + if (retries && --retries) continue; /*
RHBZ: 1795429 In recent DFS updates we have a new variable controlling how many times we will retry to reconnect the share. If DFS is not used, then this variable is initialized to 0 in: static inline int dfs_cache_get_nr_tgts(const struct dfs_cache_tgt_list *tl) { return tl ? tl->tl_numtgts : 0; } This means that in the reconnect loop in smb2_reconnect() we will immediately wrap retries to -1 and never actually get to pass this conditional: if (--retries) continue; The effect is that we no longer reach the point where we fail the commands with -EHOSTDOWN and basically the kernel threads are virtually hung and unkillable. Fixes: a3a53b7603798fd8 (cifs: Add support for failover in smb2_reconnect()) Signed-off-by: Ronnie Sahlberg <lsahlber@redhat.com> --- fs/cifs/smb2pdu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)