[CIFS] redo existing session setup if needed in cifs_mount
When cifs_mount finds an existing SMB session that it can use for a new mount, it does not check to see whether that session is in need of being reconnected. An easy way to reproduce: 1) mount //server/share1 2) watch /proc/fs/cifs/DebugData for the share to go DISCONNECTED 3) mount //server/share2 with same creds as in step 1. The second mount will fail because CIFSTCon returned -EAGAIN. If you do an operation in share1 and then reattempt the mount it will work (since the session is reestablished). The following patch fixes this by having cifs_mount check the status of the session when it picks an existing session and calling cifs_setup_session on it again if it's in need of reconnection. Thanks to Wojciech Pilorz for the initial bug report. Signed-off-by: Jeff Layton <jlayton@tupile.poochiereds.net> Signed-off-by: Steve French <sfrench@us.ibm.com>
This commit is contained in:
committed by
Steve French
parent
05b3de63da
commit
1d9a8852c3
@@ -3,7 +3,8 @@ Version 1.52
|
|||||||
Fix oops on second mount to server when null auth is used.
|
Fix oops on second mount to server when null auth is used.
|
||||||
Enable experimental Kerberos support. Return writebehind errors on flush
|
Enable experimental Kerberos support. Return writebehind errors on flush
|
||||||
and sync so that events like out of disk space get reported properly on
|
and sync so that events like out of disk space get reported properly on
|
||||||
cached files. Fix setxattr failure to certain Samba versions.
|
cached files. Fix setxattr failure to certain Samba versions. Fix mount
|
||||||
|
of second share to disconnected server session (autoreconnect on this).
|
||||||
|
|
||||||
Version 1.51
|
Version 1.51
|
||||||
------------
|
------------
|
||||||
|
@@ -1964,7 +1964,15 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
|
|||||||
|
|
||||||
if (existingCifsSes) {
|
if (existingCifsSes) {
|
||||||
pSesInfo = existingCifsSes;
|
pSesInfo = existingCifsSes;
|
||||||
cFYI(1, ("Existing smb sess found"));
|
cFYI(1, ("Existing smb sess found (status=%d)",
|
||||||
|
pSesInfo->status));
|
||||||
|
if (pSesInfo->status == CifsNeedReconnect) {
|
||||||
|
cFYI(1, ("Session needs reconnect"));
|
||||||
|
down(&pSesInfo->sesSem);
|
||||||
|
rc = cifs_setup_session(xid, pSesInfo,
|
||||||
|
cifs_sb->local_nls);
|
||||||
|
up(&pSesInfo->sesSem);
|
||||||
|
}
|
||||||
} else if (!rc) {
|
} else if (!rc) {
|
||||||
cFYI(1, ("Existing smb sess not found"));
|
cFYI(1, ("Existing smb sess not found"));
|
||||||
pSesInfo = sesInfoAlloc();
|
pSesInfo = sesInfoAlloc();
|
||||||
|
Reference in New Issue
Block a user