diff options
author | Mike Snitzer <snitzer@redhat.com> | 2014-10-09 19:20:21 -0400 |
---|---|---|
committer | Mike Snitzer <snitzer@redhat.com> | 2014-11-10 15:25:28 -0500 |
commit | 452d7a620dc38cb525c403aa4b445028da359268 (patch) | |
tree | f2541fb1b51a93f816eaad211dcedeb3d1a49056 /drivers/md | |
parent | 7a7e97ca580b944d2c89b59bc74a7b9ddd044705 (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.c | 38 |
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 | ||
893 | static 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); |