summaryrefslogtreecommitdiff
path: root/fs/cifs/connect.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/cifs/connect.c')
-rw-r--r--fs/cifs/connect.c35
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