On Thu, 2026-03-26 at 23:41 -0400, Benjamin Marzinski wrote:
> Some older SCSI devices return a SCSI-2 style vpd page 0x83, instead
> of
> a SPC-2/3 format one. The SCSI-2 page 83 format returns an IEEE WWN
> in
> binary encoded hexi-decimal in the 16 bytes following the initial
> 4-byte page 83 reply header.
> 
> Check the 7th byte of the vpd page 83 buffer to determine whether
> this
> is a SCSI-2 or SPC-2/3 confomant one. Byte 7 is the 3rd byte of first
> Identification descriptor in a SPC-2/3 confromant vpd page 83. This
> is a
> reserved field, and is guaranteed to be 0. If it is not zero, then it
> is
> likely the 3rd byte of a SCSI-2 Identifier (The first 3 bytes of the
> ID
> are the Organizationally Unique Identifier). Both the sg_inq and
> scsi_id
> commands handle vpd page 83 this way. To make sure that the WWID
> which
> multipath reads directly from the device matches, it should handle
> this
> format as well.
> 
> Signed-off-by: Benjamin Marzinski <[email protected]>
> ---
>  libmultipath/discovery.c | 13 +++++++++
>  tests/vpd.c              | 58
> ++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 71 insertions(+)
> 
> diff --git a/libmultipath/discovery.c b/libmultipath/discovery.c
> index 0efb8213..057ff45f 100644
> --- a/libmultipath/discovery.c
> +++ b/libmultipath/discovery.c
> @@ -1208,6 +1208,18 @@ parse_vpd_pg83(const unsigned char *in, size_t
> in_len,
>       if (out_len <= 1)
>               return 0;
>  
> +     /*
> +      * Not a valid SPC-2/3 vpd page 83. Assume it's a SCSI-2
> style
> +      * descriptor.
> +      */
> +     if (in[6] != 0) {

Make sure that if in_len is > 6 (or actually, large enough to hold the
SCSI-2 ID)?

> +             len = 0;
> +             vpd_type = 0x3;
> +             vpd_len = in_len - 4;
> +             vpd = in + 4;
> +             goto decode;
> +     }
> +

Regards,
Martin

Reply via email to