|
@@ -1180,6 +1180,7 @@ static void no_space(struct cell *cell)
|
|
|
static void process_discard(struct thin_c *tc, struct bio *bio)
|
|
|
{
|
|
|
int r;
|
|
|
+ unsigned long flags;
|
|
|
struct pool *pool = tc->pool;
|
|
|
struct cell *cell, *cell2;
|
|
|
struct cell_key key, key2;
|
|
@@ -1221,7 +1222,9 @@ static void process_discard(struct thin_c *tc, struct bio *bio)
|
|
|
m->bio = bio;
|
|
|
|
|
|
if (!ds_add_work(&pool->all_io_ds, &m->list)) {
|
|
|
+ spin_lock_irqsave(&pool->lock, flags);
|
|
|
list_add(&m->list, &pool->prepared_discards);
|
|
|
+ spin_unlock_irqrestore(&pool->lock, flags);
|
|
|
wake_worker(pool);
|
|
|
}
|
|
|
} else {
|
|
@@ -2629,8 +2632,10 @@ static int thin_endio(struct dm_target *ti,
|
|
|
if (h->all_io_entry) {
|
|
|
INIT_LIST_HEAD(&work);
|
|
|
ds_dec(h->all_io_entry, &work);
|
|
|
+ spin_lock_irqsave(&pool->lock, flags);
|
|
|
list_for_each_entry_safe(m, tmp, &work, list)
|
|
|
list_add(&m->list, &pool->prepared_discards);
|
|
|
+ spin_unlock_irqrestore(&pool->lock, flags);
|
|
|
}
|
|
|
|
|
|
mempool_free(h, pool->endio_hook_pool);
|