[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);