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