Commit 0468a2cf authored by Jeff Layton's avatar Jeff Layton Committed by Steve French

cifs: take module reference when starting cifsd

cifsd can outlive the last cifs mount. We need to hold a module
reference until it exits to prevent someone from unplugging
the module until we're ready.
Signed-off-by: default avatarJeff Layton <jlayton@redhat.com>
Signed-off-by: default avatarSteve French <sfrench@us.ibm.com>
parent 80909022
...@@ -776,7 +776,7 @@ multi_t2_fnd: ...@@ -776,7 +776,7 @@ multi_t2_fnd:
set_current_state(TASK_RUNNING); set_current_state(TASK_RUNNING);
} }
return 0; module_put_and_exit(0);
} }
/* extract the host portion of the UNC string */ /* extract the host portion of the UNC string */
...@@ -2176,10 +2176,17 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, ...@@ -2176,10 +2176,17 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
so no need to spinlock this init of tcpStatus */ so no need to spinlock this init of tcpStatus */
srvTcp->tcpStatus = CifsNew; srvTcp->tcpStatus = CifsNew;
init_MUTEX(&srvTcp->tcpSem); init_MUTEX(&srvTcp->tcpSem);
/*
* since we're in a cifs function already, we know that
* this will succeed. No need for try_module_get().
*/
__module_get(THIS_MODULE);
srvTcp->tsk = kthread_run((void *)(void *)cifs_demultiplex_thread, srvTcp, "cifsd"); srvTcp->tsk = kthread_run((void *)(void *)cifs_demultiplex_thread, srvTcp, "cifsd");
if (IS_ERR(srvTcp->tsk)) { if (IS_ERR(srvTcp->tsk)) {
rc = PTR_ERR(srvTcp->tsk); rc = PTR_ERR(srvTcp->tsk);
cERROR(1, ("error %d create cifsd thread", rc)); cERROR(1, ("error %d create cifsd thread", rc));
module_put(THIS_MODULE);
srvTcp->tsk = NULL; srvTcp->tsk = NULL;
sock_release(csocket); sock_release(csocket);
kfree(srvTcp->hostname); kfree(srvTcp->hostname);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment