[linux-cifs-client] [PATCH 5/5] cifs: take module reference when starting cifsd

Jeff Layton jlayton at redhat.com
Mon Nov 24 16:19:58 GMT 2008


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: Jeff Layton <jlayton at redhat.com>
---
 fs/cifs/connect.c |    9 ++++++++-
 1 files changed, 8 insertions(+), 1 deletions(-)

diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
index 5ae261d..8fcb71d 100644
--- a/fs/cifs/connect.c
+++ b/fs/cifs/connect.c
@@ -776,7 +776,7 @@ multi_t2_fnd:
 		set_current_state(TASK_RUNNING);
 	}
 
-	return 0;
+	module_put_and_exit(0);
 }
 
 /* extract the host portion of the UNC string */
@@ -2184,10 +2184,17 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
 			so no need to spinlock this init of tcpStatus */
 			srvTcp->tcpStatus = CifsNew;
 			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");
 			if (IS_ERR(srvTcp->tsk)) {
 				rc = PTR_ERR(srvTcp->tsk);
 				cERROR(1, ("error %d create cifsd thread", rc));
+				module_put(THIS_MODULE);
 				srvTcp->tsk = NULL;
 				sock_release(csocket);
 				kfree(srvTcp->hostname);
-- 
1.5.5.1



More information about the linux-cifs-client mailing list