Commit:     1d9a8852c365fb7f8db0f8364210138985f457b8
Parent:     05b3de63da2abe804f5dbe0174298bf48949079f
Author:     Jeff Layton <[EMAIL PROTECTED]>
AuthorDate: Mon Dec 31 01:37:11 2007 +0000
Committer:  Steve French <[EMAIL PROTECTED]>
CommitDate: Mon Dec 31 01:37:11 2007 +0000

    [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 <[EMAIL PROTECTED]>
    Signed-off-by: Steve French <[EMAIL PROTECTED]>
 fs/cifs/CHANGES   |    3 ++-
 fs/cifs/connect.c |   10 +++++++++-
 2 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/fs/cifs/CHANGES b/fs/cifs/CHANGES
index 13d788f..0c77876 100644
--- a/fs/cifs/CHANGES
+++ b/fs/cifs/CHANGES
@@ -3,7 +3,8 @@ Version 1.52
 Fix oops on second mount to server when null auth is used.
 Enable experimental Kerberos support.  Return writebehind errors on flush
 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
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
index fd9147c..658f58b 100644
--- a/fs/cifs/connect.c
+++ b/fs/cifs/connect.c
@@ -1964,7 +1964,15 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info 
        if (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) {
                cFYI(1, ("Existing smb sess not found"));
                pSesInfo = sesInfoAlloc();
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at

Reply via email to