Re: [PATCH v3 1/3] scsi: Provide for avoiding trailing allocation length with VPD inquiries

From: Khalid Aziz and Shuah Khan
Date: Tue Jan 04 2022 - 11:48:03 EST


On 1/3/22 01:23, Christoph Hellwig wrote:
On Sun, Jan 02, 2022 at 11:23:45PM +0000, Maciej W. Rozycki wrote:
Allow SCSI hosts to request avoiding trailing allocation length with VPD
inquiries, and use the mechanism to work around an issue with at least
some BusLogic MultiMaster host bus adapters and observed with the BT-958
model specifically where issuing commands that return less data than
provided for causes fatal failures:
Wouldn't it make more sesnse to hide this quirk insde of
scsi_vpd_inquiry to also handle the scsi_get_vpd_buf case? Something
like:


diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c
index 211aace69c22c..194a51f772aaa 100644
--- a/drivers/scsi/scsi.c
+++ b/drivers/scsi/scsi.c
@@ -289,8 +289,8 @@ EXPORT_SYMBOL(scsi_track_queue_full);
*
* Returns size of the vpd page on success or a negative error number.
*/
-static int scsi_vpd_inquiry(struct scsi_device *sdev, unsigned char *buffer,
- u8 page, unsigned len)
+static int __scsi_vpd_inquiry(struct scsi_device *sdev, unsigned char *buffer,
+ u8 page, unsigned len)
{
int result;
unsigned char cmd[16];
@@ -321,6 +321,20 @@ static int scsi_vpd_inquiry(struct scsi_device *sdev, unsigned char *buffer,
return get_unaligned_be16(&buffer[2]) + 4;
}
+static int scsi_vpd_inquiry(struct scsi_device *sdev, unsigned char *buffer,
+ u8 page, unsigned len)
+{
+ if (sdev->host->no_trailing_allocation_length) {
+ int ret = __scsi_vpd_inquiry(sdev, buffer, page, min(4U, len));
+
+ if (ret < 4)
+ return ret;
+ len = min_t(unsigned int, ret, len);
+ }
+
+ return __scsi_vpd_inquiry(sdev, buffer, page, len);
+}
+
/**
* scsi_get_vpd_page - Get Vital Product Data from a SCSI device
* @sdev: The device to ask

This is certainly better. It consolidates all the special cases for getting VPD pages in one location and ensures no cases are missed.

--
Khalid