[DRBD-cvs] r1674 - branches/drbd-0.7/drbd

svn at svn.drbd.org svn at svn.drbd.org
Mon Dec 13 14:37:31 CET 2004


Author: phil
Date: 2004-12-13 14:37:28 +0100 (Mon, 13 Dec 2004)
New Revision: 1674

Modified:
   branches/drbd-0.7/drbd/drbd_worker.c
Log:
There was a bug in the sync-groups code:
When a sync was paused, it tried to activate the next sync 
group, if there was no device in the current sync group syncing. 
FIX: 
Now w_resume_next_sg() only resumes the next sync group, if no
resources in the sg is syncing _and_ no resource in a lower
sg is syncing.


Modified: branches/drbd-0.7/drbd/drbd_worker.c
===================================================================
--- branches/drbd-0.7/drbd/drbd_worker.c	2004-12-10 12:48:28 UTC (rev 1673)
+++ branches/drbd-0.7/drbd/drbd_worker.c	2004-12-13 13:37:28 UTC (rev 1674)
@@ -451,7 +451,6 @@
 	PARANOIA_BUG_ON(w != &mdev->resync_work);
 
 	if(unlikely(cancel)) return 1;
-	/* FIXME THINK what about w_resume_next_sg ?? */
 
 	if(unlikely(mdev->cstate < Connected)) {
 		ERR("Confused in w_make_resync_request()! cstate < Connected");
@@ -554,9 +553,7 @@
 	mdev->rs_paused = 0;
 
 	set_cstate(mdev,Connected);
-	/* FIXME
-	 * _queueing_ of w_resume_next_sg() gets _scheduled_ here.
-	 * maybe rather _do_ it right here instead? */
+
 	return 1;
 }
 
@@ -792,11 +789,11 @@
 
 	for (i=0; i < minor_count; i++) {
 		odev = drbd_conf + i;
-		if ( odev->sync_conf.group == mdev->sync_conf.group
+		if ( odev->sync_conf.group <= mdev->sync_conf.group
 		     && ( odev->cstate == SyncSource || 
 			  odev->cstate == SyncTarget ) ) {
 			goto out; // Sync on an other device in this group
-			          // still runs.
+			          // or a lower group still runs.
 		}
 	}
 
@@ -899,13 +896,6 @@
 		return;
 	}
 
-	/* FIXME THINK
-	 * use mdev->cstate (we may already be paused...) or side here ?? */
-	if (mdev->cstate == SyncTarget) {
-		D_ASSERT(!test_bit(STOP_SYNC_TIMER,&mdev->flags));
-		mod_timer(&mdev->resync_timer,jiffies);
-	}
-
 	drbd_global_lock();
 	if (mdev->cstate == SyncTarget || mdev->cstate == SyncSource) {
 		_drbd_pause_higher_sg(mdev);
@@ -918,6 +908,14 @@
 	   * I really hate it that we can't have a consistent view of cstate.
 	   */
 	drbd_global_unlock();
+
+	if (mdev->cstate == SyncTarget) {
+		D_ASSERT(!test_bit(STOP_SYNC_TIMER,&mdev->flags));
+		mod_timer(&mdev->resync_timer,jiffies);
+	} else if (mdev->cstate == PausedSyncT) { 
+		D_ASSERT(test_bit(STOP_SYNC_TIMER,&mdev->flags));
+		clear_bit(STOP_SYNC_TIMER,&mdev->flags);
+	}
 }
 
 int drbd_worker(struct Drbd_thread *thi)



More information about the drbd-cvs mailing list