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