[DRBD-cvs] drbd by phil; * Added missing inc_local() / dec_local(...

drbd-user@lists.linbit.com drbd-user@lists.linbit.com
Wed, 18 Feb 2004 13:21:23 +0100 (CET)


DRBD CVS committal

Author  : phil
Module  : drbd

Dir     : drbd/drbd


Modified Files:
      Tag: rel-0_7-branch
	drbd_actlog.c drbd_dsender.c drbd_int.h drbd_main.c 
	drbd_req-2.4.c 


Log Message:
* Added missing inc_local() / dec_local() in drbd_al_to_on_disk_bm()
* fixed bio_endio() in drbd_read_bi_end_io() 
* added missing dec_locl()

[ Basically debugged LGE's last patch. Now everything works (at least
  on Linux-2.6.x) ]

===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/Attic/drbd_actlog.c,v
retrieving revision 1.1.2.71
retrieving revision 1.1.2.72
diff -u -3 -r1.1.2.71 -r1.1.2.72
--- drbd_actlog.c	15 Feb 2004 14:40:10 -0000	1.1.2.71
+++ drbd_actlog.c	18 Feb 2004 12:21:17 -0000	1.1.2.72
@@ -382,6 +382,10 @@
 
 	wait_event(mdev->al_wait, lc_try_lock(mdev->act_log));
 
+	i=inc_local_md_only(mdev);
+	D_ASSERT( i ); // Assertions should not have side effects.
+	// I do not want to have D_ASSERT( inc_local_md_only(mdev) );
+
 	for(i=0;i<mdev->act_log->nr_elements;i++) {
 		enr = lc_entry(mdev->act_log,i)->lc_number;
 		if(enr == LC_FREE) continue;
@@ -390,6 +394,7 @@
 
 	lc_unlock(mdev->act_log);
 	wake_up(&mdev->al_wait);
+	dec_local(mdev);
 }
 
 /**
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/Attic/drbd_dsender.c,v
retrieving revision 1.1.2.76
retrieving revision 1.1.2.77
diff -u -3 -r1.1.2.76 -r1.1.2.77
--- drbd_dsender.c	16 Feb 2004 20:39:00 -0000	1.1.2.76
+++ drbd_dsender.c	18 Feb 2004 12:21:17 -0000	1.1.2.77
@@ -175,7 +175,7 @@
 		req->w.cb = w_read_retry_remote;
 		drbd_queue_work(mdev,&mdev->data.work,&req->w);
 	} else {
-		bh->b_end_io(bh,uptodate);
+		bh->b_end_io(req->master_bio,uptodate);
 
 		INVALIDATE_MAGIC(req);
 		mempool_free(req,drbd_request_mempool);
@@ -329,11 +329,13 @@
 		req->w.cb = w_read_retry_remote;
 		drbd_queue_work(mdev,&mdev->data.work,&req->w);
 	} else {
-		bio_endio(bio,bio->bi_size,error);
+		bio_endio(req->master_bio,req->master_bio->bi_size,error);
 
 		INVALIDATE_MAGIC(req);
 		mempool_free(req,drbd_request_mempool);
 	}
+
+	dec_local(mdev);
 	return 0;
 }
 #endif
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_int.h,v
retrieving revision 1.58.2.127
retrieving revision 1.58.2.128
diff -u -3 -r1.58.2.127 -r1.58.2.128
--- drbd_int.h	17 Feb 2004 09:10:35 -0000	1.58.2.127
+++ drbd_int.h	18 Feb 2004 12:21:17 -0000	1.58.2.128
@@ -235,6 +235,7 @@
 #define RQ_DRBD_SENT      0x0010
 #define RQ_DRBD_LOCAL     0x0020
 #define RQ_DRBD_DONE      0x0030
+#define RQ_DRBD_IN_TL     0x0040
 
 enum MetaDataFlags {
 	MDF_Consistent   = 1,
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_main.c,v
retrieving revision 1.73.2.131
retrieving revision 1.73.2.132
diff -u -3 -r1.73.2.131 -r1.73.2.132
--- drbd_main.c	17 Feb 2004 09:10:35 -0000	1.73.2.131
+++ drbd_main.c	18 Feb 2004 12:21:18 -0000	1.73.2.132
@@ -811,6 +811,7 @@
 	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);
 
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_req-2.4.c,v
retrieving revision 1.33.2.55
retrieving revision 1.33.2.56
diff -u -3 -r1.33.2.55 -r1.33.2.56
--- drbd_req-2.4.c	16 Feb 2004 20:39:00 -0000	1.33.2.55
+++ drbd_req-2.4.c	18 Feb 2004 12:21:18 -0000	1.33.2.56
@@ -69,13 +69,16 @@
 	end_it:
 	spin_unlock_irqrestore(&mdev->req_lock,flags);
 
-	if( ! ( er_flags & ERF_NOTLD ) ) {
-		/*If this call is from tl_clear() we may not call tl_dependene,
-		  otherwhise we have a homegrown spinlock deadlock.   */
-		if(tl_dependence(mdev,req))
-			set_bit(ISSUE_BARRIER,&mdev->flags);
-	} else {
-		list_del(&req->w.list); // we have the tl_lock...
+	if( req->rq_status & RQ_DRBD_IN_TL ) {
+		if( ! ( er_flags & ERF_NOTLD ) ) {
+			/*If this call is from tl_clear() we may not call 
+			  tl_dependene, otherwhise we have a homegrown 
+			  spinlock deadlock.   */
+			if(tl_dependence(mdev,req))
+				set_bit(ISSUE_BARRIER,&mdev->flags);
+		} else {
+			list_del(&req->w.list); // we have the tl_lock...
+		}
 	}
 
 	if(mdev->conf.wire_protocol==DRBD_PROT_C && mdev->cstate > Connected) {