[DRBD-cvs] drbd by phil; * In case the peer drops the connection ...
drbd-user@lists.linbit.com
drbd-user@lists.linbit.com
Tue, 4 May 2004 15:17:28 +0200 (CEST)
DRBD CVS committal
Author : phil
Module : drbd
Dir : drbd/drbd
Modified Files:
Tag: rel-0_7-branch
drbd_dsender.c drbd_int.h drbd_receiver.c
Log Message:
* In case the peer drops the connection we could loose our receiver
thread. Fixed this.
* More work on the 'worker is permanently running' idea.
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/Attic/drbd_dsender.c,v
retrieving revision 1.1.2.98
retrieving revision 1.1.2.99
diff -u -3 -r1.1.2.98 -r1.1.2.99
--- drbd_dsender.c 4 May 2004 10:26:12 -0000 1.1.2.98
+++ drbd_dsender.c 4 May 2004 13:17:23 -0000 1.1.2.99
@@ -832,7 +832,7 @@
{
drbd_dev *mdev = thi->mdev;
struct drbd_work *w = 0;
- int intr;
+ int intr,socket_ok=1;
sprintf(current->comm, "drbd%d_worker", (int)(mdev-drbd_conf));
@@ -863,13 +863,16 @@
}
spin_unlock_irq(&mdev->req_lock);
- if(!w->cb(mdev,w,0)) goto err;
- }
+ if(!socket_ok && mdev->cstate >= Connected) {
+ socket_ok = 1;
+ INFO("worker: socket_ok=1\n");
+ }
- if(0) {
- err:
- ERR("A work callback returned not ok!\n");
- drbd_thread_restart_nowait(&mdev->receiver);
+ if(!w->cb(mdev,w,!socket_ok)) {
+ socket_ok = 0;
+ ERR("worker: a callback failed! socket_ok=0\n");
+ drbd_thread_restart_nowait(&mdev->receiver);
+ }
}
del_timer_sync(&mdev->resync_timer); // just in case...
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_int.h,v
retrieving revision 1.58.2.153
retrieving revision 1.58.2.154
diff -u -3 -r1.58.2.153 -r1.58.2.154
--- drbd_int.h 4 May 2004 10:26:12 -0000 1.58.2.153
+++ drbd_int.h 4 May 2004 13:17:23 -0000 1.58.2.154
@@ -1004,10 +1004,6 @@
static inline void
_drbd_queue_work(struct drbd_work_queue *q, struct drbd_work *w)
{
- drbd_dev *mdev = container_of(q,struct Drbd_Conf,data.work);
- PARANOIA_BUG_ON(!IS_VALID_MDEV(mdev));
- ERR_IF(mdev->worker.t_state != Running)
- dump_stack();
list_add_tail(&w->list,&q->q);
up(&q->s);
}
@@ -1015,10 +1011,6 @@
static inline void
_drbd_queue_work_front(struct drbd_work_queue *q, struct drbd_work *w)
{
- drbd_dev *mdev = container_of(q,struct Drbd_Conf,data.work);
- PARANOIA_BUG_ON(!IS_VALID_MDEV(mdev));
- ERR_IF(mdev->worker.t_state != Running)
- dump_stack();
list_add(&w->list,&q->q);
up(&q->s);
}
@@ -1029,8 +1021,6 @@
{
unsigned long flags;
spin_lock_irqsave(&mdev->req_lock,flags);
- ERR_IF(mdev->worker.t_state != Running)
- dump_stack();
list_add_tail(&w->list,&q->q);
spin_unlock_irqrestore(&mdev->req_lock,flags);
up(&q->s);
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_receiver.c,v
retrieving revision 1.97.2.137
retrieving revision 1.97.2.138
diff -u -3 -r1.97.2.137 -r1.97.2.138
--- drbd_receiver.c 4 May 2004 10:26:12 -0000 1.97.2.137
+++ drbd_receiver.c 4 May 2004 13:17:23 -0000 1.97.2.138
@@ -571,13 +571,8 @@
{
struct socket *sock,*msock;
-
- if (mdev->cstate==Unconfigured) return 0;
-
- if (mdev->data.socket) {
- ERR("There is already a socket!!\n");
- return 0;
- }
+ D_ASSERT(mdev->cstate!=Unconfigured);
+ D_ASSERT(!mdev->data.socket);
set_cstate(mdev,WFConnection);
@@ -607,11 +602,11 @@
if(signal_pending(current)) {
drbd_flush_signals(current);
smp_rmb();
- if ((volatile int)mdev->receiver.t_state != Running)
+ if ((volatile int)mdev->receiver.t_state == Exiting)
return 0;
- WARN("Signal pending x%lx, but t_state still Running??\n",
- current->pending.signal.sig[0]);
+ WARN("Signal pending x%lx, but t_state not Exiting??\n",
+ current->pending.signal.sig[0]); // to be removed.
}
}
@@ -658,7 +653,6 @@
* worker thread :(
*/
D_ASSERT(mdev->asender.task == NULL);
- D_ASSERT(mdev->worker.task == NULL);
drbd_thread_start(&mdev->asender);
@@ -1530,7 +1524,10 @@
/* printk(KERN_INFO DEVICE_NAME ": receiver living/m=%d\n", minor); */
while (TRUE) {
- if (!drbd_connect(mdev)) break;
+ if (!drbd_connect(mdev)) {
+ WARN("Discarding network configuration.\n");
+ break;
+ }
if (thi->t_state == Exiting) break;
drbdd(mdev);
drbd_disconnect(mdev);
@@ -1547,6 +1544,11 @@
}
INFO("receiver exiting\n");
+
+ if(test_bit(DISKLESS,&mdev->flags)) {
+ set_cstate(mdev, Unconfigured);
+ drbd_mdev_cleanup(mdev);
+ } else set_cstate(mdev, StandAlone);
return 0;
}