Commit 127b3178 authored by Philipp Reisner's avatar Philipp Reisner

drbd: use test_and_set_bit() to decide if bm_io_work should be queued

Signed-off-by: default avatarPhilipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: default avatarLars Ellenberg <lars.ellenberg@linbit.com>
parent aeda1cd6
...@@ -3772,6 +3772,7 @@ static int w_bitmap_io(struct drbd_conf *mdev, struct drbd_work *w, int unused) ...@@ -3772,6 +3772,7 @@ static int w_bitmap_io(struct drbd_conf *mdev, struct drbd_work *w, int unused)
drbd_bm_unlock(mdev); drbd_bm_unlock(mdev);
clear_bit(BITMAP_IO, &mdev->flags); clear_bit(BITMAP_IO, &mdev->flags);
smp_mb__after_clear_bit();
wake_up(&mdev->misc_wait); wake_up(&mdev->misc_wait);
if (work->done) if (work->done)
...@@ -3850,11 +3851,8 @@ void drbd_queue_bitmap_io(struct drbd_conf *mdev, ...@@ -3850,11 +3851,8 @@ void drbd_queue_bitmap_io(struct drbd_conf *mdev,
set_bit(BITMAP_IO, &mdev->flags); set_bit(BITMAP_IO, &mdev->flags);
if (atomic_read(&mdev->ap_bio_cnt) == 0) { if (atomic_read(&mdev->ap_bio_cnt) == 0) {
if (list_empty(&mdev->bm_io_work.w.list)) { if (!test_and_set_bit(BITMAP_IO_QUEUED, &mdev->flags))
set_bit(BITMAP_IO_QUEUED, &mdev->flags);
drbd_queue_work(&mdev->data.work, &mdev->bm_io_work.w); drbd_queue_work(&mdev->data.work, &mdev->bm_io_work.w);
} else
dev_err(DEV, "FIXME avoided double queuing bm_io_work\n");
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment