[DRBD-cvs] drbd by phil; Preparing everything for the device_mute...

drbd-user@lists.linbit.com drbd-user@lists.linbit.com
Fri, 7 May 2004 15:14:39 +0200 (CEST)


DRBD CVS committal

Author  : phil
Module  : drbd

Dir     : drbd/drbd


Modified Files:
      Tag: rel-0_7-branch
	drbd_main.c drbd_req-2.4.c 


Log Message:
Preparing everything for the device_mutex change...

===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_main.c,v
retrieving revision 1.73.2.165
retrieving revision 1.73.2.166
diff -u -3 -r1.73.2.165 -r1.73.2.166
--- drbd_main.c	7 May 2004 09:32:44 -0000	1.73.2.165
+++ drbd_main.c	7 May 2004 13:14:34 -0000	1.73.2.166
@@ -200,6 +200,20 @@
 	spin_unlock_irq(&mdev->tl_lock);
 }
 
+STATIC void tl_cancel(drbd_dev *mdev, drbd_request_t * item)
+{
+	struct drbd_barrier *b;
+
+	spin_lock_irq(&mdev->tl_lock);
+
+	b=item->barrier;
+	b->n_req--;
+
+	list_del(&item->w.list);
+
+	spin_unlock_irq(&mdev->tl_lock);
+}
+
 STATIC unsigned int tl_add_barrier(drbd_dev *mdev)
 {
 	unsigned int bnr;
@@ -824,7 +838,7 @@
 // Used to send write requests: bh->b_rsector !!
 int drbd_send_dblock(drbd_dev *mdev, drbd_request_t *req)
 {
-	int ok;
+	int ok=1;
 	sigset_t old_blocked;
 	Drbd_Data_Packet p;
 
@@ -869,16 +883,22 @@
 	spin_unlock(&mdev->send_task_lock);
 
 	if(test_and_clear_bit(ISSUE_BARRIER,&mdev->flags))
-		_drbd_send_barrier(mdev);
-	tl_add(mdev,req);
-	req->rq_status |= RQ_DRBD_IN_TL;
-
-	ok =  (drbd_send(mdev,mdev->data.socket,&p,sizeof(p),MSG_MORE) == sizeof(p))
-	   && _drbd_send_zc_bio(mdev,&req->private_bio);
+		ok = _drbd_send_barrier(mdev);
+	if(ok) {
+		tl_add(mdev,req);
+		req->rq_status |= RQ_DRBD_IN_TL;
+
+		ok = (drbd_send(mdev,mdev->data.socket,&p,sizeof(p),MSG_MORE) == sizeof(p));
+		if(ok) {
+			ok = _drbd_send_zc_bio(mdev,&req->private_bio);
+		}
+		if(!ok) tl_cancel(mdev,req);
 
+	}
 	spin_lock(&mdev->send_task_lock);
 	mdev->send_task=NULL;
 	spin_unlock(&mdev->send_task_lock);
+
 	up(&mdev->data.mutex);
 	restore_old_sigset(old_blocked);
 	return ok;
@@ -1373,22 +1393,21 @@
 			if (mdev->mbds_id) bm_cleanup(mdev->mbds_id);
 			if (mdev->resync) lc_free(mdev->resync);
 
+			D_ASSERT(mdev->ee_in_use==0);
 			drbd_release_ee(mdev,&mdev->free_ee);
 			rr = drbd_release_ee(mdev,&mdev->active_ee);
-			if(rr) printk(KERN_ERR DEVICE_NAME
-				       "%d: %d EEs in active list found!\n",i,rr);
+			if(rr) ERR("%d: %d EEs in active list found!\n",i,rr);
 
 			rr = drbd_release_ee(mdev,&mdev->sync_ee);
-			if(rr) printk(KERN_ERR DEVICE_NAME
-				       "%d: %d EEs in sync list found!\n",i,rr);
+			if(rr) ERR("%d: %d EEs in sync list found!\n",i,rr);
 
 			rr = drbd_release_ee(mdev,&mdev->done_ee);
-			if(rr) printk(KERN_ERR DEVICE_NAME
-				       "%d: %d EEs in done list found!\n",i,rr);
+			if(rr) ERR("%d: %d EEs in done list found!\n",i,rr);
 
 			rr = drbd_release_ee(mdev,&mdev->read_ee);
-			if(rr) printk(KERN_ERR DEVICE_NAME
-				       "%d: %d EEs in read list found!\n",i,rr);
+			if(rr) ERR("%d: %d EEs in read list found!\n",i,rr);
+
+			D_ASSERT(mdev->ee_vacant==0);
 
 			if (mdev->md_io_page)
 				__free_page(mdev->md_io_page);
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_req-2.4.c,v
retrieving revision 1.33.2.72
retrieving revision 1.33.2.73
diff -u -3 -r1.33.2.72 -r1.33.2.73
--- drbd_req-2.4.c	7 May 2004 10:13:39 -0000	1.33.2.72
+++ drbd_req-2.4.c	7 May 2004 13:14:34 -0000	1.33.2.73
@@ -248,6 +248,10 @@
 	} else {
 		remote = 1;
 	}
+
+	if (rw == WRITE && local)
+		drbd_al_begin_io(mdev, sector);
+
 	remote = remote && (mdev->cstate >= Connected)
 			&& !test_bit(PARTNER_DISKLESS,&mdev->flags);
 
@@ -266,21 +270,8 @@
 	if (!remote)
 		req->rq_status |= RQ_DRBD_SENT;
 
-	/* THINK
-	 * maybe we need to
-	 *   if (rw == WRITE) drbd_al_begin_io(mdev, sector);
-	 * right here already?
-	 */
-
 	/* we need to plug ALWAYS since we possibly need to kick lo_dev */
 	drbd_plug_device(mdev);
-	if (rw == WRITE && local)
-		drbd_al_begin_io(mdev, sector);
-
-	/* since we possibly waited, we have a race: mdev may have
-	 * changed underneath us. Thats why I want to have a read lock
-	 * on it, and every state change of mdev needs to be done with a
-	 * write lock on it! */
 
 	if (remote) {
 		/* either WRITE and Connected,
@@ -294,10 +285,7 @@
 			if(mdev->conf.wire_protocol != DRBD_PROT_A) {
 				inc_ap_pending(mdev);
 			}
-			/* THINK drbd_send_dblock has a return value,
-			 * but we ignore it here. Is it actually void,
-			 * because error handling takes place elsewhere?
-			 */
+
 			if (!drbd_send_dblock(mdev,req)) {
 				if (mdev->cstate >= Connected)
 					set_cstate(mdev,NetworkFailure);