|
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 |
|