Re: [PATCH 02/14] scsi: core: Query VPD size before getting full page

Bart Van Assche
2022-03-03T00:30:54Z

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.