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