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