[DRBD-cvs] drbd by phil; When the worker exits it makes shure now...

drbd-user@lists.linbit.com drbd-user@lists.linbit.com
Wed, 5 May 2004 10:40:32 +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:
When the worker exits it makes shure now that no EEs are left on
the read_ee list. This makes drbdadm disconnect ; connect work a
lot better. 

===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/Attic/drbd_dsender.c,v
retrieving revision 1.1.2.101
retrieving revision 1.1.2.102
diff -u -3 -r1.1.2.101 -r1.1.2.102
--- drbd_dsender.c	4 May 2004 15:03:02 -0000	1.1.2.101
+++ drbd_dsender.c	5 May 2004 08:40:27 -0000	1.1.2.102
@@ -88,6 +88,7 @@
 	smp_mb__after_clear_bit();
 
 	list_del(&e->w.list);
+	if(list_empty(&mdev->read_ee)) wake_up(&mdev->ee_wait);
 	spin_unlock_irqrestore(&mdev->ee_lock,flags);
 
 	drbd_chk_io_error(mdev,!uptodate);
@@ -223,6 +224,7 @@
 
 	spin_lock_irqsave(&mdev->ee_lock,flags);
 	list_del(&e->w.list);
+	if(list_empty(&mdev->read_ee)) wake_up(&mdev->ee_wait);
 	spin_unlock_irqrestore(&mdev->ee_lock,flags);
 
 	drbd_chk_io_error(mdev,error);
@@ -875,6 +877,9 @@
 	}
 
 	del_timer_sync(&mdev->resync_timer); // just in case...
+
+	drbd_wait_ee(mdev,&mdev->read_ee);
+
 
 	while(!down_trylock(&mdev->data.work.s)) {
 		spin_lock_irq(&mdev->req_lock);
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_int.h,v
retrieving revision 1.58.2.155
retrieving revision 1.58.2.156
diff -u -3 -r1.58.2.155 -r1.58.2.156
--- drbd_int.h	4 May 2004 15:03:02 -0000	1.58.2.155
+++ drbd_int.h	5 May 2004 08:40:27 -0000	1.58.2.156
@@ -535,7 +535,6 @@
    sync_ee   .. syncer block being written
    done_ee   .. block written, need to send WriteAck
    read_ee   .. [RS]DataRequest being read
-   rdone_ee  .. block read, need to send DataReply
 */
 
 /* Since whenever we allocate a Tl_epoch_entry, we allocated a buffer_head,
@@ -707,7 +706,6 @@
 	struct list_head sync_ee;   // IO in progress
 	struct list_head done_ee;   // send ack
 	struct list_head read_ee;   // IO in progress
-	// struct list_head rdone_ee;  // send result or CondRequest
 	spinlock_t pr_lock;
 	struct list_head app_reads;
 	struct list_head resync_reads;
@@ -879,6 +877,7 @@
 extern int drbd_init_ee(drbd_dev* mdev);
 extern void drbd_put_ee(drbd_dev* mdev,struct Tl_epoch_entry *e);
 extern struct Tl_epoch_entry* drbd_get_ee(drbd_dev* mdev);
+extern void drbd_wait_ee(drbd_dev *mdev,struct list_head *head);
 
 // drbd_proc.c
 extern struct proc_dir_entry *drbd_proc;
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_receiver.c,v
retrieving revision 1.97.2.140
retrieving revision 1.97.2.141
diff -u -3 -r1.97.2.140 -r1.97.2.141
--- drbd_receiver.c	4 May 2004 15:03:02 -0000	1.97.2.140
+++ drbd_receiver.c	5 May 2004 08:40:27 -0000	1.97.2.141
@@ -394,7 +394,7 @@
 	return rv;
 }
 
-STATIC void drbd_wait_ee(drbd_dev *mdev,struct list_head *head)
+void drbd_wait_ee(drbd_dev *mdev,struct list_head *head)
 {
 	wait_event(mdev->ee_wait,_wait_ee_cond(mdev,head));
 }
@@ -1497,6 +1497,13 @@
 	drbd_wait_ee(mdev,&mdev->active_ee);
 	drbd_wait_ee(mdev,&mdev->sync_ee);
 	drbd_clear_done_ee(mdev);
+
+	D_ASSERT(mdev->ee_in_use == 0);
+	D_ASSERT(list_empty(&mdev->read_ee)); // done by termination of worker
+	D_ASSERT(list_empty(&mdev->active_ee)); // done here
+	D_ASSERT(list_empty(&mdev->sync_ee)); // done here
+	D_ASSERT(list_empty(&mdev->done_ee)); // done here
+
 	mdev->epoch_size=0;
 
 	if (mdev->state == Primary) {