[DRBD-cvs] drbd by phil; Debugged the work on inc_local() / dec_l...

drbd-user@lists.linbit.com drbd-user@lists.linbit.com
Mon, 9 Feb 2004 10:40:51 +0100 (CET)


DRBD CVS committal

Author  : phil
Module  : drbd

Dir     : drbd/drbd


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


Log Message:
Debugged the work on inc_local() / dec_local(). It seems that the
"one node is disk less" case is now handled corret.

Especially important are the transitions from and to the DISKLESS
state. It looks like they are corrent now.

===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/Attic/drbd_dsender.c,v
retrieving revision 1.1.2.70
retrieving revision 1.1.2.71
diff -u -3 -r1.1.2.70 -r1.1.2.71
--- drbd_dsender.c	8 Feb 2004 12:26:14 -0000	1.1.2.70
+++ drbd_dsender.c	9 Feb 2004 09:40:45 -0000	1.1.2.71
@@ -91,6 +91,7 @@
 	spin_unlock_irqrestore(&mdev->ee_lock,flags);
 
 	drbd_queue_work(mdev,&mdev->data.work,&e->w);
+	dec_local(mdev);
 }
 
 /* writes on behalf of the partner, or resync writes,
@@ -132,6 +133,7 @@
 	}
 
 	wake_asender(mdev);
+	dec_local(mdev);
 }
 
 /* writes on Primary comming from drbd_make_request
@@ -193,6 +195,7 @@
 	spin_unlock_irqrestore(&mdev->ee_lock,flags);
 
 	drbd_queue_work(mdev,&mdev->data.work,&e->w);
+	dec_local(mdev);
 	return 0;
 }
 
@@ -232,6 +235,7 @@
 	}
 
 	wake_asender(mdev);
+	dec_local(mdev);
 	return 0;
 }
 
@@ -254,6 +258,7 @@
 
 	drbd_end_req(req, RQ_DRBD_WRITTEN, (error == 0), drbd_req_get_sector(req));
 	drbd_al_complete_io(mdev,drbd_req_get_sector(req));
+	dec_local(mdev);
 	return 0;
 }
 #endif
@@ -372,7 +377,6 @@
 
 	ok=drbd_send_block(mdev, DataReply, e);
 	dec_unacked(mdev,HERE); // THINK unconditional?
-	dec_local(mdev);
 
 	spin_lock_irq(&mdev->ee_lock);
 	drbd_put_ee(mdev,e);
@@ -391,7 +395,6 @@
 	inc_rs_pending(mdev);
 	ok=drbd_send_block(mdev, DataReply, e);
 	dec_unacked(mdev,HERE); // THINK unconditional?
-	dec_local(mdev);
 
 	spin_lock_irq(&mdev->ee_lock);
 	drbd_put_ee(mdev,e);
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_fs.c,v
retrieving revision 1.28.2.68
retrieving revision 1.28.2.69
diff -u -3 -r1.28.2.68 -r1.28.2.69
--- drbd_fs.c	8 Feb 2004 19:53:19 -0000	1.28.2.68
+++ drbd_fs.c	9 Feb 2004 09:40:45 -0000	1.28.2.69
@@ -331,7 +331,8 @@
 	drbd_determin_dev_size(mdev);
 	if(i) drbd_read_bm(mdev);
 	else {
-		WARN("You have to start initial sync if it is needed!\n");
+		INFO("Assuming that all blocks are out of sync (aka FullSync)\n");
+		bm_fill_bm(mdev->mbds_id,-1);
 		drbd_write_bm(mdev);
 	}
 
@@ -792,7 +793,13 @@
 
 		set_bit(DISKLESS,&mdev->flags);
 		smp_mb__after_clear_bit();
-		wait_event(mdev->cstate_wait,atomic_read(&mdev->local_cnt)==0);
+		if ( wait_event_interruptible(mdev->cstate_wait,
+					      atomic_read(&mdev->local_cnt)==0) ) {
+			clear_bit(DISKLESS,&mdev->flags);
+			err=-EINTR;
+			break;
+		}
+
 		drbd_free_ll_dev(mdev);
 
 		if (mdev->cstate == Connected) drbd_send_param(mdev,0);
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_int.h,v
retrieving revision 1.58.2.118
retrieving revision 1.58.2.119
diff -u -3 -r1.58.2.118 -r1.58.2.119
--- drbd_int.h	8 Feb 2004 12:26:14 -0000	1.58.2.118
+++ drbd_int.h	9 Feb 2004 09:40:45 -0000	1.58.2.119
@@ -1080,6 +1080,7 @@
 static inline int inc_local(drbd_dev* mdev)
 {
 	int io_allowed;
+
 	atomic_inc(&mdev->local_cnt);
 	io_allowed = !test_bit(DISKLESS,&mdev->flags);
 	if( !io_allowed ) {
@@ -1091,6 +1092,7 @@
 static inline int inc_local_md_only(drbd_dev* mdev)
 {
 	int io_allowed;
+
 	atomic_inc(&mdev->local_cnt);
 	io_allowed = !test_bit(DISKLESS,&mdev->flags) ||
 		test_bit(MD_IO_ALLOWED,&mdev->flags);
@@ -1105,10 +1107,10 @@
 	if(atomic_dec_and_test(&mdev->local_cnt) && 
 	   test_bit(DISKLESS,&mdev->flags) &&
 	   mdev->lo_file) {
-		wake_up(&mdev->cstate_wait);
+		wake_up_interruptible(&mdev->cstate_wait);
 	}
 
-	D_ASSERT(atomic_read(&mdev->local_cnt)>0);
+	D_ASSERT(atomic_read(&mdev->local_cnt)>=0);
 }
 
 static inline void drbd_set_out_of_sync(drbd_dev* mdev,
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_main.c,v
retrieving revision 1.73.2.125
retrieving revision 1.73.2.126
diff -u -3 -r1.73.2.125 -r1.73.2.126
--- drbd_main.c	8 Feb 2004 12:26:14 -0000	1.73.2.125
+++ drbd_main.c	9 Feb 2004 09:40:45 -0000	1.73.2.126
@@ -556,7 +556,7 @@
 	int ok,i;
 	unsigned long m_size; // sector_t ??
 
-	if(!test_bit(DISKLESS,&mdev->flags)) {
+	if(!test_bit(DISKLESS,&mdev->flags) || test_bit(MD_IO_ALLOWED,&mdev->flags)) {
 		if (mdev->md_index == -1 ) m_size = drbd_md_ss(mdev)>>1;
 		else m_size = drbd_get_capacity(mdev->backing_bdev)>>1;
 	} else m_size = 0;
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_receiver.c,v
retrieving revision 1.97.2.105
retrieving revision 1.97.2.106
diff -u -3 -r1.97.2.105 -r1.97.2.106
--- drbd_receiver.c	8 Feb 2004 12:26:14 -0000	1.97.2.105
+++ drbd_receiver.c	9 Feb 2004 09:40:46 -0000	1.97.2.106
@@ -772,7 +772,6 @@
 	drbd_set_in_sync(mdev, sector, drbd_ee_get_size(e));
 	drbd_send_ack(mdev,WriteAck,e);
 	dec_unacked(mdev,HERE); // FIXME unconditional ??
-	dec_local(mdev);
 	return TRUE;
 }
 
@@ -941,7 +940,6 @@
 		dec_unacked(mdev,HERE); // FIXME unconditional ??
 	}
 
-	dec_local(mdev);
 	return ok;
 }
 
@@ -1174,7 +1172,6 @@
 			set_cstate(mdev,Connected);
 		}
 	}
-	else clear_bit(PARTNER_DISKLESS, &mdev->flags);
 
 	if (mdev->cstate == WFReportParams) {
 		INFO("Connection established.\n");
@@ -1217,10 +1214,11 @@
 		}
 	}
 
-	if (mdev->cstate == WFReportParams) set_cstate(mdev,Connected);
-
 skipped:	// do not adopt gen counts when sync was skipped ...
 
+	if (mdev->cstate == WFReportParams) set_cstate(mdev,Connected);
+	if (p_size && mdev->cstate==Connected) clear_bit(PARTNER_DISKLESS,&mdev->flags);
+
 	oo_state = mdev->o_state;
 	mdev->o_state = be32_to_cpu(p->state);
 	if(oo_state == Secondary && mdev->o_state == Primary) {
@@ -1279,12 +1277,11 @@
 		D_ASSERT(0);
 	}
 
-	if(test_bit(MD_IO_ALLOWED,&mdev->flags) &&
-	   test_bit(DISKLESS,&mdev->flags)) {
-		clear_bit(DISKLESS,&mdev->flags);
-		smp_wmb();
-		clear_bit(MD_IO_ALLOWED,&mdev->flags);
-	}
+	// We just started resync. Now we can be sure that local disk IO is okay.
+	clear_bit(PARTNER_DISKLESS,&mdev->flags);
+	clear_bit(DISKLESS,&mdev->flags);
+	smp_wmb();
+	clear_bit(MD_IO_ALLOWED,&mdev->flags);
 
 	ok=TRUE;
  out: