diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
index c7d341714586fdfc9086c381dc310fe81a371237..701daf411a4bb7e3a63d3085b8fb0453d025f6e0 100644
--- a/fs/cifs/connect.c
+++ b/fs/cifs/connect.c
@@ -776,7 +776,7 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server)
 		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);