On 3/1/22 21:35, Martin K. Petersen wrote:
+static int scsi_get_vpd_size(struct scsi_device *sdev, u8 page)
+{
+ unsigned char vpd_header[SCSI_VPD_HEADER_SIZE];
+ int result;
The SCSI core sets the minimum DMA alignment to 4 bytes. How about
aligning the vpd_header[] array explicitly to a four-byte boundary such
that the block layer does not have to allocate a temporary buffer?
+ vpd_len = min(vpd_len, buf_len);
- found:
- result = scsi_vpd_inquiry(sdev, buf, page, buf_len);
+retry_pg:
+ /*
+ * Fetch the actual page. Since the appropriate size was reported
+ * by the device it is now safe to ask for something bigger.
+ */
+ memset(buf, 0, buf_len);
+ result = scsi_vpd_inquiry(sdev, buf, page, vpd_len);
if (result < 0)
- goto fail;
+ return -EINVAL;
+ else if (result > vpd_len) {
+ dev_warn_once(&sdev->sdev_gendev,
+ "%s: VPD page 0x%02x result %d > %d bytes\n",
+ __func__, page, result, vpd_len);
+ vpd_len = min(result, buf_len);
+ goto retry_pg;
+ }
Will an endless loop be triggered if the VPD page length is larger than
'buf_len'?
Thanks,
Bart.