[DRBD-cvs] drbd by phil; * It could happen that we lost one of ou...

drbd-user@lists.linbit.com drbd-user@lists.linbit.com
Fri, 7 May 2004 17:18:34 +0200 (CEST)


DRBD CVS committal

Author  : phil
Module  : drbd

Dir     : drbd/drbd


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


Log Message:
* It could happen that we lost one of our requests in the process of
  a disconnect. -- Fixed that. -> look at tl_cancel()
* In drbd_disconnect() we wait until everyone who sleeps in drbd_send_dblock()
  has actually exited.

===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_fs.c,v
retrieving revision 1.28.2.85
retrieving revision 1.28.2.86
diff -u -3 -r1.28.2.85 -r1.28.2.86
--- drbd_fs.c	5 May 2004 13:25:15 -0000	1.28.2.85
+++ drbd_fs.c	7 May 2004 15:18:28 -0000	1.28.2.86
@@ -570,6 +570,12 @@
 		return -EINTR;
 	}
 
+	/* FIXME RACE here: if our direct user is not using bd_claim (i.e. 
+	 *  not a filesystem) since cstate might still be >= Connected, new 
+	 * ap requests may come in and increase ap_pending_cnt again!
+	 * but that means someone is misusing DRBD...
+	 * */
+
 	mdev->state = (Drbd_State) newstate & 0x03;
 	if(newstate & Primary) {
 		NOT_IN_26( set_device_ro(MKDEV(MAJOR_NR, minor), FALSE ); )
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_main.c,v
retrieving revision 1.73.2.166
retrieving revision 1.73.2.167
diff -u -3 -r1.73.2.166 -r1.73.2.167
--- drbd_main.c	7 May 2004 13:14:34 -0000	1.73.2.166
+++ drbd_main.c	7 May 2004 15:18:28 -0000	1.73.2.167
@@ -210,8 +210,13 @@
 	b->n_req--;
 
 	list_del(&item->w.list);
+	item->rq_status &= ~RQ_DRBD_IN_TL;
 
 	spin_unlock_irq(&mdev->tl_lock);
+	drbd_end_req(item,RQ_DRBD_SENT,ERF_NOTLD|1, drbd_req_get_sector(item));
+	drbd_set_out_of_sync(mdev,
+			     drbd_req_get_sector(item),
+			     drbd_req_get_size(item));
 }
 
 STATIC unsigned int tl_add_barrier(drbd_dev *mdev)
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_receiver.c,v
retrieving revision 1.97.2.149
retrieving revision 1.97.2.150
diff -u -3 -r1.97.2.149 -r1.97.2.150
--- drbd_receiver.c	7 May 2004 09:32:44 -0000	1.97.2.149
+++ drbd_receiver.c	7 May 2004 15:18:28 -0000	1.97.2.150
@@ -1484,16 +1484,20 @@
 	drbd_free_sock(mdev);
 	up(&mdev->data.mutex);
 
-	drbd_thread_stop(&mdev->worker);
-
 	drbd_fail_pending_reads(mdev);
+	drbd_thread_stop(&mdev->worker);
 	drbd_rs_cancel_all(mdev);
 
-	tl_clear(mdev);
-	clear_bit(ISSUE_BARRIER,&mdev->flags);
+	// secondary
 	drbd_wait_ee(mdev,&mdev->active_ee);
 	drbd_wait_ee(mdev,&mdev->sync_ee);
 	drbd_clear_done_ee(mdev);
+
+	// primary
+	tl_clear(mdev);
+	clear_bit(ISSUE_BARRIER,&mdev->flags);
+	wait_event( mdev->cstate_wait, atomic_read(&mdev->ap_pending_cnt) == 0 );
+	D_ASSERT(mdev->oldest_barrier->n_req == 0);
 
 	D_ASSERT(mdev->ee_in_use == 0);
 	D_ASSERT(list_empty(&mdev->read_ee)); // done by termination of worker
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_req-2.4.c,v
retrieving revision 1.33.2.73
retrieving revision 1.33.2.74
diff -u -3 -r1.33.2.73 -r1.33.2.74
--- drbd_req-2.4.c	7 May 2004 13:14:34 -0000	1.33.2.73
+++ drbd_req-2.4.c	7 May 2004 15:18:28 -0000	1.33.2.74
@@ -122,7 +122,6 @@
 	spin_lock(&mdev->pr_lock);
 	list_add(&req->w.list,&mdev->app_reads);
 	spin_unlock(&mdev->pr_lock);
-	inc_ap_pending(mdev);
 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
 	rv=drbd_send_drequest(mdev, DataRequest, bio->b_rsector, bio->b_size,
 			      (unsigned long)req);
@@ -278,21 +277,15 @@
 		 * or READ, and no local disk,
 		 * or READ, but not in sync.
 		 */
+		inc_ap_pending(mdev);
 		if (rw == WRITE) {
-			/* Syncronization with the syncer is done
-			 * via drbd_[rs|al]_[begin|end]_io()
-			 */
-			if(mdev->conf.wire_protocol != DRBD_PROT_A) {
-				inc_ap_pending(mdev);
-			}
-
 			if (!drbd_send_dblock(mdev,req)) {
 				if (mdev->cstate >= Connected)
 					set_cstate(mdev,NetworkFailure);
 				drbd_thread_restart_nowait(&mdev->receiver);
-				if(mdev->conf.wire_protocol != DRBD_PROT_A) {
-					dec_ap_pending(mdev,HERE);
-				}
+				dec_ap_pending(mdev,HERE);
+			} else if(mdev->conf.wire_protocol == DRBD_PROT_A) {
+				dec_ap_pending(mdev,HERE);
 			}
 		} else if (target_area_out_of_sync) {
 			drbd_read_remote(mdev,req);