[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