Takashi Iwai 82f25d
From 8cbf9ac9941fceb2a39e11a5702489b46fbb4aca Mon Sep 17 00:00:00 2001
Takashi Iwai 82f25d
From: Maurizio Lombardi <mlombard@redhat.com>
Takashi Iwai 82f25d
Date: Mon, 6 Sep 2021 17:18:09 +0200
Takashi Iwai 82f25d
Subject: [PATCH] scsi: target: Fix the pgr/alua_support_store functions
Takashi Iwai 82f25d
Git-commit: ef7ae7f746e95c6fa4ec2bcfacb949c36263da78
Takashi Iwai 82f25d
Patch-mainline: v5.15-rc3
Takashi Iwai 82f25d
References: stable-5.14.9
Takashi Iwai 82f25d
Takashi Iwai 82f25d
[ Upstream commit ef7ae7f746e95c6fa4ec2bcfacb949c36263da78 ]
Takashi Iwai 82f25d
Takashi Iwai 82f25d
Commit 356ba2a8bc8d ("scsi: target: tcmu: Make pgr_support and alua_support
Takashi Iwai 82f25d
attributes writable") introduced support for changeable alua_support and
Takashi Iwai 82f25d
pgr_support target attributes. These can only be changed if the backstore
Takashi Iwai 82f25d
is user-backed, otherwise the kernel returns -EINVAL.
Takashi Iwai 82f25d
Takashi Iwai 82f25d
This triggers a warning in the targetcli/rtslib code when performing a
Takashi Iwai 82f25d
target restore that includes non-userbacked backstores:
Takashi Iwai 82f25d
Takashi Iwai 82f25d
  # targetctl restore
Takashi Iwai 82f25d
  Storage Object block/storage1: Cannot set attribute alua_support:
Takashi Iwai 82f25d
  [Errno 22] Invalid argument, skipped
Takashi Iwai 82f25d
  Storage Object block/storage1: Cannot set attribute pgr_support:
Takashi Iwai 82f25d
  [Errno 22] Invalid argument, skipped
Takashi Iwai 82f25d
Takashi Iwai 82f25d
Fix this warning by returning an error code only if we are really going to
Takashi Iwai 82f25d
flip the PGR/ALUA bit in the transport_flags field, otherwise we will do
Takashi Iwai 82f25d
nothing and return success.
Takashi Iwai 82f25d
Takashi Iwai 82f25d
Return ENOSYS instead of EINVAL if the pgr/alua attributes can not be
Takashi Iwai 82f25d
changed, this way it will be possible for userspace to understand if the
Takashi Iwai 82f25d
operation failed because an invalid value has been passed to strtobool() or
Takashi Iwai 82f25d
because the attributes are fixed.
Takashi Iwai 82f25d
Takashi Iwai 82f25d
Fixes: 356ba2a8bc8d ("scsi: target: tcmu: Make pgr_support and alua_support attributes writable")
Takashi Iwai 82f25d
Link: https://lore.kernel.org/r/20210906151809.52811-1-mlombard@redhat.com
Takashi Iwai 82f25d
Reviewed-by: Bodo Stroesser <bostroesser@gmail.com>
Takashi Iwai 82f25d
Signed-off-by: Maurizio Lombardi <mlombard@redhat.com>
Takashi Iwai 82f25d
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Takashi Iwai 82f25d
Signed-off-by: Sasha Levin <sashal@kernel.org>
Takashi Iwai 82f25d
Acked-by: Takashi Iwai <tiwai@suse.de>
Takashi Iwai 82f25d
Takashi Iwai 82f25d
---
Takashi Iwai 82f25d
 drivers/target/target_core_configfs.c | 32 +++++++++++++++++----------
Takashi Iwai 82f25d
 1 file changed, 20 insertions(+), 12 deletions(-)
Takashi Iwai 82f25d
Takashi Iwai 82f25d
diff --git a/drivers/target/target_core_configfs.c b/drivers/target/target_core_configfs.c
Takashi Iwai 82f25d
index 102ec644bc8a..023bd4516a68 100644
Takashi Iwai 82f25d
--- a/drivers/target/target_core_configfs.c
Takashi Iwai 82f25d
+++ b/drivers/target/target_core_configfs.c
Takashi Iwai 82f25d
@@ -1110,20 +1110,24 @@ static ssize_t alua_support_store(struct config_item *item,
Takashi Iwai 82f25d
 {
Takashi Iwai 82f25d
 	struct se_dev_attrib *da = to_attrib(item);
Takashi Iwai 82f25d
 	struct se_device *dev = da->da_dev;
Takashi Iwai 82f25d
-	bool flag;
Takashi Iwai 82f25d
+	bool flag, oldflag;
Takashi Iwai 82f25d
 	int ret;
Takashi Iwai 82f25d
 
Takashi Iwai 82f25d
+	ret = strtobool(page, &flag;;
Takashi Iwai 82f25d
+	if (ret < 0)
Takashi Iwai 82f25d
+		return ret;
Takashi Iwai 82f25d
+
Takashi Iwai 82f25d
+	oldflag = !(dev->transport_flags & TRANSPORT_FLAG_PASSTHROUGH_ALUA);
Takashi Iwai 82f25d
+	if (flag == oldflag)
Takashi Iwai 82f25d
+		return count;
Takashi Iwai 82f25d
+
Takashi Iwai 82f25d
 	if (!(dev->transport->transport_flags_changeable &
Takashi Iwai 82f25d
 	      TRANSPORT_FLAG_PASSTHROUGH_ALUA)) {
Takashi Iwai 82f25d
 		pr_err("dev[%p]: Unable to change SE Device alua_support:"
Takashi Iwai 82f25d
 			" alua_support has fixed value\n", dev);
Takashi Iwai 82f25d
-		return -EINVAL;
Takashi Iwai 82f25d
+		return -ENOSYS;
Takashi Iwai 82f25d
 	}
Takashi Iwai 82f25d
 
Takashi Iwai 82f25d
-	ret = strtobool(page, &flag;;
Takashi Iwai 82f25d
-	if (ret < 0)
Takashi Iwai 82f25d
-		return ret;
Takashi Iwai 82f25d
-
Takashi Iwai 82f25d
 	if (flag)
Takashi Iwai 82f25d
 		dev->transport_flags &= ~TRANSPORT_FLAG_PASSTHROUGH_ALUA;
Takashi Iwai 82f25d
 	else
Takashi Iwai 82f25d
@@ -1145,20 +1149,24 @@ static ssize_t pgr_support_store(struct config_item *item,
Takashi Iwai 82f25d
 {
Takashi Iwai 82f25d
 	struct se_dev_attrib *da = to_attrib(item);
Takashi Iwai 82f25d
 	struct se_device *dev = da->da_dev;
Takashi Iwai 82f25d
-	bool flag;
Takashi Iwai 82f25d
+	bool flag, oldflag;
Takashi Iwai 82f25d
 	int ret;
Takashi Iwai 82f25d
 
Takashi Iwai 82f25d
+	ret = strtobool(page, &flag;;
Takashi Iwai 82f25d
+	if (ret < 0)
Takashi Iwai 82f25d
+		return ret;
Takashi Iwai 82f25d
+
Takashi Iwai 82f25d
+	oldflag = !(dev->transport_flags & TRANSPORT_FLAG_PASSTHROUGH_PGR);
Takashi Iwai 82f25d
+	if (flag == oldflag)
Takashi Iwai 82f25d
+		return count;
Takashi Iwai 82f25d
+
Takashi Iwai 82f25d
 	if (!(dev->transport->transport_flags_changeable &
Takashi Iwai 82f25d
 	      TRANSPORT_FLAG_PASSTHROUGH_PGR)) {
Takashi Iwai 82f25d
 		pr_err("dev[%p]: Unable to change SE Device pgr_support:"
Takashi Iwai 82f25d
 			" pgr_support has fixed value\n", dev);
Takashi Iwai 82f25d
-		return -EINVAL;
Takashi Iwai 82f25d
+		return -ENOSYS;
Takashi Iwai 82f25d
 	}
Takashi Iwai 82f25d
 
Takashi Iwai 82f25d
-	ret = strtobool(page, &flag;;
Takashi Iwai 82f25d
-	if (ret < 0)
Takashi Iwai 82f25d
-		return ret;
Takashi Iwai 82f25d
-
Takashi Iwai 82f25d
 	if (flag)
Takashi Iwai 82f25d
 		dev->transport_flags &= ~TRANSPORT_FLAG_PASSTHROUGH_PGR;
Takashi Iwai 82f25d
 	else
Takashi Iwai 82f25d
-- 
Takashi Iwai 82f25d
2.26.2
Takashi Iwai 82f25d