[DRBD-cvs] drbd by phil; * drbd_queue_work(resync_work) is now on...

drbd-user@lists.linbit.com drbd-user@lists.linbit.com
Tue, 4 May 2004 10:44:20 +0200 (CEST)


DRBD CVS committal

Author  : phil
Module  : drbd

Dir     : drbd/drbd


Modified Files:
      Tag: rel-0_7-branch
	drbd_actlog.c drbd_dsender.c drbd_int.h drbd_main.c 


Log Message:
* drbd_queue_work(resync_work) is now only called from the timer.
  [No more races ?]
* Several resync runs in a row do work now...
  [Before the second run did not show any progress..]

===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/Attic/drbd_actlog.c,v
retrieving revision 1.1.2.96
retrieving revision 1.1.2.97
diff -u -3 -r1.1.2.96 -r1.1.2.97
--- drbd_actlog.c	3 May 2004 15:59:25 -0000	1.1.2.96
+++ drbd_actlog.c	4 May 2004 08:44:15 -0000	1.1.2.97
@@ -800,7 +800,7 @@
 	bm_ext = (struct bm_extent*) lc_find(mdev->resync,enr);
 	if(!bm_ext) {
 		spin_unlock_irqrestore(&mdev->al_lock,flags);
-		ERR("drbd_rs_complete_io() called, but extent not found");
+		ERR("drbd_rs_complete_io() called, but extent not found\n");
 		return;
 	}
 
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/Attic/drbd_dsender.c,v
retrieving revision 1.1.2.96
retrieving revision 1.1.2.97
diff -u -3 -r1.1.2.96 -r1.1.2.97
--- drbd_dsender.c	30 Apr 2004 10:08:46 -0000	1.1.2.96
+++ drbd_dsender.c	4 May 2004 08:44:15 -0000	1.1.2.97
@@ -423,14 +423,22 @@
 
 void resync_timer_fn(unsigned long data)
 {
+	unsigned long flags;
 	drbd_dev* mdev = (drbd_dev*) data;
 
-	D_ASSERT(list_empty(&mdev->resync_work.list));
-	if(unlikely(test_and_clear_bit(STOP_SYNC_TIMER,&mdev->flags))) {
-		mdev->resync_work.cb = w_resync_inactive;
+	spin_lock_irqsave(&mdev->req_lock,flags);
+
+	if(likely(!test_and_clear_bit(STOP_SYNC_TIMER,&mdev->flags))) {
+		mdev->resync_work.cb = w_make_resync_request;
 	} else {
-		drbd_queue_work(mdev,&mdev->data.work,&mdev->resync_work);
+		mdev->resync_work.cb = w_resume_next_sg;
 	}
+
+	if(list_empty(&mdev->resync_work.list)) {
+		_drbd_queue_work(&mdev->data.work,&mdev->resync_work);
+	} else INFO("Avoided requeue of resync_work\n");
+
+	spin_unlock_irqrestore(&mdev->req_lock,flags);
 }
 
 int w_make_resync_request(drbd_dev* mdev, struct drbd_work* w,int cancel)
@@ -517,9 +525,8 @@
 
 	// assert that all bit-map parts are cleared.
 	D_ASSERT(list_empty(&mdev->resync->lru));
-	// w->cb = w_resync_inactive; // look into done set_cstate()
-
-	set_cstate(mdev,Connected);
+	
+	set_cstate(mdev,Connected); // w_resume_next_sg() gets called here.
 	return 1;
 }
 
@@ -639,8 +646,8 @@
 	_set_cstate(mdev,ns);
 
 	if(mdev->cstate == SyncTarget) {
-		mdev->resync_work.cb = w_make_resync_request;
-		_drbd_queue_work(&mdev->data.work,&mdev->resync_work);
+		D_ASSERT(!test_bit(STOP_SYNC_TIMER,&mdev->flags));
+		mod_timer(&mdev->resync_timer,jiffies);
 	}
 }
 
@@ -784,8 +791,9 @@
 	if(mdev->cstate == SyncTarget) {
 		mdev->gen_cnt[Flags] &= ~MDF_Consistent;
 		bm_reset(mdev->mbds_id);
-		mdev->resync_work.cb = w_make_resync_request;
-		drbd_queue_work(mdev,&mdev->data.work,&mdev->resync_work);
+		D_ASSERT(!test_bit(STOP_SYNC_TIMER,&mdev->flags));
+		clear_bit(STOP_SYNC_TIMER,&mdev->flags); // on the way out...
+		mod_timer(&mdev->resync_timer,jiffies);
 	} else {
 		// If we are SyncSource we must be consistent :)
 		mdev->gen_cnt[Flags] |= MDF_Consistent;
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_int.h,v
retrieving revision 1.58.2.151
retrieving revision 1.58.2.152
diff -u -3 -r1.58.2.151 -r1.58.2.152
--- drbd_int.h	30 Apr 2004 11:18:27 -0000	1.58.2.151
+++ drbd_int.h	4 May 2004 08:44:15 -0000	1.58.2.152
@@ -850,6 +850,7 @@
 extern int w_io_error            (drbd_dev *, struct drbd_work *, int);
 extern int w_try_send_barrier    (drbd_dev *, struct drbd_work *, int);
 extern int w_send_write_hint     (drbd_dev *, struct drbd_work *, int);
+extern int w_make_resync_request (drbd_dev *, struct drbd_work *, int);
 
 // drbd_receiver.c
 extern int drbd_release_ee(drbd_dev* mdev,struct list_head* list);
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_main.c,v
retrieving revision 1.73.2.158
retrieving revision 1.73.2.159
diff -u -3 -r1.73.2.158 -r1.73.2.159
--- drbd_main.c	30 Apr 2004 09:46:57 -0000	1.73.2.158
+++ drbd_main.c	4 May 2004 08:44:15 -0000	1.73.2.159
@@ -394,8 +394,7 @@
 
 	if ( ( os==SyncSource || os==SyncTarget ) && ns <= Connected ) {
 		set_bit(STOP_SYNC_TIMER,&mdev->flags);
-		mdev->resync_work.cb = w_resume_next_sg;
-		_drbd_queue_work(&mdev->data.work,&mdev->resync_work);
+		mod_timer(&mdev->resync_timer,jiffies);
 	}
 	if(test_bit(MD_IO_ALLOWED,&mdev->flags) &&
 	   test_bit(DISKLESS,&mdev->flags) && ns < Connected) {