aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md
diff options
context:
space:
mode:
authorMike Snitzer <snitzer@redhat.com>2014-10-09 19:20:21 -0400
committerMike Snitzer <snitzer@redhat.com>2014-11-10 15:25:28 -0500
commit452d7a620dc38cb525c403aa4b445028da359268 (patch)
treef2541fb1b51a93f816eaad211dcedeb3d1a49056 /drivers/md
parent7a7e97ca580b944d2c89b59bc74a7b9ddd044705 (diff)
dm thin: factor out remap_and_issue_overwrite
Purely cleanup of duplicated code, no functional change. Signed-off-by: Mike Snitzer <snitzer@redhat.com>
Diffstat (limited to 'drivers/md')
-rw-r--r--drivers/md/dm-thin.c38
1 files changed, 20 insertions, 18 deletions
diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c
index 8c3d048dd319..52562710f6a0 100644
--- a/drivers/md/dm-thin.c
+++ b/drivers/md/dm-thin.c
@@ -890,6 +890,20 @@ static void ll_zero(struct thin_c *tc, struct dm_thin_new_mapping *m,
890 } 890 }
891} 891}
892 892
893static void remap_and_issue_overwrite(struct thin_c *tc, struct bio *bio,
894 dm_block_t data_block,
895 struct dm_thin_new_mapping *m)
896{
897 struct pool *pool = tc->pool;
898 struct dm_thin_endio_hook *h = dm_per_bio_data(bio, sizeof(struct dm_thin_endio_hook));
899
900 h->overwrite_mapping = m;
901 m->bio = bio;
902 save_and_set_endio(bio, &m->saved_bi_end_io, overwrite_endio);
903 inc_all_io_entry(pool, bio);
904 remap_and_issue(tc, bio, data_block);
905}
906
893/* 907/*
894 * A partial copy also needs to zero the uncopied region. 908 * A partial copy also needs to zero the uncopied region.
895 */ 909 */
@@ -924,15 +938,9 @@ static void schedule_copy(struct thin_c *tc, dm_block_t virt_block,
924 * If the whole block of data is being overwritten, we can issue the 938 * If the whole block of data is being overwritten, we can issue the
925 * bio immediately. Otherwise we use kcopyd to clone the data first. 939 * bio immediately. Otherwise we use kcopyd to clone the data first.
926 */ 940 */
927 if (io_overwrites_block(pool, bio)) { 941 if (io_overwrites_block(pool, bio))
928 struct dm_thin_endio_hook *h = dm_per_bio_data(bio, sizeof(struct dm_thin_endio_hook)); 942 remap_and_issue_overwrite(tc, bio, data_dest, m);
929 943 else {
930 h->overwrite_mapping = m;
931 m->bio = bio;
932 save_and_set_endio(bio, &m->saved_bi_end_io, overwrite_endio);
933 inc_all_io_entry(pool, bio);
934 remap_and_issue(tc, bio, data_dest);
935 } else {
936 struct dm_io_region from, to; 944 struct dm_io_region from, to;
937 945
938 from.bdev = origin->bdev; 946 from.bdev = origin->bdev;
@@ -1001,16 +1009,10 @@ static void schedule_zero(struct thin_c *tc, dm_block_t virt_block,
1001 if (!pool->pf.zero_new_blocks) 1009 if (!pool->pf.zero_new_blocks)
1002 process_prepared_mapping(m); 1010 process_prepared_mapping(m);
1003 1011
1004 else if (io_overwrites_block(pool, bio)) { 1012 else if (io_overwrites_block(pool, bio))
1005 struct dm_thin_endio_hook *h = dm_per_bio_data(bio, sizeof(struct dm_thin_endio_hook)); 1013 remap_and_issue_overwrite(tc, bio, data_block, m);
1006
1007 h->overwrite_mapping = m;
1008 m->bio = bio;
1009 save_and_set_endio(bio, &m->saved_bi_end_io, overwrite_endio);
1010 inc_all_io_entry(pool, bio);
1011 remap_and_issue(tc, bio, data_block);
1012 1014
1013 } else 1015 else
1014 ll_zero(tc, m, 1016 ll_zero(tc, m,
1015 data_block * pool->sectors_per_block, 1017 data_block * pool->sectors_per_block,
1016 (data_block + 1) * pool->sectors_per_block); 1018 (data_block + 1) * pool->sectors_per_block);