[DRBD-cvs] DRBD CVS: drbd by phil from

drbd-cvs@linbit.com drbd-cvs@linbit.com
Sat, 10 Jan 2004 22:39:56 +0100 (CET)


DRBD CVS committal

Author  : phil
Host    : 
Module  : drbd

Dir     : drbd/drbd


Modified Files:
      Tag: rel-0_7-branch
	drbd_dsender.c lru_cache.c 


Log Message:
Fixed various bugs in the dsender, that were introduced with 
the move to the wait_event() macros

Addapted the behaviour of lc_get() if no callback is given,
to the behaviour I anticipated.

Basically it works now.

TODO: should try to trigger these messages with stresstesing:
"Delaying sync read until app's write is done"
"Delaying app write until sync read is done"

===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/Attic/drbd_dsender.c,v
retrieving revision 1.1.2.38
retrieving revision 1.1.2.39
diff -u -3 -r1.1.2.38 -r1.1.2.39
--- drbd_dsender.c	7 Jan 2004 16:11:29 -0000	1.1.2.38
+++ drbd_dsender.c	10 Jan 2004 21:39:56 -0000	1.1.2.39
@@ -193,7 +193,8 @@
 	mdev->rs_mark_left=mdev->rs_left;
 	mdev->rs_mark_time=mdev->rs_start;
 
-	INFO("resync started (need to sync %lu KB).\n",mdev->rs_left/2);
+	INFO("Resync started as %s (need to sync %lu KB).\n",
+	     side == SyncTarget ? "target" : "source", mdev->rs_left/2);
 
 	if(side == SyncTarget) {
 		set_bit(START_SYNC,&mdev->flags);
@@ -228,9 +229,11 @@
 
 	sprintf(current->comm, "drbd%d_dsender", (int)(mdev-drbd_conf));
 
-	while( ! wait_event_interruptible_timeout(mdev->dsender_wait,
-						  _dsender_cond(mdev),
-						  time)) {
+	while( thi->t_state == Running ) {
+
+		wait_event_interruptible_timeout(
+			mdev->dsender_wait,_dsender_cond(mdev),time);
+
 		spin_lock_irq(&mdev->ee_lock);
 		drbd_process_rdone_ee(mdev);
 		spin_unlock_irq(&mdev->ee_lock);
@@ -245,7 +248,7 @@
 		if(test_and_clear_bit(SYNC_FINISHED,&mdev->flags)) {
 			unsigned long dt;
 			dt = (jiffies - mdev->rs_start) / HZ + 1;
-			INFO("resync done (total %lu sec; %lu K/sec)\n",
+			INFO("Resync done (total %lu sec; %lu K/sec)\n",
 			     dt,(mdev->rs_total/2)/dt);
 
 			if(mdev->cstate == SyncTarget) {
@@ -259,7 +262,7 @@
 			D_ASSERT(list_empty(&mdev->resync->lru));
 		}
 
-		if(mdev->cstate == SyncSource) {
+		if(time == SLEEP_TIME) {
 			if(!ds_issue_requests(mdev)) {
 				time=MAX_SCHEDULE_TIMEOUT;
 			}
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/Attic/lru_cache.c,v
retrieving revision 1.1.2.18
retrieving revision 1.1.2.19
diff -u -3 -r1.1.2.18 -r1.1.2.19
--- lru_cache.c	9 Jan 2004 08:49:37 -0000	1.1.2.18
+++ lru_cache.c	10 Jan 2004 21:39:56 -0000	1.1.2.19
@@ -233,11 +233,11 @@
 		 */
 		clear_bit(__LC_STARVING,&lc->flags);
 		smp_mb__after_clear_bit();
+		BUG_ON( sync && (e->lc_number != enr) );
 	} else {
 		/* ok, user does not want to be notified.
-		 * we just do it here and now.
+		 * He sets lc_number we he gets the extent...
 		 */
-		e->lc_number = enr;
 		// I'd like to use __clear_bit, but 2.4.23 does not have it.
 		clear_bit(__LC_DIRTY,&lc->flags);
 		clear_bit(__LC_STARVING,&lc->flags);
@@ -248,7 +248,6 @@
 	hlist_add_head( &e->colision, lc->slot + lc_hash_fn(lc, enr) );
 
 	if (sync) {
-		BUG_ON(e->lc_number != enr);
 		BUG_ON(++e->refcnt != 1);
 		BUG_ON(lc->flags & LC_DIRTY);
 		RETURN(e);