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