Commit 59c3d2c6 authored by Mikulas Patocka's avatar Mikulas Patocka Committed by Alasdair G Kergon

dm thin: dont use map_context

This patch removes endio_hook_pool from dm-thin and uses per-bio data instead.

This patch removes any use of map_info in preparation for the next patch
that removes map_info from bio-based device mapper.
Signed-off-by: default avatarMikulas Patocka <mpatocka@redhat.com>
Signed-off-by: default avatarAlasdair G Kergon <agk@redhat.com>
parent 0045d61b
...@@ -186,7 +186,6 @@ struct pool { ...@@ -186,7 +186,6 @@ struct pool {
struct dm_thin_new_mapping *next_mapping; struct dm_thin_new_mapping *next_mapping;
mempool_t *mapping_pool; mempool_t *mapping_pool;
mempool_t *endio_hook_pool;
process_bio_fn process_bio; process_bio_fn process_bio;
process_bio_fn process_discard; process_bio_fn process_discard;
...@@ -304,7 +303,7 @@ static void __requeue_bio_list(struct thin_c *tc, struct bio_list *master) ...@@ -304,7 +303,7 @@ static void __requeue_bio_list(struct thin_c *tc, struct bio_list *master)
bio_list_init(master); bio_list_init(master);
while ((bio = bio_list_pop(&bios))) { while ((bio = bio_list_pop(&bios))) {
struct dm_thin_endio_hook *h = dm_get_mapinfo(bio)->ptr; struct dm_thin_endio_hook *h = dm_per_bio_data(bio, sizeof(struct dm_thin_endio_hook));
if (h->tc == tc) if (h->tc == tc)
bio_endio(bio, DM_ENDIO_REQUEUE); bio_endio(bio, DM_ENDIO_REQUEUE);
...@@ -375,7 +374,7 @@ static void inc_all_io_entry(struct pool *pool, struct bio *bio) ...@@ -375,7 +374,7 @@ static void inc_all_io_entry(struct pool *pool, struct bio *bio)
if (bio->bi_rw & REQ_DISCARD) if (bio->bi_rw & REQ_DISCARD)
return; return;
h = dm_get_mapinfo(bio)->ptr; h = dm_per_bio_data(bio, sizeof(struct dm_thin_endio_hook));
h->all_io_entry = dm_deferred_entry_inc(pool->all_io_ds); h->all_io_entry = dm_deferred_entry_inc(pool->all_io_ds);
} }
...@@ -485,7 +484,7 @@ static void copy_complete(int read_err, unsigned long write_err, void *context) ...@@ -485,7 +484,7 @@ static void copy_complete(int read_err, unsigned long write_err, void *context)
static void overwrite_endio(struct bio *bio, int err) static void overwrite_endio(struct bio *bio, int err)
{ {
unsigned long flags; unsigned long flags;
struct dm_thin_endio_hook *h = dm_get_mapinfo(bio)->ptr; struct dm_thin_endio_hook *h = dm_per_bio_data(bio, sizeof(struct dm_thin_endio_hook));
struct dm_thin_new_mapping *m = h->overwrite_mapping; struct dm_thin_new_mapping *m = h->overwrite_mapping;
struct pool *pool = m->tc->pool; struct pool *pool = m->tc->pool;
...@@ -714,7 +713,7 @@ static void schedule_copy(struct thin_c *tc, dm_block_t virt_block, ...@@ -714,7 +713,7 @@ static void schedule_copy(struct thin_c *tc, dm_block_t virt_block,
* bio immediately. Otherwise we use kcopyd to clone the data first. * bio immediately. Otherwise we use kcopyd to clone the data first.
*/ */
if (io_overwrites_block(pool, bio)) { if (io_overwrites_block(pool, bio)) {
struct dm_thin_endio_hook *h = dm_get_mapinfo(bio)->ptr; struct dm_thin_endio_hook *h = dm_per_bio_data(bio, sizeof(struct dm_thin_endio_hook));
h->overwrite_mapping = m; h->overwrite_mapping = m;
m->bio = bio; m->bio = bio;
...@@ -784,7 +783,7 @@ static void schedule_zero(struct thin_c *tc, dm_block_t virt_block, ...@@ -784,7 +783,7 @@ static void schedule_zero(struct thin_c *tc, dm_block_t virt_block,
process_prepared_mapping(m); process_prepared_mapping(m);
else if (io_overwrites_block(pool, bio)) { else if (io_overwrites_block(pool, bio)) {
struct dm_thin_endio_hook *h = dm_get_mapinfo(bio)->ptr; struct dm_thin_endio_hook *h = dm_per_bio_data(bio, sizeof(struct dm_thin_endio_hook));
h->overwrite_mapping = m; h->overwrite_mapping = m;
m->bio = bio; m->bio = bio;
...@@ -899,7 +898,7 @@ static int alloc_data_block(struct thin_c *tc, dm_block_t *result) ...@@ -899,7 +898,7 @@ static int alloc_data_block(struct thin_c *tc, dm_block_t *result)
*/ */
static void retry_on_resume(struct bio *bio) static void retry_on_resume(struct bio *bio)
{ {
struct dm_thin_endio_hook *h = dm_get_mapinfo(bio)->ptr; struct dm_thin_endio_hook *h = dm_per_bio_data(bio, sizeof(struct dm_thin_endio_hook));
struct thin_c *tc = h->tc; struct thin_c *tc = h->tc;
struct pool *pool = tc->pool; struct pool *pool = tc->pool;
unsigned long flags; unsigned long flags;
...@@ -1051,7 +1050,7 @@ static void process_shared_bio(struct thin_c *tc, struct bio *bio, ...@@ -1051,7 +1050,7 @@ static void process_shared_bio(struct thin_c *tc, struct bio *bio,
if (bio_data_dir(bio) == WRITE && bio->bi_size) if (bio_data_dir(bio) == WRITE && bio->bi_size)
break_sharing(tc, bio, block, &key, lookup_result, cell); break_sharing(tc, bio, block, &key, lookup_result, cell);
else { else {
struct dm_thin_endio_hook *h = dm_get_mapinfo(bio)->ptr; struct dm_thin_endio_hook *h = dm_per_bio_data(bio, sizeof(struct dm_thin_endio_hook));
h->shared_read_entry = dm_deferred_entry_inc(pool->shared_read_ds); h->shared_read_entry = dm_deferred_entry_inc(pool->shared_read_ds);
inc_all_io_entry(pool, bio); inc_all_io_entry(pool, bio);
...@@ -1226,7 +1225,7 @@ static void process_deferred_bios(struct pool *pool) ...@@ -1226,7 +1225,7 @@ static void process_deferred_bios(struct pool *pool)
spin_unlock_irqrestore(&pool->lock, flags); spin_unlock_irqrestore(&pool->lock, flags);
while ((bio = bio_list_pop(&bios))) { while ((bio = bio_list_pop(&bios))) {
struct dm_thin_endio_hook *h = dm_get_mapinfo(bio)->ptr; struct dm_thin_endio_hook *h = dm_per_bio_data(bio, sizeof(struct dm_thin_endio_hook));
struct thin_c *tc = h->tc; struct thin_c *tc = h->tc;
/* /*
...@@ -1359,17 +1358,14 @@ static void thin_defer_bio(struct thin_c *tc, struct bio *bio) ...@@ -1359,17 +1358,14 @@ static void thin_defer_bio(struct thin_c *tc, struct bio *bio)
wake_worker(pool); wake_worker(pool);
} }
static struct dm_thin_endio_hook *thin_hook_bio(struct thin_c *tc, struct bio *bio) static void thin_hook_bio(struct thin_c *tc, struct bio *bio)
{ {
struct pool *pool = tc->pool; struct dm_thin_endio_hook *h = dm_per_bio_data(bio, sizeof(struct dm_thin_endio_hook));
struct dm_thin_endio_hook *h = mempool_alloc(pool->endio_hook_pool, GFP_NOIO);
h->tc = tc; h->tc = tc;
h->shared_read_entry = NULL; h->shared_read_entry = NULL;
h->all_io_entry = NULL; h->all_io_entry = NULL;
h->overwrite_mapping = NULL; h->overwrite_mapping = NULL;
return h;
} }
/* /*
...@@ -1386,7 +1382,7 @@ static int thin_bio_map(struct dm_target *ti, struct bio *bio, ...@@ -1386,7 +1382,7 @@ static int thin_bio_map(struct dm_target *ti, struct bio *bio,
struct dm_bio_prison_cell *cell1, *cell2; struct dm_bio_prison_cell *cell1, *cell2;
struct dm_cell_key key; struct dm_cell_key key;
map_context->ptr = thin_hook_bio(tc, bio); thin_hook_bio(tc, bio);
if (get_pool_mode(tc->pool) == PM_FAIL) { if (get_pool_mode(tc->pool) == PM_FAIL) {
bio_io_error(bio); bio_io_error(bio);
...@@ -1595,14 +1591,12 @@ static void __pool_destroy(struct pool *pool) ...@@ -1595,14 +1591,12 @@ static void __pool_destroy(struct pool *pool)
if (pool->next_mapping) if (pool->next_mapping)
mempool_free(pool->next_mapping, pool->mapping_pool); mempool_free(pool->next_mapping, pool->mapping_pool);
mempool_destroy(pool->mapping_pool); mempool_destroy(pool->mapping_pool);
mempool_destroy(pool->endio_hook_pool);
dm_deferred_set_destroy(pool->shared_read_ds); dm_deferred_set_destroy(pool->shared_read_ds);
dm_deferred_set_destroy(pool->all_io_ds); dm_deferred_set_destroy(pool->all_io_ds);
kfree(pool); kfree(pool);
} }
static struct kmem_cache *_new_mapping_cache; static struct kmem_cache *_new_mapping_cache;
static struct kmem_cache *_endio_hook_cache;
static struct pool *pool_create(struct mapped_device *pool_md, static struct pool *pool_create(struct mapped_device *pool_md,
struct block_device *metadata_dev, struct block_device *metadata_dev,
...@@ -1696,13 +1690,6 @@ static struct pool *pool_create(struct mapped_device *pool_md, ...@@ -1696,13 +1690,6 @@ static struct pool *pool_create(struct mapped_device *pool_md,
goto bad_mapping_pool; goto bad_mapping_pool;
} }
pool->endio_hook_pool = mempool_create_slab_pool(ENDIO_HOOK_POOL_SIZE,
_endio_hook_cache);
if (!pool->endio_hook_pool) {
*error = "Error creating pool's endio_hook mempool";
err_p = ERR_PTR(-ENOMEM);
goto bad_endio_hook_pool;
}
pool->ref_count = 1; pool->ref_count = 1;
pool->last_commit_jiffies = jiffies; pool->last_commit_jiffies = jiffies;
pool->pool_md = pool_md; pool->pool_md = pool_md;
...@@ -1711,8 +1698,6 @@ static struct pool *pool_create(struct mapped_device *pool_md, ...@@ -1711,8 +1698,6 @@ static struct pool *pool_create(struct mapped_device *pool_md,
return pool; return pool;
bad_endio_hook_pool:
mempool_destroy(pool->mapping_pool);
bad_mapping_pool: bad_mapping_pool:
dm_deferred_set_destroy(pool->all_io_ds); dm_deferred_set_destroy(pool->all_io_ds);
bad_all_io_ds: bad_all_io_ds:
...@@ -2607,6 +2592,7 @@ static int thin_ctr(struct dm_target *ti, unsigned argc, char **argv) ...@@ -2607,6 +2592,7 @@ static int thin_ctr(struct dm_target *ti, unsigned argc, char **argv)
ti->num_flush_requests = 1; ti->num_flush_requests = 1;
ti->flush_supported = true; ti->flush_supported = true;
ti->per_bio_data_size = sizeof(struct dm_thin_endio_hook);
/* In case the pool supports discards, pass them on. */ /* In case the pool supports discards, pass them on. */
if (tc->pool->pf.discard_enabled) { if (tc->pool->pf.discard_enabled) {
...@@ -2653,7 +2639,7 @@ static int thin_endio(struct dm_target *ti, ...@@ -2653,7 +2639,7 @@ static int thin_endio(struct dm_target *ti,
union map_info *map_context) union map_info *map_context)
{ {
unsigned long flags; unsigned long flags;
struct dm_thin_endio_hook *h = map_context->ptr; struct dm_thin_endio_hook *h = dm_per_bio_data(bio, sizeof(struct dm_thin_endio_hook));
struct list_head work; struct list_head work;
struct dm_thin_new_mapping *m, *tmp; struct dm_thin_new_mapping *m, *tmp;
struct pool *pool = h->tc->pool; struct pool *pool = h->tc->pool;
...@@ -2683,8 +2669,6 @@ static int thin_endio(struct dm_target *ti, ...@@ -2683,8 +2669,6 @@ static int thin_endio(struct dm_target *ti,
} }
} }
mempool_free(h, pool->endio_hook_pool);
return 0; return 0;
} }
...@@ -2813,14 +2797,8 @@ static int __init dm_thin_init(void) ...@@ -2813,14 +2797,8 @@ static int __init dm_thin_init(void)
if (!_new_mapping_cache) if (!_new_mapping_cache)
goto bad_new_mapping_cache; goto bad_new_mapping_cache;
_endio_hook_cache = KMEM_CACHE(dm_thin_endio_hook, 0);
if (!_endio_hook_cache)
goto bad_endio_hook_cache;
return 0; return 0;
bad_endio_hook_cache:
kmem_cache_destroy(_new_mapping_cache);
bad_new_mapping_cache: bad_new_mapping_cache:
dm_unregister_target(&pool_target); dm_unregister_target(&pool_target);
bad_pool_target: bad_pool_target:
...@@ -2835,7 +2813,6 @@ static void dm_thin_exit(void) ...@@ -2835,7 +2813,6 @@ static void dm_thin_exit(void)
dm_unregister_target(&pool_target); dm_unregister_target(&pool_target);
kmem_cache_destroy(_new_mapping_cache); kmem_cache_destroy(_new_mapping_cache);
kmem_cache_destroy(_endio_hook_cache);
} }
module_init(dm_thin_init); module_init(dm_thin_init);
......
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