[DRBD-cvs] r1762 - in trunk: . drbd

svn at svn.drbd.org svn at svn.drbd.org
Mon Feb 14 21:08:47 CET 2005


Author: phil
Date: 2005-02-14 21:08:40 +0100 (Mon, 14 Feb 2005)
New Revision: 1762

Modified:
   trunk/ROADMAP
   trunk/drbd/drbd_main.c
   trunk/drbd/drbd_receiver.c
Log:
Well, it seems that all code pathes of the item 9 code,
work fine. I need to check our OCFS2...


Modified: trunk/ROADMAP
===================================================================
--- trunk/ROADMAP	2005-02-14 16:01:02 UTC (rev 1761)
+++ trunk/ROADMAP	2005-02-14 20:08:40 UTC (rev 1762)
@@ -86,7 +86,9 @@
 
   Note: The actual key to the hash should be (sector & ~0x7).
         See item 9 for more details.
-  99% DONE
+  80% DONE ; There are more places where we case an block_id
+             to an req pointer, need to make sure that we
+             cover all of these places.
 
 7 Handle split brain situations; Support IO fencing; 
   
@@ -321,8 +323,7 @@
         to find IO operations starting in the same 4k block of
         data quickly. -> With two lookups the hash table we can
 	find any concurrent access.
-  70% DONE ; Implement discard info packets. Code an equivalent
-             hash table for EEs, to solve example case 5.
+  99% DONE
 
 10 Change Sync-groups to sync-after
   

Modified: trunk/drbd/drbd_main.c
===================================================================
--- trunk/drbd/drbd_main.c	2005-02-14 16:01:02 UTC (rev 1761)
+++ trunk/drbd/drbd_main.c	2005-02-14 20:08:40 UTC (rev 1762)
@@ -1343,10 +1343,6 @@
 				     atomic_add_return(1,&mdev->packet_seq) );
 
 		dump_packet(mdev,mdev->data.socket,0,(void*)&p, __FILE__, __LINE__);
-		// Instrumentation
-		set_current_state(TASK_INTERRUPTIBLE);
-		schedule_timeout(HZ);
-
 		set_bit(UNPLUG_REMOTE,&mdev->flags);
 		ok = sizeof(p) == drbd_send(mdev,mdev->data.socket,&p,sizeof(p),MSG_MORE);
 		if(ok) {
@@ -1389,7 +1385,7 @@
 
 	p.sector   = cpu_to_be64(drbd_ee_get_sector(e));
 	p.block_id = e->block_id;
-	p.seq_num  = cpu_to_be32(atomic_add_return(1,&mdev->packet_seq));
+	/* p.seq_num  = 0;    No sequence numbers here.. */
 
 	/* Only called by our kernel thread.
 	 * This one may be interupted by DRBD_SIG and/or DRBD_SIGKILL

Modified: trunk/drbd/drbd_receiver.c
===================================================================
--- trunk/drbd/drbd_receiver.c	2005-02-14 16:01:02 UTC (rev 1761)
+++ trunk/drbd/drbd_receiver.c	2005-02-14 20:08:40 UTC (rev 1762)
@@ -1044,7 +1044,7 @@
 	struct Tl_epoch_entry *e;
 	drbd_request_t * req;
 	Drbd_Data_Packet *p = (Drbd_Data_Packet*)h;
-	int header_size, data_size, packet_seq, discard;
+	int header_size, data_size, packet_seq, discard, rv;
 
 	// FIXME merge this code dups into some helper function
 	header_size = sizeof(*p) - sizeof(*h);
@@ -1068,10 +1068,8 @@
 		if (DRBD_ratelimit(5*HZ,5))
 			ERR("Can not write mirrored data block to local disk.\n");
 		drbd_send_ack(mdev,NegAck,e);
-		spin_lock_irq(&mdev->ee_lock);
-		drbd_put_ee(mdev,e);
-		spin_unlock_irq(&mdev->ee_lock);
-		return TRUE;
+		rv = TRUE;
+		goto out1;
 	}
 
 	e->block_id = p->block_id; // no meaning on this side, e* on partner
@@ -1085,13 +1083,15 @@
 	*/
 	if (mdev->conf.two_primaries) {
 		packet_seq = be32_to_cpu(p->seq_num);
-		if( packet_seq > peer_seq(mdev)+1 ) {
+		/* if( packet_seq > peer_seq(mdev)+1 ) {
 			WARN(" will wait till (packet_seq) %d <= %d\n",
 			     packet_seq,peer_seq(mdev)+1);
-		}
+			     } */
 		if( wait_event_interruptible(mdev->cstate_wait, 
-					     packet_seq <= peer_seq(mdev)+1) )
-			return FALSE;
+					     packet_seq <= peer_seq(mdev)+1)) {
+			rv = FALSE;
+			goto out2;
+		}
 
 		spin_lock(&mdev->peer_seq_lock); 
 		mdev->peer_seq = max(mdev->peer_seq, packet_seq);
@@ -1100,14 +1100,10 @@
 		spin_unlock(&mdev->peer_seq_lock);
 
 		if(discard) {
-			spin_lock_irq(&mdev->ee_lock);
-			drbd_put_ee(mdev,e);
-			spin_unlock_irq(&mdev->ee_lock);
-			atomic_inc(&mdev->epoch_size);
-			dec_local(mdev);
 			WARN("Concurrent write! [DISCARD BY LIST] sec=%lu\n",
 			     (unsigned long)sector);
-			return TRUE;
+			rv = TRUE;
+			goto out2;
 		}
 
 		req = req_have_write(mdev, e);
@@ -1120,34 +1116,27 @@
 				     "sec=%lu\n",(unsigned long)sector);
 				if( wait_event_interruptible(mdev->cstate_wait,
 					       !req_have_write(mdev,e))) {
-					spin_lock_irq(&mdev->ee_lock);
-					drbd_put_ee(mdev,e);
-					spin_unlock_irq(&mdev->ee_lock);
-					return FALSE;
+					rv = FALSE;
+					goto out2;
 				}
 			} else {
 				/* Conflicting write, no ACK by now*/
 				if (test_bit(UNIQUE,&mdev->flags)) {
-					spin_lock_irq(&mdev->ee_lock);
-					drbd_put_ee(mdev,e);
-					spin_unlock_irq(&mdev->ee_lock);
-					atomic_inc(&mdev->epoch_size);
-					dec_local(mdev);
 					WARN("Concurrent write! [DISCARD BY FLAG] sec=%lu\n",
 					     (unsigned long)sector);
-					return TRUE;
+					rv = TRUE;
+					goto out2;
 				} else {
 					/* write afterwards do not exp ACK */
 					WARN("Concurrent write! [W AFTERWARDS2] sec=%lu\n",
 					     (unsigned long)sector);
 					drbd_send_discard(mdev,req);
 					drbd_end_req(req, RQ_DRBD_SENT, 1, sector);
+					dec_ap_pending(mdev);
 					if( wait_event_interruptible(mdev->cstate_wait,
 								     !req_have_write(mdev,e))) {
-						spin_lock_irq(&mdev->ee_lock);
-						drbd_put_ee(mdev,e);
-						spin_unlock_irq(&mdev->ee_lock);
-						return FALSE;
+						rv = FALSE;
+						goto out2;
 					}
 				}
 			}
@@ -1170,14 +1159,19 @@
 		break;
 	}
 
-	// Instrumentation
-	set_current_state(TASK_INTERRUPTIBLE);
-	schedule_timeout(HZ);
-
 	drbd_generic_make_request(WRITE,&e->private_bio);
 
 	receive_data_tail(mdev,data_size);
 	return TRUE;
+
+ out2:
+	atomic_inc(&mdev->epoch_size);
+	dec_local(mdev);
+ out1:
+	spin_lock_irq(&mdev->ee_lock);
+	drbd_put_ee(mdev,e);
+	spin_unlock_irq(&mdev->ee_lock);
+	return rv;
 }
 
 STATIC int receive_DataRequest(drbd_dev *mdev,Drbd_Header *h)
@@ -2191,7 +2185,7 @@
 			drbd_set_in_sync(mdev,sector,blksize);
 			__set_bit(SYNC_STARTED,&mdev->flags);
 		} else {
-			req=(drbd_request_t*)(long)p->block_id;
+			req=(drbd_request_t*)(unsigned long)p->block_id;
 
 			if (unlikely(!tl_verify(mdev,req,sector))) {
 				ERR("Got a corrupt block_id/sector pair.\n");
@@ -2239,7 +2233,7 @@
 	drbd_request_t *req;
 	Drbd_BlockAck_Packet *p = (Drbd_BlockAck_Packet*)h;
 
-	req = (drbd_request_t *)(long)p->block_id;
+	req = (drbd_request_t *)(unsigned long)p->block_id;
 	D_ASSERT(req->w.cb == w_is_app_read);
 
 	spin_lock(&mdev->pr_lock);
@@ -2299,7 +2293,7 @@
 		return FALSE;
 	}
 
-	dn->block_id = (long)p->block_id;
+	dn->block_id = p->block_id;
 	dn->seq_num = be32_to_cpu(p->seq_num);
 
 	spin_lock(&mdev->peer_seq_lock);



More information about the drbd-cvs mailing list