The commit is pushed to "branch-rh8-4.18.0-240.1.1.vz8.5.x-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git after rh8-4.18.0-240.1.1.vz8.5.30 ------> commit d9dbafd09f920c78b5ed3a6d92df88df084839df Author: Kirill Tkhai <ktk...@virtuozzo.com> Date: Mon May 17 19:04:40 2021 +0300
ploop: Become use top delta Signed-off-by: Kirill Tkhai <ktk...@virtuozzo.com> ===================== Patchset description: dm-ploop: Kill loop Intermediate patches can't be base for bisect. In scope of https://jira.sw.ru/browse/PSBM-123654 Signed-off-by: Kirill Tkhai <ktk...@virtuozzo.com> --- drivers/md/dm-ploop-map.c | 72 +++++++++++++++++++++++++++++++++++++++++++---- drivers/md/dm-ploop.h | 6 ++++ 2 files changed, 73 insertions(+), 5 deletions(-) diff --git a/drivers/md/dm-ploop-map.c b/drivers/md/dm-ploop-map.c index b1fd15d5516d..518075645ed9 100644 --- a/drivers/md/dm-ploop-map.c +++ b/drivers/md/dm-ploop-map.c @@ -5,6 +5,7 @@ #include <linux/init.h> #include <linux/vmalloc.h> #include <linux/uio.h> +#include <uapi/linux/falloc.h> #include "dm-ploop.h" /* @@ -49,6 +50,22 @@ read_unlock_irqrestore(&ploop->bat_rwlock, flags); \ } while (0) +static unsigned int bio_nr_segs(struct bio *bio) +{ + struct bvec_iter bi = { + .bi_size = bio->bi_iter.bi_size, + .bi_bvec_done = bio->bi_iter.bi_bvec_done, + .bi_idx = bio->bi_iter.bi_idx, + }; + unsigned int nr_segs = 0; + struct bio_vec bv; + + for_each_bvec(bv, bio->bi_io_vec, bi, bi) + nr_segs++; + + return nr_segs; +} + static void ploop_index_wb_init(struct ploop_index_wb *piwb, struct ploop *ploop) { piwb->ploop = ploop; @@ -410,12 +427,19 @@ static bool bio_endio_if_all_zeros(struct bio *bio) return true; } +static int punch_hole(struct file *file, loff_t pos, loff_t len) +{ + return vfs_fallocate(file, FALLOC_FL_PUNCH_HOLE|FALLOC_FL_KEEP_SIZE, + pos, len); +} + static void handle_discard_bio(struct ploop *ploop, struct bio *bio, unsigned int cluster, unsigned int dst_cluster) { struct pio *h = bio_to_endio_hook(bio); struct pio *inflight_h; unsigned long flags; + loff_t pos; int ret; if (!cluster_is_in_top_delta(ploop, cluster) || ploop->nr_deltas != 1) { @@ -463,9 +487,14 @@ static void handle_discard_bio(struct ploop *ploop, struct bio *bio, read_unlock_irq(&ploop->bat_rwlock); atomic_inc(&ploop->nr_discard_bios); - remap_to_cluster(ploop, bio, dst_cluster); remap_to_origin(ploop, bio); - generic_make_request(bio); + remap_to_cluster(ploop, bio, dst_cluster); + + pos = to_bytes(bio->bi_iter.bi_sector); + ret = punch_hole(top_delta(ploop)->file, pos, bio->bi_iter.bi_size); + if (ret) + bio->bi_status = errno_to_blk_status(ret); + bio_endio(bio); } static int ploop_discard_bio_end(struct ploop *ploop, struct bio *bio) @@ -1279,6 +1308,41 @@ static bool locate_new_cluster_and_attach_bio(struct ploop *ploop, return false; } +static void data_rw_complete(struct pio *pio) +{ + struct bio *bio = pio->data; + + if (pio->ret != bio->bi_iter.bi_size) + bio->bi_status = BLK_STS_IOERR; + + bio_endio(bio); +} + +static void submit_rw_mapped(struct ploop *ploop, loff_t clu_pos, struct bio *bio) +{ + struct pio *pio = bio_to_endio_hook(bio); + unsigned int rw, nr_segs; + struct bio_vec *bvec; + struct iov_iter iter; + loff_t pos; + + pio->complete = data_rw_complete; + pio->data = bio; + + rw = (op_is_write(bio->bi_opf) ? WRITE : READ); + nr_segs = bio_nr_segs(bio); + bvec = __bvec_iter_bvec(bio->bi_io_vec, bio->bi_iter); + + iov_iter_bvec(&iter, rw, bvec, nr_segs, bio->bi_iter.bi_size); + iter.iov_offset = bio->bi_iter.bi_bvec_done; + + remap_to_origin(ploop, bio); + remap_to_cluster(ploop, bio, clu_pos); + pos = to_bytes(bio->bi_iter.bi_sector); + + call_rw_iter(top_delta(ploop)->file, pos, rw, &iter, bio); +} + static int process_one_deferred_bio(struct ploop *ploop, struct bio *bio, struct ploop_index_wb *piwb) { @@ -1343,9 +1407,7 @@ static int process_one_deferred_bio(struct ploop *ploop, struct bio *bio, maybe_link_submitting_bio(ploop, bio, cluster); - remap_to_cluster(ploop, bio, dst_cluster); - remap_to_origin(ploop, bio); - generic_make_request(bio); + submit_rw_mapped(ploop, dst_cluster, bio); out: return 0; } diff --git a/drivers/md/dm-ploop.h b/drivers/md/dm-ploop.h index f8194e3869d7..55a30722b18b 100644 --- a/drivers/md/dm-ploop.h +++ b/drivers/md/dm-ploop.h @@ -105,6 +105,7 @@ struct ploop_cmd { #define PLOOP_BIOS_HTABLE_BITS 8 #define PLOOP_BIOS_HTABLE_SIZE (1 << PLOOP_BIOS_HTABLE_BITS) +#define CLU_OFF(ploop, pos) (pos & (to_bytes(1 << ploop->cluster_log) - 1)) enum piwb_type { PIWB_TYPE_ALLOC = 0, /* Allocation of new clusters */ @@ -322,6 +323,11 @@ static inline u8 top_level(struct ploop *ploop) return ploop->nr_deltas - 1; } +static inline struct ploop_delta *top_delta(struct ploop *ploop) +{ + return &ploop->deltas[top_level(ploop)]; +} + static inline void ploop_hole_set_bit(unsigned long nr, struct ploop *ploop) { if (!WARN_ON_ONCE(nr >= ploop->hb_nr)) _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel