[RH8] dm-ploop: Skip zero writes to unallocated clusters

Submitted by Kirill Tkhai on Dec. 15, 2020, 5:05 p.m.

Details

Message ID 160805191492.150682.9235240300211346055.stgit@localhost.localdomain
State New
Series "dm-ploop: Skip zero writes to unallocated clusters"
Headers show

Commit Message

Kirill Tkhai Dec. 15, 2020, 5:05 p.m.
Sometimes this may safe some space...

https://jira.sw.ru/browse/PSBM-123748

Signed-off-by: Kirill Tkhai <ktkhai@virtuozzo.com>
---
 drivers/md/dm-ploop-map.c |   24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)

Patch hide | download patch | download mbox

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);