|
@@ -2242,6 +2242,8 @@ cifs_find_smb_ses(struct TCP_Server_Info *server, struct smb_vol *vol)
|
|
|
|
|
|
spin_lock(&cifs_tcp_ses_lock);
|
|
|
list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) {
|
|
|
+ if (ses->status == CifsExiting)
|
|
|
+ continue;
|
|
|
if (!match_session(ses, vol))
|
|
|
continue;
|
|
|
++ses->ses_count;
|
|
@@ -2255,24 +2257,37 @@ cifs_find_smb_ses(struct TCP_Server_Info *server, struct smb_vol *vol)
|
|
|
static void
|
|
|
cifs_put_smb_ses(struct cifs_ses *ses)
|
|
|
{
|
|
|
- unsigned int xid;
|
|
|
+ unsigned int rc, xid;
|
|
|
struct TCP_Server_Info *server = ses->server;
|
|
|
|
|
|
cifs_dbg(FYI, "%s: ses_count=%d\n", __func__, ses->ses_count);
|
|
|
+
|
|
|
spin_lock(&cifs_tcp_ses_lock);
|
|
|
+ if (ses->status == CifsExiting) {
|
|
|
+ spin_unlock(&cifs_tcp_ses_lock);
|
|
|
+ return;
|
|
|
+ }
|
|
|
if (--ses->ses_count > 0) {
|
|
|
spin_unlock(&cifs_tcp_ses_lock);
|
|
|
return;
|
|
|
}
|
|
|
-
|
|
|
- list_del_init(&ses->smb_ses_list);
|
|
|
+ if (ses->status == CifsGood)
|
|
|
+ ses->status = CifsExiting;
|
|
|
spin_unlock(&cifs_tcp_ses_lock);
|
|
|
|
|
|
- if (ses->status == CifsGood && server->ops->logoff) {
|
|
|
+ if (ses->status == CifsExiting && server->ops->logoff) {
|
|
|
xid = get_xid();
|
|
|
- server->ops->logoff(xid, ses);
|
|
|
+ rc = server->ops->logoff(xid, ses);
|
|
|
+ if (rc)
|
|
|
+ cifs_dbg(VFS, "%s: Session Logoff failure rc=%d\n",
|
|
|
+ __func__, rc);
|
|
|
_free_xid(xid);
|
|
|
}
|
|
|
+
|
|
|
+ spin_lock(&cifs_tcp_ses_lock);
|
|
|
+ list_del_init(&ses->smb_ses_list);
|
|
|
+ spin_unlock(&cifs_tcp_ses_lock);
|
|
|
+
|
|
|
sesInfoFree(ses);
|
|
|
cifs_put_tcp_session(server);
|
|
|
}
|