summaryrefslogtreecommitdiff
path: root/drivers/md/dm-thin.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/md/dm-thin.c')
-rw-r--r--drivers/md/dm-thin.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c
index 13d4677baafd..00323428919e 100644
--- a/drivers/md/dm-thin.c
+++ b/drivers/md/dm-thin.c
@@ -883,15 +883,17 @@ static void cell_defer_no_holder(struct thin_c *tc, struct dm_bio_prison_cell *c
{
struct pool *pool = tc->pool;
unsigned long flags;
- int has_work;
+ struct bio_list bios;
- spin_lock_irqsave(&tc->lock, flags);
- cell_release_no_holder(pool, cell, &tc->deferred_bio_list);
- has_work = !bio_list_empty(&tc->deferred_bio_list);
- spin_unlock_irqrestore(&tc->lock, flags);
+ bio_list_init(&bios);
+ cell_release_no_holder(pool, cell, &bios);
- if (has_work)
+ if (!bio_list_empty(&bios)) {
+ spin_lock_irqsave(&tc->lock, flags);
+ bio_list_merge(&tc->deferred_bio_list, &bios);
+ spin_unlock_irqrestore(&tc->lock, flags);
wake_worker(pool);
+ }
}
static void thin_defer_bio(struct thin_c *tc, struct bio *bio);