[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