[DRBD-cvs] svn commit by phil - r2308 - trunk/drbd - Now tl_clear() never exposes mdev->oldest_barrier == 0

drbd-cvs at lists.linbit.com drbd-cvs at lists.linbit.com
Mon Jul 31 11:33:30 CEST 2006


Author: phil
Date: 2006-07-31 11:33:28 +0200 (Mon, 31 Jul 2006)
New Revision: 2308

Modified:
   trunk/drbd/drbd_main.c
Log:
Now tl_clear() never exposes 
mdev->oldest_barrier == 0 or
mdev->newerst_barrier == 0
.


Modified: trunk/drbd/drbd_main.c
===================================================================
--- trunk/drbd/drbd_main.c	2006-07-28 13:33:13 UTC (rev 2307)
+++ trunk/drbd/drbd_main.c	2006-07-31 09:33:28 UTC (rev 2308)
@@ -341,66 +341,70 @@
 	return r;
 }
 
-void tl_clear(drbd_dev *mdev)
+STATIC void tl_clear_barrier(drbd_dev *mdev, struct list_head *requests)
 {
-	struct list_head *le,*tle;
-	struct drbd_barrier *b,*f;
+	struct list_head *le, *tle;
 	struct drbd_request *r;
 	sector_t sector;
 	unsigned int size;
 
+	list_for_each_safe(le, tle, requests) {
+		r = list_entry(le, struct drbd_request,tl_requests);
+		// bi_size and bi_sector are modified in bio_endio!
+		sector = drbd_req_get_sector(r);
+		size   = drbd_req_get_size(r);
+		
+		if( r->rq_status & RQ_DRBD_ON_WIRE &&
+		    mdev->net_conf->wire_protocol != DRBD_PROT_A ) {
+			dec_ap_pending(mdev);
+		}
+		
+		if( !(r->rq_status & RQ_DRBD_SENT) ) {
+			drbd_end_req(r,RQ_DRBD_SENT,ERF_NOTLD|1, sector);
+			goto mark;
+		}
+		if(mdev->net_conf->wire_protocol != DRBD_PROT_C ) {
+		mark:
+			drbd_set_out_of_sync(mdev, sector, size);
+		}
+	}
+}
+
+void tl_clear(drbd_dev *mdev)
+{
+	struct list_head tmp;
+	struct drbd_barrier *b,*f;
+
 	WARN("tl_clear()\n");
+	INIT_LIST_HEAD(&tmp);
 
 	spin_lock_irq(&mdev->tl_lock);
 
-	b=mdev->oldest_barrier;
-	mdev->oldest_barrier = NULL;
-	mdev->newest_barrier = NULL; 
+	f = mdev->oldest_barrier;
+	b = f->next;
 
+	// mdev->oldest_barrier = f;
+	mdev->newest_barrier = f;
+
+	list_add(&tmp,&f->requests);
+	list_del_init(&f->requests);
+
+	f->next=NULL;
+	f->br_number=4711;
+	f->n_req=0;
+
 	spin_unlock_irq(&mdev->tl_lock);
 
-	while ( 1 ) {
-		list_for_each_safe(le, tle, &b->requests) {
-			r = list_entry(le, struct drbd_request,tl_requests);
-			// bi_size and bi_sector are modified in bio_endio!
-			sector = drbd_req_get_sector(r);
-			size   = drbd_req_get_size(r);
-			
-			if( r->rq_status & RQ_DRBD_ON_WIRE &&
-			    mdev->net_conf->wire_protocol != DRBD_PROT_A ) {
-				dec_ap_pending(mdev);
-			}
+	tl_clear_barrier(mdev,&tmp);
 
-			if( !(r->rq_status & RQ_DRBD_SENT) ) {
-				drbd_end_req(r,RQ_DRBD_SENT,ERF_NOTLD|1, sector);
-				goto mark;
-			}
-			if(mdev->net_conf->wire_protocol != DRBD_PROT_C ) {
-			mark:
-				drbd_set_out_of_sync(mdev, sector, size);
-			}
-		}
+	while ( b ) {
+		tl_clear_barrier(mdev,&b->requests);
 		f=b;
 		b=b->next;
 		list_del(&f->requests);
-		if (!b) break;
 		kfree(f);
 		dec_ap_pending(mdev); // for the barrier
 	}
-
-	// f is now the last barrier, we use it as new first barrier.
-
-	INIT_LIST_HEAD(&f->requests);
-	f->next=NULL;
-	f->br_number=4711;
-	f->n_req=0;
-
-	spin_lock_irq(&mdev->tl_lock);
-
-	mdev->oldest_barrier = f;
-	mdev->newest_barrier = f;
-
-	spin_unlock_irq(&mdev->tl_lock);
 }
 
 STATIC unsigned int ee_hash_fn(drbd_dev *mdev, sector_t sector)



More information about the drbd-cvs mailing list