Sometimes this may safe some space... https://jira.sw.ru/browse/PSBM-123748
Signed-off-by: Kirill Tkhai <ktk...@virtuozzo.com> --- drivers/md/dm-ploop-map.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/drivers/md/dm-ploop-map.c b/drivers/md/dm-ploop-map.c index 4b12b5fc082a..f193b25cbd28 100644 --- a/drivers/md/dm-ploop-map.c +++ b/drivers/md/dm-ploop-map.c @@ -397,6 +397,27 @@ static void maybe_unlink_completed_bio(struct ploop *ploop, struct bio *bio) queue_work(ploop->wq, &ploop->worker); } +static bool bio_endio_if_all_zeros(struct bio *bio) +{ + struct bvec_iter bi = { + .bi_size = bio->bi_iter.bi_size, + }; + struct bio_vec bv; + void *data, *ret; + + for_each_bvec(bv, bio->bi_io_vec, bi, bi) { + data = kmap(bv.bv_page); + ret = memchr_inv(data + bv.bv_offset, 0, bv.bv_len); + kunmap(bv.bv_page); + if (ret) + return false; + } + + bio->bi_status = BLK_STS_OK; + bio_endio(bio); + return true; +} + static void handle_discard_bio(struct ploop *ploop, struct bio *bio, unsigned int cluster, unsigned int dst_cluster) { @@ -1326,6 +1347,9 @@ static int process_one_deferred_bio(struct ploop *ploop, struct bio *bio, goto out; } + if (unlikely(bio_endio_if_all_zeros(bio))) + goto out; + /* Cluster exists nowhere. Allocate it and setup bio as outrunning */ ret = locate_new_cluster_and_attach_bio(ploop, piwb, cluster, &dst_cluster, bio); _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel