diff options
| author | Shyam Prasad N <[email protected]> | 2023-06-09 17:46:54 +0000 | 
|---|---|---|
| committer | Steve French <[email protected]> | 2023-06-11 20:52:48 -0500 | 
| commit | 91f4480c41f56f7c723323cf7f581f1d95d9ffbc (patch) | |
| tree | d67702910335ed217ddcfa87c7162c78a4f4eb83 | |
| parent | a5998a9ec3c03297a5b7f3df5c1979cd469a0da3 (diff) | |
cifs: fix status checks in cifs_tree_connect
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")
Cc: [email protected] # 6.3
Signed-off-by: Shyam Prasad N <[email protected]>
Signed-off-by: Steve French <[email protected]>
| -rw-r--r-- | fs/smb/client/connect.c | 9 | ||||
| -rw-r--r-- | 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); |