Blob Blame History Raw
From fd2cfa89cf14a67fba739c88b4fd03bdae623e6d Mon Sep 17 00:00:00 2001
From: Mike Christie <michaelc@cs.wisc.edu>
Date: Wed, 29 Jul 2015 04:23:48 -0500
Subject: [PATCH] target: add compare and write callback
References: fate#318836
Patch-mainline: Not yet, SES2 clustered LIO/RBD

Add a sbc ops callout for compare and write commands, so backends
like rbd which support that commmand can execute it natively.

Signed-off-by: Mike Christie <michaelc@cs.wisc.edu>
Acked-by: David Disseldorp <ddiss@suse.de>
---
 drivers/target/target_core_sbc.c     |    9 +++++++--
 include/target/target_core_backend.h |    1 +
 2 files changed, 8 insertions(+), 2 deletions(-)

--- a/drivers/target/target_core_sbc.c
+++ b/drivers/target/target_core_sbc.c
@@ -1025,8 +1025,13 @@ sbc_parse_cdb(struct se_cmd *cmd, struct
 		cmd->t_task_lba = get_unaligned_be64(&cdb[2]);
 		cmd->t_task_nolb = sectors;
 		cmd->se_cmd_flags |= SCF_SCSI_DATA_CDB | SCF_COMPARE_AND_WRITE;
-		cmd->execute_cmd = sbc_compare_and_write;
-		cmd->transport_complete_callback = compare_and_write_callback;
+		if (ops->execute_compare_and_write) {
+			cmd->execute_cmd = ops->execute_compare_and_write;
+		} else {
+			cmd->execute_cmd = sbc_compare_and_write;
+			cmd->transport_complete_callback =
+						compare_and_write_callback;
+		}
 		break;
 	case READ_CAPACITY:
 		size = READ_CAP_LEN;
--- a/include/target/target_core_backend.h
+++ b/include/target/target_core_backend.h
@@ -63,6 +63,7 @@ struct sbc_ops {
 	sense_reason_t (*execute_write_same)(struct se_cmd *cmd);
 	sense_reason_t (*execute_unmap)(struct se_cmd *cmd,
 				sector_t lba, sector_t nolb);
+	sense_reason_t (*execute_compare_and_write)(struct se_cmd *cmd);
 };
 
 int	transport_backend_register(const struct target_backend_ops *);