[DRBD-cvs] svn commit by phil - r2319 - trunk/drbd - Fixed the ASSERTS. The w_try_send_barrier() was simply

drbd-cvs at lists.linbit.com drbd-cvs at lists.linbit.com
Tue Aug 1 12:06:04 CEST 2006


Author: phil
Date: 2006-08-01 12:06:03 +0200 (Tue, 01 Aug 2006)
New Revision: 2319

Modified:
   trunk/drbd/drbd_int.h
   trunk/drbd/drbd_main.c
   trunk/drbd/drbd_req.c
   trunk/drbd/drbd_worker.c
Log:
Fixed the ASSERTS. The w_try_send_barrier() was simply wrong.


Modified: trunk/drbd/drbd_int.h
===================================================================
--- trunk/drbd/drbd_int.h	2006-08-01 07:52:45 UTC (rev 2318)
+++ trunk/drbd/drbd_int.h	2006-08-01 10:06:03 UTC (rev 2319)
@@ -749,7 +749,6 @@
 	volatile unsigned long last_received; // in jiffies, either socket
 	volatile unsigned int ko_count;
 	struct drbd_work  resync_work,
-			  barrier_work,
 			  unplug_work,
 	                  md_sync_work;
 	struct timer_list resync_timer;

Modified: trunk/drbd/drbd_main.c
===================================================================
--- trunk/drbd/drbd_main.c	2006-08-01 07:52:45 UTC (rev 2318)
+++ trunk/drbd/drbd_main.c	2006-08-01 10:06:03 UTC (rev 2319)
@@ -231,35 +231,9 @@
 }
 
 /**
- * tl_add_barrier: Creates a new barrier object and links it into the
- * transfer log. It returns the the newest (but not the just created 
- * barrier to the caller.
+ * _tl_add_barrier: Adds a barrier to the TL. It returns the the newest 
+ * (but not the just created barrier) to the caller.
  */
-struct drbd_barrier *tl_add_barrier(drbd_dev *mdev)
-{
-	struct drbd_barrier *new, *newest_before;
-
-	new=kmalloc(sizeof(struct drbd_barrier),GFP_NOIO);
-	if(!new) {
-		ERR("could not kmalloc() barrier\n");
-		return 0;
-	}
-	INIT_LIST_HEAD(&new->requests);
-	new->next=0;
-	new->n_req=0;
-
-	spin_lock_irq(&mdev->tl_lock);
-	/* mdev->newest_barrier == NULL "cannot happen". but anyways... */
-	newest_before = mdev->newest_barrier;
-	/* never send a barrier number == 0 */
-	new->br_number = (newest_before->br_number+1) ?: 1;
-	mdev->newest_barrier->next = new;
-	mdev->newest_barrier = new;
-	spin_unlock_irq(&mdev->tl_lock);
-
-	return newest_before;
-}
-
 struct drbd_barrier *_tl_add_barrier(drbd_dev *mdev,struct drbd_barrier *new)
 {
 	struct drbd_barrier *newest_before;
@@ -2016,12 +1990,10 @@
 	INIT_LIST_HEAD(&mdev->data.work.q);
 	INIT_LIST_HEAD(&mdev->meta.work.q);
 	INIT_LIST_HEAD(&mdev->resync_work.list);
-	INIT_LIST_HEAD(&mdev->barrier_work.list);
 	INIT_LIST_HEAD(&mdev->unplug_work.list);
 	INIT_LIST_HEAD(&mdev->md_sync_work.list);
 	INIT_LIST_HEAD(&mdev->discard);
 	mdev->resync_work.cb  = w_resync_inactive;
-	mdev->barrier_work.cb = w_try_send_barrier;
 	mdev->unplug_work.cb  = w_send_write_hint;
 	mdev->md_sync_work.cb = w_md_sync;
 	init_timer(&mdev->resync_timer);
@@ -2132,7 +2104,6 @@
 	D_ASSERT(list_empty(&mdev->data.work.q));
 	D_ASSERT(list_empty(&mdev->meta.work.q));
 	D_ASSERT(list_empty(&mdev->resync_work.list));
-	D_ASSERT(list_empty(&mdev->barrier_work.list));
 	D_ASSERT(list_empty(&mdev->unplug_work.list));
 
 	drbd_set_defaults(mdev);

Modified: trunk/drbd/drbd_req.c
===================================================================
--- trunk/drbd/drbd_req.c	2006-08-01 07:52:45 UTC (rev 2318)
+++ trunk/drbd/drbd_req.c	2006-08-01 10:06:03 UTC (rev 2319)
@@ -57,6 +57,7 @@
 	   Try to get the locking right :) */
 
 	struct Drbd_Conf* mdev = drbd_req_get_mdev(req);
+	struct drbd_barrier *b;
 	unsigned long flags=0;
 	int uptodate;
 
@@ -124,12 +125,17 @@
 	drbd_req_free(req);
 
  out:
-	if (test_bit(ISSUE_BARRIER,&mdev->flags)) {
-		spin_lock_irqsave(&mdev->data.work.q_lock,flags);
-		if(list_empty(&mdev->barrier_work.list)) {
-			_drbd_queue_work(&mdev->data.work,&mdev->barrier_work);
+	b = kmalloc(sizeof(struct drbd_barrier),GFP_NOIO);
+	if(b) {
+		spin_lock_irq(&mdev->tl_lock);
+		if(test_and_clear_bit(ISSUE_BARRIER,&mdev->flags)) {
+			b = _tl_add_barrier(mdev,b);
+			b->w.cb =  w_send_barrier;
+			drbd_queue_work(&mdev->data.work, &b->w);
+		} else {
+			kfree(b);
 		}
-		spin_unlock_irqrestore(&mdev->data.work.q_lock,flags);
+		spin_unlock_irq(&mdev->tl_lock);
 	}
 }
 
@@ -379,6 +385,7 @@
 					local=0;
 
 					drbd_end_req(req, RQ_DRBD_DONE, 1, sector);
+					if(b) kfree(b);
 					return 0;
 				}
 			} else {

Modified: trunk/drbd/drbd_worker.c
===================================================================
--- trunk/drbd/drbd_worker.c	2006-08-01 07:52:45 UTC (rev 2318)
+++ trunk/drbd/drbd_worker.c	2006-08-01 10:06:03 UTC (rev 2319)
@@ -518,21 +518,6 @@
 	return ok;
 }
 
-int w_try_send_barrier(drbd_dev *mdev, struct drbd_work *w, int cancel)
-{
-	int ok=1;
-
-	if(unlikely(cancel)) return ok;
-
-	down(&mdev->data.mutex);
-	if(test_and_clear_bit(ISSUE_BARRIER,&mdev->flags)) {
-		ok = _drbd_send_barrier(mdev,tl_add_barrier(mdev));
-	}
-	up(&mdev->data.mutex);
-
-	return ok;
-}
-
 int w_send_barrier(drbd_dev *mdev, struct drbd_work *w, int cancel)
 {
 	struct drbd_barrier *b = (struct drbd_barrier *)w;



More information about the drbd-cvs mailing list