diff options
Diffstat (limited to 'fs/cifs/connect.c')
-rw-r--r-- | fs/cifs/connect.c | 35 |
1 files changed, 7 insertions, 28 deletions
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c index 8813ff7..a279ffc 100644 --- a/fs/cifs/connect.c +++ b/fs/cifs/connect.c @@ -2242,8 +2242,6 @@ 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; @@ -2257,37 +2255,24 @@ 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 rc, xid; + unsigned int 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; } - if (ses->status == CifsGood) - ses->status = CifsExiting; + + list_del_init(&ses->smb_ses_list); spin_unlock(&cifs_tcp_ses_lock); - if (ses->status == CifsExiting && server->ops->logoff) { + if (ses->status == CifsGood && server->ops->logoff) { xid = get_xid(); - rc = server->ops->logoff(xid, ses); - if (rc) - cifs_dbg(VFS, "%s: Session Logoff failure rc=%d\n", - __func__, rc); + server->ops->logoff(xid, ses); _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); } @@ -3770,13 +3755,6 @@ CIFSTCon(const unsigned int xid, struct cifs_ses *ses, return rc; } -static void delayed_free(struct rcu_head *p) -{ - struct cifs_sb_info *sbi = container_of(p, struct cifs_sb_info, rcu); - unload_nls(sbi->local_nls); - kfree(sbi); -} - void cifs_umount(struct cifs_sb_info *cifs_sb) { @@ -3801,7 +3779,8 @@ cifs_umount(struct cifs_sb_info *cifs_sb) bdi_destroy(&cifs_sb->bdi); kfree(cifs_sb->mountdata); - call_rcu(&cifs_sb->rcu, delayed_free); + unload_nls(cifs_sb->local_nls); + kfree(cifs_sb); } int |