From: Douglas Gilbert <dgilbert@interlog.com>
To: "Nicholas A. Bellinger" <nab@linux-iscsi.org>
Cc: LKML <linux-kernel@vger.kernel.org>,
linux-scsi <linux-scsi@vger.kernel.org>,
Brad Fennell <wavebender@hotmail.com>,
Jason Hodges <jasonahodges@gmail.com>,
Rafiu Fakunle <rafiu@openfiler.com>
Subject: Re: Subject: [PATCH] [Target_Core_Mod]: Add EVPD 0x83 NAA Registered Extended Assigned identifer support
Date: Sun, 29 Mar 2009 12:09:59 -0400 [thread overview]
Message-ID: <49CF9D57.3030607@interlog.com> (raw)
In-Reply-To: <1238299172.4250.116.camel@haakon2.linux-iscsi.org>
Nicholas A. Bellinger wrote:
> Greetings all,
>
> This patch adds emulation for EVPD 0x83 NAA identifier type (0x3) Registered
> Extended Assigned format (0x6) from spc4r17 section 7.7.3.6.5. The WWN value
> is based on the emulated Unit Serial Number supplied via ConfigFS into
> /sys/kernel/config/target/core/$HBA/$DEV/wwn/evpd_unit_serial for a
> given storage object.
Nicholas,
May I suggest:
s/evpd_unit_serial/vpd_unit_serial/
The "E" in EVPD stands for "enable" and should be used to
refer to bit 0, byte 1 in the SCSI INQUIRY command block
(cdb). So together with the page code field (byte 2 of the
cdb) that forms a so-called "non-standard" INQUIRY requesting
a VPD page. I think all other usages should prefer "VPD"
or "vpd" (for "vital product data").
My sg3_utils package is partially responsible for the misuse
of EVPD and I have been slowly converting such instances
to VPD (hopefully I just stamped out the final ones).
Doug Gilbert
> This patch expects evpd_unit_serial to be in hex. The first 24 bytes of
> evpd_unit_serial is then encoded in binary hex starting at the
> VENDOR_SPECIFIC_IDENTIFIER (36-bit) and VENDOR_SPECIFIC_IDENTIFIER_EXTENTION
> (64-bit) fields of the NAA identifier.
>
> This patch also uses the OpenFabrics OUI (001405) for the IEEE Company ID
> field of the NAA identifier. Note that the NAA (0x3) identifer is a requirement
> for logical unit WWN on certain iSCSI capable cluster clients.
>
> These patches are made against lio-core-2.6.git/master and tested on
> v2.6.29 x86 32-bit HVM using sg_inq from sg3_utils. The lio-core-2.6.git tree
> can be found at:
>
> http://git.kernel.org/?p=linux/kernel/git/nab/lio-core-2.6.git;a=summary
>
> Here is what it looks like:
>
> *) Set WWN value to target_core_mod/IBLOCK exported Linux LVM blockdevice
>
> echo a97e4ce21c0711de829b000c2943d57b > $TARGET/iblock_0/lvm_test0/wwn/evpd_unit_serial
>
> *) From target_core_mod side kernel buffer
>
> IBLOCK: Created bio_set() for major/minor: 254:2
> iblock: Using SPC3_PERSISTENT_RESERVATIONS emulation
> iblock: Enabling ALUA Emulation for SPC-3 device
> iblock: Adding to default ALUA LU Group: core/alua/lu_gps/default_lu_gp
> CORE_iBLOCK[0] - Activating Device with TCQ: 0 at Major: 254 Minor 2
> Vendor: LIO-ORG Model: IBLOCK Revision: 3.0
> Type: Direct-Access ANSI SCSI revision: 05
> T10 EVPD Unit Serial Number: a97e4ce21c0711de829b000c2943d57b
> T10 EVPD Page Length: 72
> T10 EVPD Identifer Length: 16
> T10 EVPD Identifier Association: addressed logical unit
> T10 EVPD Identifier Type: NAA
> T10 EVPD Binary Device Identifier: 36001405a97e4ce21c0711de829b000c2
>
> *) From Open/iSCSI initiator side using sg_inq
>
> initiator#~# sg_inq -p 0x83 -v /dev/sde
> VPD INQUIRY: Device Identification page
> inquiry cdb: 12 01 83 00 fc 00
> Designation descriptor number 1, descriptor length: 20
> id_type: NAA, code_set: Binary
> associated with the addressed logical unit
> NAA 6, IEEE Company_id: 0x1405
> Vendor Specific Identifier: 0xa97e4ce21
> Vendor Specific Identifier Extension: 0xc0711de829b000c2
> [0x6001405a97e4ce21c0711de829b000c2]
> Designation descriptor number 2, descriptor length: 52
> id_type: T10 vendor identification, code_set: ASCII
> associated with the addressed logical unit
> vendor id: LIO-ORG
> vendor specific: IBLOCK:a97e4ce21c0711de829b000c2943d57b
> Designation descriptor number 3, descriptor length: 8
> transport: Internet SCSI (iSCSI)
> id_type: Relative target port, code_set: Binary
> associated with the target port
> Relative target port: 0x2
> Designation descriptor number 4, descriptor length: 8
> transport: Internet SCSI (iSCSI)
> id_type: Target port group, code_set: Binary
> associated with the target port
> Target port group: 0x0
> Designation descriptor number 5, descriptor length: 8
> id_type: Logical unit group, code_set: Binary
> associated with the addressed logical unit
> Logical unit group: 0x0
> Designation descriptor number 6, descriptor length: 72
> transport: Internet SCSI (iSCSI)
> id_type: SCSI name string, code_set: UTF-8
> associated with the target port
> SCSI name string:
> iqn.2003-01.org.linux-iscsi.target.i686:sn.cff3eedbd2fd,t,0x0001
>
> Signed-off-by: Nicholas A. Bellinger <nab@linux-iscsi.org>
> ---
> drivers/lio-core/target_core_transport.c | 117 +++++++++++++++++++++++++-----
> 1 files changed, 100 insertions(+), 17 deletions(-)
>
> diff --git a/drivers/lio-core/target_core_transport.c b/drivers/lio-core/target_core_transport.c
> index 4132da1..e8879a9 100644
> --- a/drivers/lio-core/target_core_transport.c
> +++ b/drivers/lio-core/target_core_transport.c
> @@ -4142,6 +4142,33 @@ static inline void transport_get_maps(se_cmd_t *cmd)
> cmd->transport_unmap_SG_segments = &transport_generic_unmap_SG_segments;
> }
>
> +static unsigned char asciihex_to_binaryhex(unsigned char val[2])
> +{
> + unsigned char result = 0;
> + /*
> + * MSB
> + */
> + if ((val[0] >= 'a') && (val[0] <= 'f'))
> + result = ((val[0] - 'a' + 10) & 0xf) << 4;
> + else
> + if ((val[0] >= 'A') && (val[0] <= 'F'))
> + result = ((val[0] - 'A' + 10) & 0xf) << 4;
> + else /* digit */
> + result = ((val[0] - '0') & 0xf) << 4;
> + /*
> + * LSB
> + */
> + if ((val[1] >= 'a') && (val[1] <= 'f'))
> + result |= ((val[1] - 'a' + 10) & 0xf);
> + else
> + if ((val[1] >= 'A') && (val[1] <= 'F'))
> + result |= ((val[1] - 'A' + 10) & 0xf);
> + else /* digit */
> + result |= ((val[1] - '0') & 0xf);
> +
> + return result;
> +}
> +
> extern int transport_generic_emulate_inquiry(
> se_cmd_t *cmd,
> unsigned char type,
> @@ -4157,10 +4184,11 @@ extern int transport_generic_emulate_inquiry(
> t10_alua_tg_pt_gp_member_t *tg_pt_gp_mem;
> unsigned char *buf = (unsigned char *) T_TASK(cmd)->t_task_buf;
> unsigned char *cdb = T_TASK(cmd)->t_task_cdb;
> - unsigned char *iqn_sn;
> + unsigned char *iqn_sn, binary, binary_new;
> u32 prod_len, iqn_sn_len, se_location_len;
> u32 unit_serial_len, off = 0;
> - u16 len = 0;
> + int i;
> + u16 len = 0, id_len;
>
> /*
> * Make sure we at least have 8 bytes of INQUIRY response payload
> @@ -4256,10 +4284,61 @@ extern int transport_generic_emulate_inquiry(
> * DESIGNATOR TYPEs see spc4r17 Table 459.
> */
> buf[1] = 0x83;
> + off = 4;
> + /*
> + * NAA IEEE Registered Extended Assigned designator format,
> + * see spc4r17 section 7.7.3.6.5
> + *
> + * We depend upon a target_core_mod/ConfigFS provided
> + * /sys/kernel/config/target/core/$HBA/$DEV/wwn/evpd_unit_serial
> + * value in order to return the NAA id.
> + */
> + if (!(dev->se_sub_dev->su_dev_flags &
> + SDF_EMULATED_EVPD_UNIT_SERIAL))
> + goto check_t10_vend_desc;
> + if ((off + 20) > cmd->data_length)
> + goto check_t10_vend_desc;
> + /* CODE SET == Binary */
> + buf[off++] = 0x1;
> + /* Set ASSOICATION == addressed logical unit: 0)b */
> + buf[off] = 0x00;
> + /* Identifier/Designator type == NAA identifier */
> + buf[off++] = 0x3;
> + off++;
> + /* Identifier/Designator length */
> + buf[off++] = 0x10;
> + /*
> + * Start NAA IEEE Registered Extended Identifier/Designator
> + */
> + buf[off++] = (0x6 << 4);
> + /*
> + * Use OpenFabrics IEEE Company ID: 00 14 05
> + */
> + buf[off++] = 0x01;
> + buf[off++] = 0x40;
> + buf[off] = (0x5 << 4);
> + /*
> + * Return ConfigFS Unit Serial Number information for
> + * VENDOR_SPECIFIC_IDENTIFIER and
> + * VENDOR_SPECIFIC_IDENTIFIER_EXTENTION
> + */
> + binary = asciihex_to_binaryhex(
> + &DEV_T10_WWN(dev)->unit_serial[0]);
> + buf[off++] |= (binary & 0xf0) >> 4;
> + for (i = 0; i < 24; i += 2) {
> + binary_new = asciihex_to_binaryhex(
> + &DEV_T10_WWN(dev)->unit_serial[i+2]);
> + buf[off] = (binary & 0x0f) << 4;
> + buf[off++] |= (binary_new & 0xf0) >> 4;
> + binary = binary_new;
> + }
> + len = 20;
> + off = (len + 4);
> +check_t10_vend_desc:
> /*
> * T10 Vendor Identifier Page, see spc4r17 section 7.7.3.4
> */
> - len += 8; /* For Vendor field */
> + id_len = 8; /* For Vendor field */
> prod_len = 4; /* For EVPD Header */
> prod_len += 8; /* For Vendor field */
> prod_len += strlen(prod);
> @@ -4271,12 +4350,14 @@ extern int transport_generic_emulate_inquiry(
> strlen(&DEV_T10_WWN(dev)->unit_serial[0]);
> unit_serial_len++; /* For NULL Terminator */
>
> - if (((len + 4) + (prod_len + unit_serial_len)) >
> + if ((len + (id_len + 4) +
> + (prod_len + unit_serial_len)) >
> cmd->data_length) {
> len += (prod_len + unit_serial_len);
> goto check_port;
> }
> - len += sprintf((unsigned char *)&buf[16], "%s:%s", prod,
> + id_len += sprintf((unsigned char *)&buf[off+12],
> + "%s:%s", prod,
> &DEV_T10_WWN(dev)->unit_serial[0]);
> } else {
> iqn_sn = transport_get_iqn_sn();
> @@ -4285,24 +4366,26 @@ extern int transport_generic_emulate_inquiry(
> se_location_len = strlen(se_location);
> se_location_len++; /* For NULL Terminator */
>
> - if (((len + 4) + (prod_len + iqn_sn_len +
> + if ((len + (id_len + 4) + (prod_len + iqn_sn_len +
> se_location_len)) > cmd->data_length) {
> len += (prod_len + iqn_sn_len +
> se_location_len);
> goto check_port;
> }
> - len += sprintf((unsigned char *)&buf[16], "%s:%s:%s",
> - prod, iqn_sn, se_location);
> + id_len += sprintf((unsigned char *)&buf[off+12],
> + "%s:%s:%s", prod, iqn_sn, se_location);
> }
> - buf[4] = 0x2; /* ASCII */
> - buf[5] = 0x1; /* T10 Vendor ID */
> - buf[6] = 0x0;
> - memcpy((unsigned char *)&buf[8], "LIO-ORG", 8);
> -
> - len++; /* Extra Byte for NULL Terminator */
> - buf[7] = len; /* Identifier Length */
> - len += 4; /* Header size for Designation descriptor */
> - off = (len + 4);
> + buf[off] = 0x2; /* ASCII */
> + buf[off+1] = 0x1; /* T10 Vendor ID */
> + buf[off+2] = 0x0;
> + memcpy((unsigned char *)&buf[off+4], "LIO-ORG", 8);
> + /* Extra Byte for NULL Terminator */
> + id_len++;
> + /* Identifier Length */
> + buf[off+3] = id_len;
> + /* Header size for Designation descriptor */
> + len += (id_len + 4);
> + off += (id_len + 4);
> /*
> * se_port_t is only set for INQUIRY EVPD=1 through $FABRIC_MOD
> */
next prev parent reply other threads:[~2009-03-29 16:10 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-03-29 3:59 Subject: [PATCH] [Target_Core_Mod]: Add EVPD 0x83 NAA Registered Extended Assigned identifer support Nicholas A. Bellinger
2009-03-29 16:09 ` Douglas Gilbert [this message]
2009-03-31 3:46 ` Nicholas A. Bellinger
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=49CF9D57.3030607@interlog.com \
--to=dgilbert@interlog.com \
--cc=jasonahodges@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-scsi@vger.kernel.org \
--cc=nab@linux-iscsi.org \
--cc=rafiu@openfiler.com \
--cc=wavebender@hotmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.