[dm-devel] race bugs

Benjamin Marzinski bmarzins at redhat.com
Mon Jul 18 22:56:04 UTC 2005


I was looking at the waitevent thread, and I noticed some issues. Since the
cancellation type is asynchronous, the thread can get cancelled at any
moment. This can cause bugs. For instance, the double removal of the dm task
structure that just got fixed can still show up if the thread were cancelled
after it was freed but before it was set to NULL, there were other issues
like this in update_multpath. It seems like the easiest way to fix this is to
set some defined cancellation points. So that's what this does.


-Ben
-------------- next part --------------
diff -urpN mp-devel/multipathd/main.c mp-devel-patched/multipathd/main.c
--- mp-devel/multipathd/main.c	2005-07-18 10:21:17.000000000 -0500
+++ mp-devel-patched/multipathd/main.c	2005-07-18 17:52:46.385426160 -0500
@@ -350,7 +350,6 @@ waiteventloop (struct event_thread * wai
 
 	dm_task_no_open_count(waiter->dmt);
 
-	pthread_testcancel();
 	dm_task_run(waiter->dmt);
 	pthread_testcancel();
 	dm_task_destroy(waiter->dmt);
@@ -404,7 +403,6 @@ waitevent (void * et)
 	mlockall(MCL_CURRENT | MCL_FUTURE);
 
 	waiter = (struct event_thread *)et;
-	pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
 	pthread_cleanup_push(free_waiter, et);
 
 	while (1) {
@@ -413,7 +411,9 @@ waitevent (void * et)
 		if (r < 0)
 			break;
 
+		pthread_testcancel();
 		sleep(r);
+		pthread_testcancel();
 	}
 
 	pthread_cleanup_pop(1);


More information about the dm-devel mailing list