Blob Blame History Raw
From f44eb5c6a316999a51f246c7fa8deb1c8c787c3a Mon Sep 17 00:00:00 2001
From: David Disseldorp <ddiss@suse.de>
Date: Tue, 13 Oct 2020 02:16:27 +0200
Subject: [PATCH] target/rbd: fix unmap handling with unmap_zeroes_data
References: bsc#1177271
Patch-mainline: Not yet, SES clustered LIO/RBD

Following 6484cbe987e0 ("rbd: handle DISCARD and WRITE_ZEROES
separately"), rbd no longer guarantees that discarded ranges will read
back as zeroes. When dev_attrib.unmap_zeroes_data is set, use ZEROOUT to
ensure that this guarantee remains.

Signed-off-by: David Disseldorp <ddiss@suse.de>
Reviewed-by: Roman Penyaev <rpenyaev@suse.com>
---
 drivers/target/target_core_rbd.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/drivers/target/target_core_rbd.c b/drivers/target/target_core_rbd.c
index fb5798d2674c..9045c7d5e90f 100644
--- a/drivers/target/target_core_rbd.c
+++ b/drivers/target/target_core_rbd.c
@@ -403,6 +403,7 @@ static sense_reason_t tcm_rbd_execute_unmap(struct se_cmd *cmd,
 {
 	struct tcm_rbd_dev *tcm_rbd_dev = TCM_RBD_DEV(cmd->se_dev);
 	struct rbd_device *rbd_dev = tcm_rbd_dev->rbd_dev;
+	enum obj_operation_type type = OBJ_OP_DISCARD;
 
 	if (nolb == 0) {
 		pr_debug("ignoring zero length unmap at lba: %llu\n",
@@ -410,7 +411,11 @@ static sense_reason_t tcm_rbd_execute_unmap(struct se_cmd *cmd,
 		return TCM_NO_SENSE;
 	}
 
-	return tcm_rbd_execute_cmd(cmd, rbd_dev, NULL, 0, OBJ_OP_DISCARD,
+	/* RBD discard is best effort. zeroout provides zeroing guarantees */
+	if (cmd->se_dev->dev_attrib.unmap_zeroes_data)
+		type = OBJ_OP_ZEROOUT;
+
+	return tcm_rbd_execute_cmd(cmd, rbd_dev, NULL, 0, type,
 				   rbd_lba_shift(cmd->se_dev, lba),
 				   rbd_lba_shift(cmd->se_dev, nolb),
 				   true);
-- 
2.26.2