On 02/28/2014 06:01 PM, Christoph Hellwig wrote:
> On Thu, Feb 13, 2014 at 11:07:11AM +0100, Hannes Reinecke wrote:
>> EVPD page 0x83 is used to uniquely identify the device.
>> So instead of having each and every program issue a separate
>> SG_IO call to retrieve this information it does make far more
>> sense to display it in sysfs.
>
> This just shows binary data from the protocol, so shouldn't it be a
> binary sysfs attribute?
>
> In general I have to I prefer the actual text attributes, but this is
> still better than having to do all the SG_IO inquirys.
>
Binary sysfs attributes have a rather special handling, and IIRC
they should be used for direct hardware interaction only.
Also the hexdump is easier to parse for the unsuspecting user.
>> - * Returns 0 on success or a negative error number.
>> + * Returns size of the vpg page on success or a negative error number.
>> */
>> static int scsi_vpd_inquiry(struct scsi_device *sdev, unsigned char *buffer,
>> u8 page, unsigned len)
>> @@ -962,6 +962,9 @@ static int scsi_vpd_inquiry(struct scsi_device *sdev,
>> unsigned char *buffer,
>> int result;
>> unsigned char cmd[16];
>>
>> + if (len < 4)
>> + return -EINVAL;
>
> Seems the change in calling conventions for these existing functions
> should be split into a separate patch?
>
Ok.
>> /**
>> + * scsi_attach_vpd - Attach Vital Product Data to a SCSI device structure
>> + * @sdev: The device to ask
>> + *
>> + * Attach the 'Device Identification' VPD page (0x83) to a SCSI device
>> + * structure. This information can be used to identify the device
>> + * uniquely.
>> + */
>> +void scsi_attach_vpd(struct scsi_device *sdev)
>> +{
>> + int result, i;
>> + int vpd_len = 255;
>> + int pg83_supported = 0;
>> + unsigned char *vpd_buf;
>> +
>> + if (sdev->skip_vpd_pages)
>> + return;
>> +retry_pg0:
>> + vpd_buf = kmalloc(vpd_len, GFP_KERNEL);
>> + if (!vpd_buf)
>> + return;
>> +
>> + /* Ask for all the pages supported by this device */
>> + result = scsi_vpd_inquiry(sdev, vpd_buf, 0, vpd_len);
>> + if (result < 0) {
>> + kfree(vpd_buf);
>> + return;
>> + }
>> + if (result > vpd_len) {
>> + vpd_len = result;
>> + kfree(vpd_buf);
>> + goto retry_pg0;
>> + }
>> +
>> + for (i = 4; i < result; i++) {
>> + if (vpd_buf[i] == 0x83) {
>> + pg83_supported = 1;
>> + }
>> + }
>> + kfree(vpd_buf);
>
> Given how many checks all over the place we have which EVPD pages are
> suppored shouldn't we have query for evpd 0, and then set flags in the
> scsi device which are present?
>
> Either way I think the call to query evpd 0 should be a separate
> function, so even if we don't store the information it's abstracted out.
>
Hmm. That would work if we were just asking for a single page; but
when we're checking several pages (like 0x83 and 0x80) we'd need
either to pass in a page array or querying page 0 several times.
Neither of which is very appealing.
However, specifying additional flags for the individual pages might
work. I'll see what I can come up with.
>
> Also the ses code has another query for 0x83, which now could use the
> one attached to the scsi_device.
>
Ah. Missed that one. Will be converting it.
Cheers,
Hannes
--
Dr. Hannes Reinecke zSeries & Storage
[email protected] +49 911 74053 688
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 16746 (AG Nürnberg)
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html