[stgt] [PATCH V1] spc: Support NAA IEEE Registered Extended field in VPD page 0x83
Or Gerlitz
ogerlitz at mellanox.com
Thu Mar 13 10:40:37 CET 2014
From: Dennis Cullison <Dennis.Cullison at Teradata.com>
Enables support for the NAA IEEE Registered Extended field in the
inquiry VPD page 0x83. This field is used by multi-pathing
software for device persistency.
Signed-off-by: Dennis Cullison <Dennis.Cullison at Teradata.com>
Signed-off-by: Or Gerlitz <ogerlitz at mellanox.com>
---
changes from V0:
- fixed the patch to work when a long is 32 bits by using uint64_t type
- added some comments within the code as asked by Tomo
usr/spc.c | 32 +++++++++++++++++++++++++++++++-
1 files changed, 31 insertions(+), 1 deletions(-)
diff --git a/usr/spc.c b/usr/spc.c
index 29f39a9..cdb8a2a 100644
--- a/usr/spc.c
+++ b/usr/spc.c
@@ -145,6 +145,12 @@ static void update_vpd_83(struct scsi_lu *lu, void *id)
struct vpd *vpd_pg = lu->attrs.lu_vpd[PCODE_OFFSET(0x83)];
uint8_t *data = vpd_pg->data;
+ char *id_str = id;
+ char substring[] = "0";
+ uint64_t a = 0;
+ uint64_t b = 0;
+ uint64_t c;
+
data[0] = INQ_CODE_ASCII;
data[1] = DESG_T10;
data[3] = SCSI_ID_LEN;
@@ -160,6 +166,30 @@ static void update_vpd_83(struct scsi_lu *lu, void *id)
put_unaligned_be64(lu->attrs.numeric_id, data);
data[0] |= NAA_LOCAL << 4;
+
+ data += NAA_DESG_LEN;
+ data[0] = INQ_CODE_BIN;
+ data[1] = DESG_NAA;
+ data[3] = NAA_DESG_LEN_EXTD;
+ data += DESG_HDR_LEN;
+ /*
+ * The NAA_DESG_LEN_EXTD field is a 128 bit field
+ * which contains a numeric value. This loop converts
+ * the string pointed to by 'id_str' into a right
+ * adjusted numeric value.
+ */
+ while (*id_str) {
+ substring[0] = *id_str++;
+ c = a >> 60;
+ a <<= 4;
+ b <<= 4;
+ b |= c;
+ a |= strtoul(substring, NULL, 16);
+ }
+ put_unaligned_be64(b, data);
+ put_unaligned_be64(a, data + 8);
+ data[0] &= 0x0F;
+ data[0] |= NAA_IEEE_REGD_EXTD << 4;
}
static void update_vpd_b2(struct scsi_lu *lu, void *id)
@@ -2060,7 +2090,7 @@ int spc_lu_init(struct scsi_lu *lu)
/* VPD page 0x83 */
pg = PCODE_OFFSET(0x83);
- lu_vpd[pg] = alloc_vpd(2*DESG_HDR_LEN + NAA_DESG_LEN + SCSI_ID_LEN);
+ lu_vpd[pg] = alloc_vpd(3*DESG_HDR_LEN + NAA_DESG_LEN + SCSI_ID_LEN + NAA_DESG_LEN_EXTD);
if (!lu_vpd[pg])
return -ENOMEM;
lu_vpd[pg]->vpd_update = update_vpd_83;
--
1.7.1
--
To unsubscribe from this list: send the line "unsubscribe stgt" in
the body of a message to majordomo at vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
More information about the stgt
mailing list