[29/33] TCMU PR: enable PRO Reserve for TCMU devices
diff mbox

Message ID 20180615182342.6239-29-lszhu@suse.com
State New, archived
Headers show

Commit Message

Zhu Lingshan June 15, 2018, 6:23 p.m. UTC
This patch would enable the passthrough Persist Reservation
Reserve operation routine for TCMU devices.
If dev->passthrough_pr is 1, both dev->transport->pr_ops
and dev->transport->pr_ops->pr_register are not NULL,
core_scsi3_emulate_pro_reserve() will call
dev->transport->pr_ops->pr_reserve to passthrough data to
user space.

Signed-off-by: Zhu Lingshan <lszhu@suse.com>
---
 drivers/target/target_core_pr.c   | 11 ++++++++++-
 drivers/target/target_core_user.c |  2 ++
 2 files changed, 12 insertions(+), 1 deletion(-)

Patch
diff mbox

diff --git a/drivers/target/target_core_pr.c b/drivers/target/target_core_pr.c
index 0a06b8bb1134..d47ccbf05679 100644
--- a/drivers/target/target_core_pr.c
+++ b/drivers/target/target_core_pr.c
@@ -2450,6 +2450,8 @@  static sense_reason_t
 core_scsi3_emulate_pro_reserve(struct se_cmd *cmd, int type, int scope,
 		u64 res_key)
 {
+	struct se_device *dev = cmd->se_dev;
+
 	switch (type) {
 	case PR_TYPE_WRITE_EXCLUSIVE:
 	case PR_TYPE_EXCLUSIVE_ACCESS:
@@ -2457,7 +2459,14 @@  core_scsi3_emulate_pro_reserve(struct se_cmd *cmd, int type, int scope,
 	case PR_TYPE_EXCLUSIVE_ACCESS_REGONLY:
 	case PR_TYPE_WRITE_EXCLUSIVE_ALLREG:
 	case PR_TYPE_EXCLUSIVE_ACCESS_ALLREG:
-		return core_scsi3_pro_reserve(cmd, type, scope, res_key);
+		if (dev->transport->pr_ops &&
+		    dev->transport->pr_ops->pr_register &&
+		    dev->passthrough_pr)
+			return dev->transport->pr_ops->pr_reserve(cmd, type,
+								  res_key);
+		else
+			return core_scsi3_pro_reserve(cmd, type, scope,
+						      res_key);
 	default:
 		pr_err("SPC-3 PR: Unknown Service Action RESERVE Type:"
 			" 0x%02x\n", type);
diff --git a/drivers/target/target_core_user.c b/drivers/target/target_core_user.c
index 8390b1d37873..e7daa76317bc 100644
--- a/drivers/target/target_core_user.c
+++ b/drivers/target/target_core_user.c
@@ -3011,6 +3011,7 @@  tcmu_execute_pr_reserve(struct se_cmd *cmd, int type, u64 key)
 	sense_reason_t ret;
 	int retries = 0;
 
+	mutex_lock(&udev->pr_info.pr_info_lock);
 	udev->pr_info.pr_info_buf = kzalloc(TCMU_PR_INFO_XATTR_MAX_SIZE,
 					    GFP_KERNEL);
 	if (!udev->pr_info.pr_info_buf)
@@ -3127,6 +3128,7 @@  tcmu_execute_pr_reserve(struct se_cmd *cmd, int type, u64 key)
 	tcmu_pr_info_free(pr_info);
 	kfree(pr_xattr);
 	kfree(udev->pr_info.pr_info_buf);
+	mutex_unlock(&udev->pr_info.pr_info_lock);
 	return ret;
 }