|
Jiri Slaby |
221c28 |
From: Lee Duncan <lduncan@suse.com>
|
|
Jiri Slaby |
221c28 |
Date: Wed, 28 Sep 2022 11:13:50 -0700
|
|
Jiri Slaby |
221c28 |
Subject: [PATCH] scsi: core: Add BLIST_NO_VPD_SIZE for some VDASD
|
|
Jiri Slaby |
221c28 |
References: bsc#1012628
|
|
Jiri Slaby |
221c28 |
Patch-mainline: 6.2.8
|
|
Jiri Slaby |
221c28 |
Git-commit: 4b1a2c2a8e0ddcb89c5f6c5003bd9b53142f69e3
|
|
Jiri Slaby |
221c28 |
|
|
Jiri Slaby |
221c28 |
[ Upstream commit 4b1a2c2a8e0ddcb89c5f6c5003bd9b53142f69e3 ]
|
|
Jiri Slaby |
221c28 |
|
|
Jiri Slaby |
221c28 |
Some storage, such as AIX VDASD (virtual storage) and IBM 2076 (front
|
|
Jiri Slaby |
221c28 |
end), fail as a result of commit c92a6b5d6335 ("scsi: core: Query VPD
|
|
Jiri Slaby |
221c28 |
size before getting full page").
|
|
Jiri Slaby |
221c28 |
|
|
Jiri Slaby |
221c28 |
That commit changed getting SCSI VPD pages so that we now read just
|
|
Jiri Slaby |
221c28 |
enough of the page to get the actual page size, then read the whole
|
|
Jiri Slaby |
221c28 |
page in a second read. The problem is that the above mentioned
|
|
Jiri Slaby |
221c28 |
hardware returns zero for the page size, because of a firmware
|
|
Jiri Slaby |
221c28 |
error. In such cases, until the firmware is fixed, this new blacklist
|
|
Jiri Slaby |
221c28 |
flag says to revert to the original method of reading the VPD pages,
|
|
Jiri Slaby |
221c28 |
i.e. try to read a whole buffer's worth on the first try.
|
|
Jiri Slaby |
221c28 |
|
|
Jiri Slaby |
221c28 |
[mkp: reworked somewhat]
|
|
Jiri Slaby |
221c28 |
|
|
Jiri Slaby |
221c28 |
Fixes: c92a6b5d6335 ("scsi: core: Query VPD size before getting full page")
|
|
Jiri Slaby |
221c28 |
Reported-by: Martin Wilck <mwilck@suse.com>
|
|
Jiri Slaby |
221c28 |
Suggested-by: Hannes Reinecke <hare@suse.de>
|
|
Jiri Slaby |
221c28 |
Signed-off-by: Lee Duncan <lduncan@suse.com>
|
|
Jiri Slaby |
221c28 |
Link: https://lore.kernel.org/r/20220928181350.9948-1-leeman.duncan@gmail.com
|
|
Jiri Slaby |
221c28 |
Tested-by: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
|
|
Jiri Slaby |
221c28 |
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
|
|
Jiri Slaby |
221c28 |
Signed-off-by: Sasha Levin <sashal@kernel.org>
|
|
Jiri Slaby |
221c28 |
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
|
|
Jiri Slaby |
221c28 |
---
|
|
Jiri Slaby |
221c28 |
drivers/scsi/scsi.c | 3 +++
|
|
Jiri Slaby |
221c28 |
drivers/scsi/scsi_devinfo.c | 3 ++-
|
|
Jiri Slaby |
221c28 |
drivers/scsi/scsi_scan.c | 3 +++
|
|
Jiri Slaby |
221c28 |
include/scsi/scsi_device.h | 2 ++
|
|
Jiri Slaby |
221c28 |
include/scsi/scsi_devinfo.h | 6 +++---
|
|
Jiri Slaby |
221c28 |
5 files changed, 13 insertions(+), 4 deletions(-)
|
|
Jiri Slaby |
221c28 |
|
|
Jiri Slaby |
221c28 |
diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c
|
|
Jiri Slaby |
221c28 |
index 9feb0323..dff1d692 100644
|
|
Jiri Slaby |
221c28 |
--- a/drivers/scsi/scsi.c
|
|
Jiri Slaby |
221c28 |
+++ b/drivers/scsi/scsi.c
|
|
Jiri Slaby |
221c28 |
@@ -326,6 +326,9 @@ static int scsi_get_vpd_size(struct scsi_device *sdev, u8 page)
|
|
Jiri Slaby |
221c28 |
unsigned char vpd_header[SCSI_VPD_HEADER_SIZE] __aligned(4);
|
|
Jiri Slaby |
221c28 |
int result;
|
|
Jiri Slaby |
221c28 |
|
|
Jiri Slaby |
221c28 |
+ if (sdev->no_vpd_size)
|
|
Jiri Slaby |
221c28 |
+ return SCSI_DEFAULT_VPD_LEN;
|
|
Jiri Slaby |
221c28 |
+
|
|
Jiri Slaby |
221c28 |
/*
|
|
Jiri Slaby |
221c28 |
* Fetch the VPD page header to find out how big the page
|
|
Jiri Slaby |
221c28 |
* is. This is done to prevent problems on legacy devices
|
|
Jiri Slaby |
221c28 |
diff --git a/drivers/scsi/scsi_devinfo.c b/drivers/scsi/scsi_devinfo.c
|
|
Jiri Slaby |
221c28 |
index c7080454..bc9d2804 100644
|
|
Jiri Slaby |
221c28 |
--- a/drivers/scsi/scsi_devinfo.c
|
|
Jiri Slaby |
221c28 |
+++ b/drivers/scsi/scsi_devinfo.c
|
|
Jiri Slaby |
221c28 |
@@ -134,7 +134,7 @@ static struct {
|
|
Jiri Slaby |
221c28 |
{"3PARdata", "VV", NULL, BLIST_REPORTLUN2},
|
|
Jiri Slaby |
221c28 |
{"ADAPTEC", "AACRAID", NULL, BLIST_FORCELUN},
|
|
Jiri Slaby |
221c28 |
{"ADAPTEC", "Adaptec 5400S", NULL, BLIST_FORCELUN},
|
|
Jiri Slaby |
221c28 |
- {"AIX", "VDASD", NULL, BLIST_TRY_VPD_PAGES},
|
|
Jiri Slaby |
221c28 |
+ {"AIX", "VDASD", NULL, BLIST_TRY_VPD_PAGES | BLIST_NO_VPD_SIZE},
|
|
Jiri Slaby |
221c28 |
{"AFT PRO", "-IX CF", "0.0>", BLIST_FORCELUN},
|
|
Jiri Slaby |
221c28 |
{"BELKIN", "USB 2 HS-CF", "1.95", BLIST_FORCELUN | BLIST_INQUIRY_36},
|
|
Jiri Slaby |
221c28 |
{"BROWNIE", "1200U3P", NULL, BLIST_NOREPORTLUN},
|
|
Jiri Slaby |
221c28 |
@@ -188,6 +188,7 @@ static struct {
|
|
Jiri Slaby |
221c28 |
{"HPE", "OPEN-", "*", BLIST_REPORTLUN2 | BLIST_TRY_VPD_PAGES},
|
|
Jiri Slaby |
221c28 |
{"IBM", "AuSaV1S2", NULL, BLIST_FORCELUN},
|
|
Jiri Slaby |
221c28 |
{"IBM", "ProFibre 4000R", "*", BLIST_SPARSELUN | BLIST_LARGELUN},
|
|
Jiri Slaby |
221c28 |
+ {"IBM", "2076", NULL, BLIST_NO_VPD_SIZE},
|
|
Jiri Slaby |
221c28 |
{"IBM", "2105", NULL, BLIST_RETRY_HWERROR},
|
|
Jiri Slaby |
221c28 |
{"iomega", "jaz 1GB", "J.86", BLIST_NOTQ | BLIST_NOLUN},
|
|
Jiri Slaby |
221c28 |
{"IOMEGA", "ZIP", NULL, BLIST_NOTQ | BLIST_NOLUN},
|
|
Jiri Slaby |
221c28 |
diff --git a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c
|
|
Jiri Slaby |
221c28 |
index f9b18fdc..6042a558 100644
|
|
Jiri Slaby |
221c28 |
--- a/drivers/scsi/scsi_scan.c
|
|
Jiri Slaby |
221c28 |
+++ b/drivers/scsi/scsi_scan.c
|
|
Jiri Slaby |
221c28 |
@@ -1055,6 +1055,9 @@ static int scsi_add_lun(struct scsi_device *sdev, unsigned char *inq_result,
|
|
Jiri Slaby |
221c28 |
else if (*bflags & BLIST_SKIP_VPD_PAGES)
|
|
Jiri Slaby |
221c28 |
sdev->skip_vpd_pages = 1;
|
|
Jiri Slaby |
221c28 |
|
|
Jiri Slaby |
221c28 |
+ if (*bflags & BLIST_NO_VPD_SIZE)
|
|
Jiri Slaby |
221c28 |
+ sdev->no_vpd_size = 1;
|
|
Jiri Slaby |
221c28 |
+
|
|
Jiri Slaby |
221c28 |
transport_configure_device(&sdev->sdev_gendev);
|
|
Jiri Slaby |
221c28 |
|
|
Jiri Slaby |
221c28 |
if (sdev->host->hostt->slave_configure) {
|
|
Jiri Slaby |
221c28 |
diff --git a/include/scsi/scsi_device.h b/include/scsi/scsi_device.h
|
|
Jiri Slaby |
221c28 |
index 3642b8e3..15169d75 100644
|
|
Jiri Slaby |
221c28 |
--- a/include/scsi/scsi_device.h
|
|
Jiri Slaby |
221c28 |
+++ b/include/scsi/scsi_device.h
|
|
Jiri Slaby |
221c28 |
@@ -145,6 +145,7 @@ struct scsi_device {
|
|
Jiri Slaby |
221c28 |
const char * model; /* ... after scan; point to static string */
|
|
Jiri Slaby |
221c28 |
const char * rev; /* ... "nullnullnullnull" before scan */
|
|
Jiri Slaby |
221c28 |
|
|
Jiri Slaby |
221c28 |
+#define SCSI_DEFAULT_VPD_LEN 255 /* default SCSI VPD page size (max) */
|
|
Jiri Slaby |
221c28 |
struct scsi_vpd __rcu *vpd_pg0;
|
|
Jiri Slaby |
221c28 |
struct scsi_vpd __rcu *vpd_pg83;
|
|
Jiri Slaby |
221c28 |
struct scsi_vpd __rcu *vpd_pg80;
|
|
Jiri Slaby |
221c28 |
@@ -215,6 +216,7 @@ struct scsi_device {
|
|
Jiri Slaby |
221c28 |
* creation time */
|
|
Jiri Slaby |
221c28 |
unsigned ignore_media_change:1; /* Ignore MEDIA CHANGE on resume */
|
|
Jiri Slaby |
221c28 |
unsigned silence_suspend:1; /* Do not print runtime PM related messages */
|
|
Jiri Slaby |
221c28 |
+ unsigned no_vpd_size:1; /* No VPD size reported in header */
|
|
Jiri Slaby |
221c28 |
|
|
Jiri Slaby |
221c28 |
unsigned int queue_stopped; /* request queue is quiesced */
|
|
Jiri Slaby |
221c28 |
bool offline_already; /* Device offline message logged */
|
|
Jiri Slaby |
221c28 |
diff --git a/include/scsi/scsi_devinfo.h b/include/scsi/scsi_devinfo.h
|
|
Jiri Slaby |
221c28 |
index 5d14adae..6b548dc2 100644
|
|
Jiri Slaby |
221c28 |
--- a/include/scsi/scsi_devinfo.h
|
|
Jiri Slaby |
221c28 |
+++ b/include/scsi/scsi_devinfo.h
|
|
Jiri Slaby |
221c28 |
@@ -32,7 +32,8 @@
|
|
Jiri Slaby |
221c28 |
#define BLIST_IGN_MEDIA_CHANGE ((__force blist_flags_t)(1ULL << 11))
|
|
Jiri Slaby |
221c28 |
/* do not do automatic start on add */
|
|
Jiri Slaby |
221c28 |
#define BLIST_NOSTARTONADD ((__force blist_flags_t)(1ULL << 12))
|
|
Jiri Slaby |
221c28 |
-#define __BLIST_UNUSED_13 ((__force blist_flags_t)(1ULL << 13))
|
|
Jiri Slaby |
221c28 |
+/* do not ask for VPD page size first on some broken targets */
|
|
Jiri Slaby |
221c28 |
+#define BLIST_NO_VPD_SIZE ((__force blist_flags_t)(1ULL << 13))
|
|
Jiri Slaby |
221c28 |
#define __BLIST_UNUSED_14 ((__force blist_flags_t)(1ULL << 14))
|
|
Jiri Slaby |
221c28 |
#define __BLIST_UNUSED_15 ((__force blist_flags_t)(1ULL << 15))
|
|
Jiri Slaby |
221c28 |
#define __BLIST_UNUSED_16 ((__force blist_flags_t)(1ULL << 16))
|
|
Jiri Slaby |
221c28 |
@@ -74,8 +75,7 @@
|
|
Jiri Slaby |
221c28 |
#define __BLIST_HIGH_UNUSED (~(__BLIST_LAST_USED | \
|
|
Jiri Slaby |
221c28 |
(__force blist_flags_t) \
|
|
Jiri Slaby |
221c28 |
((__force __u64)__BLIST_LAST_USED - 1ULL)))
|
|
Jiri Slaby |
221c28 |
-#define __BLIST_UNUSED_MASK (__BLIST_UNUSED_13 | \
|
|
Jiri Slaby |
221c28 |
- __BLIST_UNUSED_14 | \
|
|
Jiri Slaby |
221c28 |
+#define __BLIST_UNUSED_MASK (__BLIST_UNUSED_14 | \
|
|
Jiri Slaby |
221c28 |
__BLIST_UNUSED_15 | \
|
|
Jiri Slaby |
221c28 |
__BLIST_UNUSED_16 | \
|
|
Jiri Slaby |
221c28 |
__BLIST_UNUSED_24 | \
|
|
Jiri Slaby |
221c28 |
--
|
|
Jiri Slaby |
221c28 |
2.35.3
|
|
Jiri Slaby |
221c28 |
|