Commit 4b1a2c2a authored by Lee Duncan's avatar Lee Duncan Committed by Martin K. Petersen

scsi: core: Add BLIST_NO_VPD_SIZE for some VDASD

Some storage, such as AIX VDASD (virtual storage) and IBM 2076 (front
end), fail as a result of commit c92a6b5d ("scsi: core: Query VPD
size before getting full page").

That commit changed getting SCSI VPD pages so that we now read just
enough of the page to get the actual page size, then read the whole
page in a second read. The problem is that the above mentioned
hardware returns zero for the page size, because of a firmware
error. In such cases, until the firmware is fixed, this new blacklist
flag says to revert to the original method of reading the VPD pages,
i.e. try to read a whole buffer's worth on the first try.

[mkp: reworked somewhat]

Fixes: c92a6b5d ("scsi: core: Query VPD size before getting full page")
Reported-by: default avatarMartin Wilck <mwilck@suse.com>
Suggested-by: default avatarHannes Reinecke <hare@suse.de>
Signed-off-by: default avatarLee Duncan <lduncan@suse.com>
Link: https://lore.kernel.org/r/20220928181350.9948-1-leeman.duncan@gmail.comTested-by: default avatarSrikar Dronamraju <srikar@linux.vnet.ibm.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent ce756daa
...@@ -326,6 +326,9 @@ static int scsi_get_vpd_size(struct scsi_device *sdev, u8 page) ...@@ -326,6 +326,9 @@ static int scsi_get_vpd_size(struct scsi_device *sdev, u8 page)
unsigned char vpd_header[SCSI_VPD_HEADER_SIZE] __aligned(4); unsigned char vpd_header[SCSI_VPD_HEADER_SIZE] __aligned(4);
int result; int result;
if (sdev->no_vpd_size)
return SCSI_DEFAULT_VPD_LEN;
/* /*
* Fetch the VPD page header to find out how big the page * Fetch the VPD page header to find out how big the page
* is. This is done to prevent problems on legacy devices * is. This is done to prevent problems on legacy devices
......
...@@ -134,7 +134,7 @@ static struct { ...@@ -134,7 +134,7 @@ static struct {
{"3PARdata", "VV", NULL, BLIST_REPORTLUN2}, {"3PARdata", "VV", NULL, BLIST_REPORTLUN2},
{"ADAPTEC", "AACRAID", NULL, BLIST_FORCELUN}, {"ADAPTEC", "AACRAID", NULL, BLIST_FORCELUN},
{"ADAPTEC", "Adaptec 5400S", NULL, BLIST_FORCELUN}, {"ADAPTEC", "Adaptec 5400S", NULL, BLIST_FORCELUN},
{"AIX", "VDASD", NULL, BLIST_TRY_VPD_PAGES}, {"AIX", "VDASD", NULL, BLIST_TRY_VPD_PAGES | BLIST_NO_VPD_SIZE},
{"AFT PRO", "-IX CF", "0.0>", BLIST_FORCELUN}, {"AFT PRO", "-IX CF", "0.0>", BLIST_FORCELUN},
{"BELKIN", "USB 2 HS-CF", "1.95", BLIST_FORCELUN | BLIST_INQUIRY_36}, {"BELKIN", "USB 2 HS-CF", "1.95", BLIST_FORCELUN | BLIST_INQUIRY_36},
{"BROWNIE", "1200U3P", NULL, BLIST_NOREPORTLUN}, {"BROWNIE", "1200U3P", NULL, BLIST_NOREPORTLUN},
...@@ -188,6 +188,7 @@ static struct { ...@@ -188,6 +188,7 @@ static struct {
{"HPE", "OPEN-", "*", BLIST_REPORTLUN2 | BLIST_TRY_VPD_PAGES}, {"HPE", "OPEN-", "*", BLIST_REPORTLUN2 | BLIST_TRY_VPD_PAGES},
{"IBM", "AuSaV1S2", NULL, BLIST_FORCELUN}, {"IBM", "AuSaV1S2", NULL, BLIST_FORCELUN},
{"IBM", "ProFibre 4000R", "*", BLIST_SPARSELUN | BLIST_LARGELUN}, {"IBM", "ProFibre 4000R", "*", BLIST_SPARSELUN | BLIST_LARGELUN},
{"IBM", "2076", NULL, BLIST_NO_VPD_SIZE},
{"IBM", "2105", NULL, BLIST_RETRY_HWERROR}, {"IBM", "2105", NULL, BLIST_RETRY_HWERROR},
{"iomega", "jaz 1GB", "J.86", BLIST_NOTQ | BLIST_NOLUN}, {"iomega", "jaz 1GB", "J.86", BLIST_NOTQ | BLIST_NOLUN},
{"IOMEGA", "ZIP", NULL, BLIST_NOTQ | BLIST_NOLUN}, {"IOMEGA", "ZIP", NULL, BLIST_NOTQ | BLIST_NOLUN},
......
...@@ -1057,6 +1057,9 @@ static int scsi_add_lun(struct scsi_device *sdev, unsigned char *inq_result, ...@@ -1057,6 +1057,9 @@ static int scsi_add_lun(struct scsi_device *sdev, unsigned char *inq_result,
else if (*bflags & BLIST_SKIP_VPD_PAGES) else if (*bflags & BLIST_SKIP_VPD_PAGES)
sdev->skip_vpd_pages = 1; sdev->skip_vpd_pages = 1;
if (*bflags & BLIST_NO_VPD_SIZE)
sdev->no_vpd_size = 1;
transport_configure_device(&sdev->sdev_gendev); transport_configure_device(&sdev->sdev_gendev);
if (sdev->host->hostt->slave_configure) { if (sdev->host->hostt->slave_configure) {
......
...@@ -145,6 +145,7 @@ struct scsi_device { ...@@ -145,6 +145,7 @@ struct scsi_device {
const char * model; /* ... after scan; point to static string */ const char * model; /* ... after scan; point to static string */
const char * rev; /* ... "nullnullnullnull" before scan */ const char * rev; /* ... "nullnullnullnull" before scan */
#define SCSI_DEFAULT_VPD_LEN 255 /* default SCSI VPD page size (max) */
struct scsi_vpd __rcu *vpd_pg0; struct scsi_vpd __rcu *vpd_pg0;
struct scsi_vpd __rcu *vpd_pg83; struct scsi_vpd __rcu *vpd_pg83;
struct scsi_vpd __rcu *vpd_pg80; struct scsi_vpd __rcu *vpd_pg80;
...@@ -215,6 +216,7 @@ struct scsi_device { ...@@ -215,6 +216,7 @@ struct scsi_device {
* creation time */ * creation time */
unsigned ignore_media_change:1; /* Ignore MEDIA CHANGE on resume */ unsigned ignore_media_change:1; /* Ignore MEDIA CHANGE on resume */
unsigned silence_suspend:1; /* Do not print runtime PM related messages */ unsigned silence_suspend:1; /* Do not print runtime PM related messages */
unsigned no_vpd_size:1; /* No VPD size reported in header */
unsigned int queue_stopped; /* request queue is quiesced */ unsigned int queue_stopped; /* request queue is quiesced */
bool offline_already; /* Device offline message logged */ bool offline_already; /* Device offline message logged */
......
...@@ -32,7 +32,8 @@ ...@@ -32,7 +32,8 @@
#define BLIST_IGN_MEDIA_CHANGE ((__force blist_flags_t)(1ULL << 11)) #define BLIST_IGN_MEDIA_CHANGE ((__force blist_flags_t)(1ULL << 11))
/* do not do automatic start on add */ /* do not do automatic start on add */
#define BLIST_NOSTARTONADD ((__force blist_flags_t)(1ULL << 12)) #define BLIST_NOSTARTONADD ((__force blist_flags_t)(1ULL << 12))
#define __BLIST_UNUSED_13 ((__force blist_flags_t)(1ULL << 13)) /* do not ask for VPD page size first on some broken targets */
#define BLIST_NO_VPD_SIZE ((__force blist_flags_t)(1ULL << 13))
#define __BLIST_UNUSED_14 ((__force blist_flags_t)(1ULL << 14)) #define __BLIST_UNUSED_14 ((__force blist_flags_t)(1ULL << 14))
#define __BLIST_UNUSED_15 ((__force blist_flags_t)(1ULL << 15)) #define __BLIST_UNUSED_15 ((__force blist_flags_t)(1ULL << 15))
#define __BLIST_UNUSED_16 ((__force blist_flags_t)(1ULL << 16)) #define __BLIST_UNUSED_16 ((__force blist_flags_t)(1ULL << 16))
...@@ -74,8 +75,7 @@ ...@@ -74,8 +75,7 @@
#define __BLIST_HIGH_UNUSED (~(__BLIST_LAST_USED | \ #define __BLIST_HIGH_UNUSED (~(__BLIST_LAST_USED | \
(__force blist_flags_t) \ (__force blist_flags_t) \
((__force __u64)__BLIST_LAST_USED - 1ULL))) ((__force __u64)__BLIST_LAST_USED - 1ULL)))
#define __BLIST_UNUSED_MASK (__BLIST_UNUSED_13 | \ #define __BLIST_UNUSED_MASK (__BLIST_UNUSED_14 | \
__BLIST_UNUSED_14 | \
__BLIST_UNUSED_15 | \ __BLIST_UNUSED_15 | \
__BLIST_UNUSED_16 | \ __BLIST_UNUSED_16 | \
__BLIST_UNUSED_24 | \ __BLIST_UNUSED_24 | \
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment