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