[DRBD-cvs] r1757 - trunk/drbd

svn at svn.drbd.org svn at svn.drbd.org
Fri Feb 11 16:59:11 CET 2005


Author: phil
Date: 2005-02-11 16:59:06 +0100 (Fri, 11 Feb 2005)
New Revision: 1757

Modified:
   trunk/drbd/drbd_fs.c
   trunk/drbd/drbd_main.c
   trunk/drbd/drbd_receiver.c
   trunk/drbd/drbd_req.c
   trunk/drbd/drbd_worker.c
Log:
Slowly bringing the work on item 9 [two primaries] into
shape...


Modified: trunk/drbd/drbd_fs.c
===================================================================
--- trunk/drbd/drbd_fs.c	2005-02-06 08:52:22 UTC (rev 1756)
+++ trunk/drbd/drbd_fs.c	2005-02-11 15:59:06 UTC (rev 1757)
@@ -577,7 +577,8 @@
 		}
 	}
 
-	if (mdev->ee_hash_s != new_conf.max_buffers/8 ) {
+	if (mdev->conf.two_primaries &&
+	    ( mdev->ee_hash_s != new_conf.max_buffers/8 ) ) {
 		new_ee_hash = kmalloc(mdev->ee_hash_s * sizeof(void*),
 				      GFP_KERNEL);
 		if(!new_ee_hash) {

Modified: trunk/drbd/drbd_main.c
===================================================================
--- trunk/drbd/drbd_main.c	2005-02-06 08:52:22 UTC (rev 1756)
+++ trunk/drbd/drbd_main.c	2005-02-11 15:59:06 UTC (rev 1757)
@@ -168,12 +168,10 @@
 }
 
 
-STATIC void tl_add(drbd_dev *mdev, drbd_request_t * new_item)
+STATIC void _tl_add(drbd_dev *mdev, drbd_request_t * new_item)
 {
 	struct drbd_barrier *b;
 
-	spin_lock_irq(&mdev->tl_lock);
-
 	b=mdev->newest_barrier;
 
 	new_item->barrier = b;
@@ -187,7 +185,12 @@
 	INIT_HLIST_NODE(&new_item->colision);
 	hlist_add_head( &new_item->colision, mdev->tl_hash + 
 			tl_hash_fn(mdev, drbd_req_get_sector(new_item) ));
+}
 
+STATIC void tl_add(drbd_dev *mdev, drbd_request_t * new_item)
+{
+	spin_lock_irq(&mdev->tl_lock);
+	_tl_add(mdev,new_item);
 	spin_unlock_irq(&mdev->tl_lock);
 }
 
@@ -422,10 +425,39 @@
 	return rv;
 }
 
-int ee_have_write(drbd_dev *mdev, drbd_request_t * req)
+STATIC int ee_have_write(drbd_dev *mdev, drbd_request_t * req)
 {
-	// PRE TODO: same as above for a request agains our acive EEs.
-	return 0;
+	struct hlist_head *slot;
+	struct hlist_node *n;
+	struct Tl_epoch_entry *ee;
+	sector_t sector = drbd_req_get_sector(req);
+	int size = drbd_req_get_size(req);
+	int i, rv=0;
+
+	D_ASSERT(size <= 1<<(HT_SHIFT+9) );
+
+	spin_lock_irq(&mdev->tl_lock);
+
+	for(i=-1;i<=1;i++ ) {
+		slot = mdev->tl_hash + ee_hash_fn(mdev,
+						  sector + i*(1<<(HT_SHIFT)));
+		hlist_for_each_entry(ee, n, slot, colision) {
+			if( overlaps(drbd_ee_get_sector(ee),
+				     drbd_ee_get_size(ee),
+				     sector,
+				     size) ) {
+				rv=1;
+				goto out;
+			} //overlaps()
+		} // hlist_for_each_entry()
+	}
+
+	// Good, no conflict found
+	_tl_add(mdev,req);
+ out:
+	spin_unlock_irq(&mdev->tl_lock);
+
+	return rv;
 }
 
 /**
@@ -1308,7 +1340,11 @@
 	if(test_and_clear_bit(ISSUE_BARRIER,&mdev->flags))
 		ok = _drbd_send_barrier(mdev);
 	if(ok) {
-		tl_add(mdev,req);
+		if (mdev->conf.two_primaries) {
+			if(ee_have_write(mdev,req)) return -1;
+		} else {
+			tl_add(mdev,req);
+		}
 		dump_packet(mdev,mdev->data.socket,0,(void*)&p, __FILE__, __LINE__);
 		set_bit(UNPLUG_REMOTE,&mdev->flags);
 		ok = sizeof(p) == drbd_send(mdev,mdev->data.socket,&p,sizeof(p),MSG_MORE);

Modified: trunk/drbd/drbd_receiver.c
===================================================================
--- trunk/drbd/drbd_receiver.c	2005-02-06 08:52:22 UTC (rev 1756)
+++ trunk/drbd/drbd_receiver.c	2005-02-11 15:59:06 UTC (rev 1757)
@@ -1036,7 +1036,7 @@
 	sector_t sector;
 	struct Tl_epoch_entry *e;
 	Drbd_Data_Packet *p = (Drbd_Data_Packet*)h;
-	int header_size,data_size, packet_seq,discard;
+	int header_size,data_size, packet_seq,discard=0;
 
 	// FIXME merge this code dups into some helper function
 	header_size = sizeof(*p) - sizeof(*h);
@@ -1057,16 +1057,18 @@
 	   traveling on msock 
 	   PRE TODO: Wrap around of seq_num !!! 
 	*/
-	packet_seq = be32_to_cpu(p->seq_num);
-	if( wait_event_interruptible(mdev->cstate_wait, 
-				     packet_seq <= peer_seq(mdev)+1) )
-		return FALSE;
+	if (mdev->conf.two_primaries) {
+		packet_seq = be32_to_cpu(p->seq_num);
+		if( wait_event_interruptible(mdev->cstate_wait, 
+					     packet_seq <= peer_seq(mdev)+1) )
+			return FALSE;
 
-	spin_lock(&mdev->peer_seq_lock); 
-	mdev->peer_seq = max(mdev->peer_seq, packet_seq);
- 	/* is update_peer_seq(mdev,packet_seq); */
-	discard = drbd_chk_discard(mdev,p->block_id,packet_seq);
-	spin_unlock(&mdev->peer_seq_lock);
+		spin_lock(&mdev->peer_seq_lock); 
+		mdev->peer_seq = max(mdev->peer_seq, packet_seq);
+		/* is update_peer_seq(mdev,packet_seq); */
+		discard = drbd_chk_discard(mdev,p->block_id,packet_seq);
+		spin_unlock(&mdev->peer_seq_lock);
+	}
 
 	sector = be64_to_cpu(p->sector);
 	e = read_in_block(mdev,data_size);

Modified: trunk/drbd/drbd_req.c
===================================================================
--- trunk/drbd/drbd_req.c	2005-02-06 08:52:22 UTC (rev 1756)
+++ trunk/drbd/drbd_req.c	2005-02-11 15:59:06 UTC (rev 1757)
@@ -307,6 +307,25 @@
 		 */
 		inc_ap_pending(mdev);
 		if (rw == WRITE) {
+			switch(drbd_send_dblock(mdev,req)) {
+			case 0: /* sending failed */
+				if (mdev->state.s.conn >= Connected)
+					drbd_force_state(mdev,NS(conn,NetworkFailure));
+				dec_ap_pending(mdev);
+				drbd_thread_restart_nowait(&mdev->receiver);
+				break;
+			case -1: /* concurrent write */
+				WARN("Concurrent write! [DISCARD L] sec=%lu\n",
+				     (unsigned long)sector);
+				local=0;
+				drbd_end_req(req, RQ_DRBD_DONE, 1, sector);
+				break;
+			default: /* block was sent */
+				if(mdev->conf.wire_protocol == DRBD_PROT_A) {
+					dec_ap_pending(mdev);
+					drbd_end_req(req, RQ_DRBD_SENT, 1, sector);
+				}
+			}
 			if (!drbd_send_dblock(mdev,req)) {
 				if (mdev->state.s.conn >= Connected)
 					drbd_force_state(mdev,NS(conn,NetworkFailure));

Modified: trunk/drbd/drbd_worker.c
===================================================================
--- trunk/drbd/drbd_worker.c	2005-02-06 08:52:22 UTC (rev 1756)
+++ trunk/drbd/drbd_worker.c	2005-02-11 15:59:06 UTC (rev 1757)
@@ -125,6 +125,12 @@
 
 	spin_unlock_irqrestore(&mdev->ee_lock,flags);
 
+	if( !hlist_unhashed(&e->colision) ) {
+		spin_lock_irqsave(&mdev->tl_lock,flags);
+		hlist_del_init(&e->colision);
+		spin_unlock_irqrestore(&mdev->tl_lock,flags);
+	}
+
 	drbd_chk_io_error(mdev,error);
 	wake_asender(mdev);
 	dec_local(mdev);



More information about the drbd-cvs mailing list