cifs: take module reference when starting cifsd
authorJeff Layton <jlayton@redhat.com>
Mon, 1 Dec 2008 12:09:35 +0000 (07:09 -0500)
committerSteve French <sfrench@us.ibm.com>
Fri, 26 Dec 2008 02:29:09 +0000 (02:29 +0000)
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@redhat.com>
Signed-off-by: Steve French <sfrench@us.ibm.com>
fs/cifs/connect.c

index c7d341714586fdfc9086c381dc310fe81a371237..701daf411a4bb7e3a63d3085b8fb0453d025f6e0 100644 (file)
@@ -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 */
@@ -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 */
                        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);