drbd: don't cond_resched_lock with IRQs disabled
authorLars Ellenberg <lars.ellenberg@linbit.com>
Mon, 6 Jun 2011 09:31:42 +0000 (11:31 +0200)
committerPhilipp Reisner <philipp.reisner@linbit.com>
Thu, 30 Jun 2011 07:23:42 +0000 (09:23 +0200)
The last commit, drbd: add missing spinlock to bitmap receive,
introduced a cond_resched_lock(), where the lock in question is taken
with irqs disabled.

As we must not schedule with IRQs disabled,
and cond_resched_lock_irq() does not exist, yet,
we re-aquire the spin_lock_irq() for each bitmap page processed in turn.

Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
drivers/block/drbd/drbd_bitmap.c

index 1e89a74ddb172e07c9af3e568a9e5d82b735cfec..61f4fae9f67e2ba0d50febff7b0311597f463764 100644 (file)
@@ -1400,8 +1400,10 @@ void _drbd_bm_set_bits(struct drbd_conf *mdev, const unsigned long s, const unsi
        /* first and full pages, unless first page == last page */
        for (page_nr = first_page; page_nr < last_page; page_nr++) {
                bm_set_full_words_within_one_page(mdev->bitmap, page_nr, first_word, last_word);
-               cond_resched_lock(&b->bm_lock);
+               spin_unlock_irq(&b->bm_lock);
+               cond_resched();
                first_word = 0;
+               spin_lock_irq(&b->bm_lock);
        }
 
        /* last page (respectively only page, for first page == last page) */