[DRBD-cvs] drbd by phil; * Removed the "collect_zombies" logic, a...

drbd-user@lists.linbit.com drbd-user@lists.linbit.com
Tue, 2 Mar 2004 14:15:46 +0100 (CET)


DRBD CVS committal

Author  : phil
Module  : drbd

Dir     : drbd/drbd


Modified Files:
      Tag: rel-0_7-branch
	drbd_int.h drbd_main.c drbd_receiver.c 


Log Message:
* Removed the "collect_zombies" logic, and replaced this with 
  reparent_to_init() [The waitpid approach does not work on AMD64]
* Corrected the [un]register_ioctl32_conversion() calls. (Yes,
  currently I have a Opteron based cluster here.)

===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_int.h,v
retrieving revision 1.58.2.128
retrieving revision 1.58.2.129
diff -u -3 -r1.58.2.128 -r1.58.2.129
--- drbd_int.h	18 Feb 2004 12:21:17 -0000	1.58.2.128
+++ drbd_int.h	2 Mar 2004 13:15:40 -0000	1.58.2.129
@@ -533,7 +533,6 @@
 // bitfield? enum?
 /* flag bits */
 #define ISSUE_BARRIER      0
-#define COLLECT_ZOMBIES    1
 #define SEND_PING          2
 #define WRITER_PRESENT     3
 #define STOP_SYNC_TIMER    4
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_main.c,v
retrieving revision 1.73.2.133
retrieving revision 1.73.2.134
diff -u -3 -r1.73.2.133 -r1.73.2.134
--- drbd_main.c	18 Feb 2004 15:42:32 -0000	1.73.2.133
+++ drbd_main.c	2 Mar 2004 13:15:40 -0000	1.73.2.134
@@ -382,19 +382,43 @@
 	}
 }
 
+/* If reparent_to_init() would be exported, we could use the kernel's
+   version .... so we have to maintain our own copy of it.
+ */
+STATIC void drbd_reparent_to_init(void)
+{
+	struct task_struct *child_reaper;
+
+	child_reaper = find_task_by_pid(1);
+
+        write_lock_irq(&tasklist_lock);
+
+        REMOVE_LINKS(current);
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
+        current->parent = child_reaper;
+        current->real_parent = child_reaper;
+#else
+        current->p_pptr = child_reaper;
+        current->p_opptr = child_reaper;
+#endif
+        SET_LINKS(current);
+        current->exit_signal = SIGCHLD;
+        write_unlock_irq(&tasklist_lock);
+}
+
 STATIC int drbd_thread_setup(void* arg)
 {
 	struct Drbd_thread *thi = (struct Drbd_thread *) arg;
 	int retval;
 
+	drbd_reparent_to_init();
 	drbd_daemonize();
-
 	down(&thi->mutex); //ensures that thi->task is set.
 
 	retval = thi->function(thi);
 
 	thi->task = 0;
-	set_bit(COLLECT_ZOMBIES,&(thi->mdev->flags));
+
 	up(&thi->mutex); //allow thread_stop to proceed
 
 	return retval;
@@ -440,8 +464,6 @@
 	    || thi->task->state == TASK_ZOMBIE
 	    || thi->task->flags & PF_EXITING   ) {
 		// unexpected death... clean up.
-		if (thi->mdev)
-			set_bit(COLLECT_ZOMBIES,&thi->mdev->flags);
 		init_MUTEX(&thi->mutex);
 		thi->task = NULL;
 		return;
@@ -1412,18 +1434,19 @@
 #if defined(CONFIG_PPC64) || defined(CONFIG_SPARC64) || defined(CONFIG_X86_64)
 	// tell the kernel that we think our ioctls are 64bit clean
 	lock_kernel();
-	register_ioctl32_conversion(DRBD_IOCTL_GET_CONFIG,NULL);
 	register_ioctl32_conversion(DRBD_IOCTL_GET_VERSION,NULL);
-	register_ioctl32_conversion(DRBD_IOCTL_INVALIDATE,NULL);
-	register_ioctl32_conversion(DRBD_IOCTL_INVALIDATE_REM,NULL);
+	register_ioctl32_conversion(DRBD_IOCTL_SET_STATE,NULL);
 	register_ioctl32_conversion(DRBD_IOCTL_SET_DISK_CONFIG,NULL);
-	register_ioctl32_conversion(DRBD_IOCTL_SET_DISK_SIZE,NULL);
 	register_ioctl32_conversion(DRBD_IOCTL_SET_NET_CONFIG,NULL);
-	register_ioctl32_conversion(DRBD_IOCTL_SET_STATE,NULL);
-	register_ioctl32_conversion(DRBD_IOCTL_SET_SYNC_CONFIG,NULL);
 	register_ioctl32_conversion(DRBD_IOCTL_UNCONFIG_NET,NULL);
+	register_ioctl32_conversion(DRBD_IOCTL_GET_CONFIG,NULL);
+	register_ioctl32_conversion(DRBD_IOCTL_INVALIDATE,NULL);
+	register_ioctl32_conversion(DRBD_IOCTL_INVALIDATE_REM,NULL);
+	register_ioctl32_conversion(DRBD_IOCTL_SET_SYNC_CONFIG,NULL);
+	register_ioctl32_conversion(DRBD_IOCTL_SET_DISK_SIZE,NULL);
 	register_ioctl32_conversion(DRBD_IOCTL_WAIT_CONNECT,NULL);
 	register_ioctl32_conversion(DRBD_IOCTL_WAIT_SYNC,NULL);
+	register_ioctl32_conversion(DRBD_IOCTL_UNCONFIG_DISK,NULL);
 	unlock_kernel();
 #endif
 
@@ -1484,18 +1507,19 @@
 
 #if defined(CONFIG_PPC64) || defined(CONFIG_SPARC64) || defined(CONFIG_X86_64)
 	lock_kernel();
-	unregister_ioctl32_conversion(DRBD_IOCTL_GET_CONFIG);
 	unregister_ioctl32_conversion(DRBD_IOCTL_GET_VERSION);
-	unregister_ioctl32_conversion(DRBD_IOCTL_INVALIDATE);
-	unregister_ioctl32_conversion(DRBD_IOCTL_INVALIDATE_REM);
+	unregister_ioctl32_conversion(DRBD_IOCTL_SET_STATE);
 	unregister_ioctl32_conversion(DRBD_IOCTL_SET_DISK_CONFIG);
-	unregister_ioctl32_conversion(DRBD_IOCTL_SET_DISK_SIZE);
 	unregister_ioctl32_conversion(DRBD_IOCTL_SET_NET_CONFIG);
-	unregister_ioctl32_conversion(DRBD_IOCTL_SET_STATE);
-	unregister_ioctl32_conversion(DRBD_IOCTL_SET_SYNC_CONFIG);
 	unregister_ioctl32_conversion(DRBD_IOCTL_UNCONFIG_NET);
+	unregister_ioctl32_conversion(DRBD_IOCTL_GET_CONFIG);
+	unregister_ioctl32_conversion(DRBD_IOCTL_INVALIDATE);
+	unregister_ioctl32_conversion(DRBD_IOCTL_INVALIDATE_REM);
+	unregister_ioctl32_conversion(DRBD_IOCTL_SET_SYNC_CONFIG);
+	unregister_ioctl32_conversion(DRBD_IOCTL_SET_DISK_SIZE);
 	unregister_ioctl32_conversion(DRBD_IOCTL_WAIT_CONNECT);
 	unregister_ioctl32_conversion(DRBD_IOCTL_WAIT_SYNC);
+	unregister_ioctl32_conversion(DRBD_IOCTL_UNCONFIG_DISK);
 	unlock_kernel();
 #endif
 
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_receiver.c,v
retrieving revision 1.97.2.113
retrieving revision 1.97.2.114
diff -u -3 -r1.97.2.113 -r1.97.2.114
--- drbd_receiver.c	18 Feb 2004 15:42:32 -0000	1.97.2.113
+++ drbd_receiver.c	2 Mar 2004 13:15:40 -0000	1.97.2.114
@@ -1325,13 +1325,6 @@
 	return ok;
 }
 
-STATIC void drbd_collect_zombies(drbd_dev *mdev)
-{
-	if(test_and_clear_bit(COLLECT_ZOMBIES,&mdev->flags)) {
-		while( waitpid(-1, NULL, __WCLONE|WNOHANG) > 0 );
-	}
-}
-
 STATIC void drbd_fail_pending_reads(drbd_dev *mdev)
 {
 	struct list_head workset,*le;
@@ -1478,7 +1471,6 @@
 	Drbd_Header *header = &mdev->data.rbuf.head;
 
 	for (;;) {
-		drbd_collect_zombies(mdev); // in case a syncer exited.
 		if (!drbd_recv_header(mdev,header))
 			break;
 
@@ -1530,7 +1522,6 @@
 	up(&mdev->data.mutex);
 
 	drbd_thread_stop(&mdev->worker);
-	drbd_collect_zombies(mdev);
 
 	if(mdev->cstate != StandAlone)
 		set_cstate(mdev,Unconnected);