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;
                        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 {
        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);