[DRBD-cvs] drbd by phil; * Changed the way asender() receives sig...

drbd-user@lists.linbit.com drbd-user@lists.linbit.com
Thu, 6 May 2004 13:53:05 +0200 (CEST)


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:
* Changed the way asender() receives signals. It no longer gets 
  signals while it sends something
* Another fix to drbd_thread_start() 
* Another fix to drbd_get_ee()

===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_int.h,v
retrieving revision 1.58.2.158
retrieving revision 1.58.2.159
diff -u -3 -r1.58.2.158 -r1.58.2.159
--- drbd_int.h	5 May 2004 17:07:02 -0000	1.58.2.158
+++ drbd_int.h	6 May 2004 11:53:00 -0000	1.58.2.159
@@ -576,6 +576,7 @@
 // bitfield? enum?
 /* flag bits */
 #define ISSUE_BARRIER      0
+#define SIGNAL_ASENDER     1
 #define SEND_PING          2
 #define WRITER_PRESENT     3
 #define STOP_SYNC_TIMER    4
@@ -1062,7 +1063,7 @@
 }
 
 static inline void wake_asender(drbd_dev *mdev) {
-	if(mdev->asender.task) { // could be wrong if asender just terminated.
+	if(test_bit(SIGNAL_ASENDER, &mdev->flags)) {
 		force_sig(DRBD_SIG, mdev->asender.task);
 	}
 }
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_main.c,v
retrieving revision 1.73.2.162
retrieving revision 1.73.2.163
diff -u -3 -r1.73.2.162 -r1.73.2.163
--- drbd_main.c	5 May 2004 17:07:02 -0000	1.73.2.162
+++ drbd_main.c	6 May 2004 11:53:00 -0000	1.73.2.163
@@ -413,10 +413,9 @@
 	int retval;
 
 	drbd_daemonize();
-	D_ASSERT(get_t_state(thi) == None);
+	D_ASSERT(get_t_state(thi) == Running);
 	D_ASSERT(thi->task == NULL);
 	thi->task = current;
-	thi->t_state = Running;
 	smp_mb();
 	complete(&thi->startstop); // notify: thi->task is set.
 
@@ -462,7 +461,7 @@
 
 	if (thi->t_state == None) {
 		D_ASSERT(thi->task == NULL);
-		// XXX D_ASSERT( thi->startstop something ? )
+		thi->t_state = Running;
 		spin_unlock(&thi->t_lock);
 
 		pid = kernel_thread(drbd_thread_setup, (void *) thi, CLONE_FS);
@@ -591,7 +590,7 @@
 	} else
 		down(&mdev->meta.mutex);
 
-	old_blocked = block_sigs_but(DRBD_SHUTDOWNSIGMASK);
+	old_blocked = block_sigs_but(0);
 	ok = _drbd_send_cmd(mdev,sock,cmd,h,size,0);
 	restore_old_sigset(old_blocked);
 
@@ -899,7 +898,7 @@
 	 * This one may be interupted by DRBD_SIG and/or DRBD_SIGKILL
 	 * in response to ioctl or module unload.
 	 */
-	old_blocked = block_sigs_but(DRBD_SHUTDOWNSIGMASK);
+	old_blocked = block_sigs_but(0);
 	down(&mdev->data.mutex);
 	spin_lock(&mdev->send_task_lock);
 	mdev->send_task=current;
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_receiver.c,v
retrieving revision 1.97.2.144
retrieving revision 1.97.2.145
diff -u -3 -r1.97.2.144 -r1.97.2.145
--- drbd_receiver.c	6 May 2004 09:49:33 -0000	1.97.2.144
+++ drbd_receiver.c	6 May 2004 11:53:00 -0000	1.97.2.145
@@ -272,12 +272,12 @@
 			      mdev->conf.max_buffers ) {
 				if(drbd_alloc_ee(mdev,GFP_TRY)) break;
 			}
-			drbd_kick_lo(mdev);
 			spin_unlock_irq(&mdev->ee_lock);
+			drbd_kick_lo(mdev);
 			schedule();
 			spin_lock_irq(&mdev->ee_lock);
+			finish_wait(&mdev->al_wait, &wait);
 			if (signal_pending(current)) return 0;
-			finish_wait(&mdev->al_wait, &wait); 
 			// finish wait is inside, so that we are TASK_RUNNING 
 			// in _drbd_process_ee (which might sleep by itself.)
 			_drbd_process_ee(mdev,&mdev->done_ee);
@@ -1747,10 +1747,16 @@
 				mdev->conf.timeout*HZ/20;
 		}
 
+		set_bit(SIGNAL_ASENDER, &mdev->flags);
+
 		if (!drbd_process_ee(mdev,&mdev->done_ee)) goto err;
 
 		rv = drbd_recv_short(mdev,buf,expect-received);
 
+		clear_bit(SIGNAL_ASENDER, &mdev->flags);
+
+		drbd_flush_signals(current);
+
 		/* Note:
 		 * -EINTR        (on meta) we got a signal
 		 * -EAGAIN       (on meta) rcvtimeo expired
@@ -1776,8 +1782,6 @@
 			set_bit(SEND_PING,&mdev->flags);
 			continue;
 		} else if (rv == -EINTR) {
-			drbd_flush_signals(current);
-			// Do something on signal ??
 			continue;
 		} else {
 			ERR("sock_recvmsg returned %d\n", rv);
@@ -1813,6 +1817,7 @@
 
 	if(0) {
 	err:
+		clear_bit(SIGNAL_ASENDER, &mdev->flags);
 		if (mdev->cstate >= Connected)
 			set_cstate(mdev,NetworkFailure);
 		drbd_thread_restart_nowait(&mdev->receiver);