Skip to contentSkip to conversation

CIFS oops

PATCH New Maciej Babinski 1 participant 1 message Jun 9, 2003

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 CIFS oops

This patch fixes a non-critical oops that occurs when the cifs module is removed from the kernel. It uses the completion.h mechanism to ensure that the cifsoplockd kernel thread exits before the module is unloaded.

-- Maciej Babinski

fs/cifs/cifsfs.c +13 -6
@@ -62,6 +62,8 @@
 void cifs_proc_init(void);
 void cifs_proc_clean(void);
 
+static DECLARE_COMPLETION(cifsoplock_exited);
+
 static int
 cifs_read_super(struct super_block *sb, void *data,
 		const char *devname, int silent)
@@ -423,7 +425,8 @@
 		       "cifs_destroy_mids: error not all structures were freed\n");
 	if (kmem_cache_destroy(cifs_oplock_cachep))
 		printk(KERN_WARNING
-		       "error not all oplock structures were freed\n");}
+		       "error not all oplock structures were freed\n");
+}
 
 static int cifs_oplock_thread(void * dummyarg)
 {
@@ -435,10 +438,10 @@
 	int rc;
 
 	daemonize("cifsoplockd");
-	allow_signal(SIGKILL);
+	allow_signal(SIGTERM);
 
 	oplockThread = current;
-	while (1) {
+	do {
 		set_current_state(TASK_INTERRUPTIBLE);
 		schedule_timeout(100*HZ);
 		/* BB add missing code */
@@ -466,7 +469,9 @@
 		}
 		write_unlock(&GlobalMid_Lock);
 		cFYI(1,("next time through while loop")); /* BB remove */
-	}
+	} while (!signal_pending(current));
+
+	complete_and_exit (&cifsoplock_exited, 0);
 }
 
 static int __init
@@ -528,8 +533,10 @@
 	cifs_destroy_inodecache();
 	cifs_destroy_mids();
 	cifs_destroy_request_bufs();
-	if(oplockThread)
-		send_sig(SIGKILL, oplockThread, 1);
+	if(oplockThread) {
+		send_sig(SIGTERM, oplockThread, 1);
+		wait_for_completion(&cifsoplock_exited);
+	}
 }
 
 MODULE_AUTHOR("Steve French <[email protected]>");