svn commit: r267639 - head/sys/cam/ctl
Adrian Chadd
adrian at freebsd.org
Thu Jun 19 16:57:27 UTC 2014
FreeBSD_version?
-a
On 19 June 2014 02:46, Alexander Motin <mav at freebsd.org> wrote:
> Author: mav
> Date: Thu Jun 19 09:46:43 2014
> New Revision: 267639
> URL: http://svnweb.freebsd.org/changeset/base/267639
>
> Log:
> Increase CTL_DEVID_LEN from 16 to 64 bytes.
>
> SPC-4 recommends T10 vendor ID based LUN ID was created by concatenating
> product name and serial number (and istgt follows that). But product name
> is 16 bytes long by itself, so 16 bytes total length is clearly not enough
> to fit both.
>
> To keep compatibility with existing configurations, pad short device IDs
> to old length of 16, same as before.
>
> This change probably breaks CTL user-level ABI, so control tools should
> be rebuilt after this change.
>
> MFC after: 2 weeks
>
> Modified:
> head/sys/cam/ctl/ctl.c
> head/sys/cam/ctl/ctl.h
> head/sys/cam/ctl/ctl_frontend_iscsi.c
>
> Modified: head/sys/cam/ctl/ctl.c
> ==============================================================================
> --- head/sys/cam/ctl/ctl.c Thu Jun 19 09:08:20 2014 (r267638)
> +++ head/sys/cam/ctl/ctl.c Thu Jun 19 09:46:43 2014 (r267639)
> @@ -91,12 +91,6 @@ struct ctl_softc *control_softc = NULL;
> #define CTL_DONE_THREAD
>
> /*
> - * Use the serial number and device ID provided by the backend, rather than
> - * making up our own.
> - */
> -#define CTL_USE_BACKEND_SN
> -
> -/*
> * Size and alignment macros needed for Copan-specific HA hardware. These
> * can go away when the HA code is re-written, and uses busdma for any
> * hardware.
> @@ -9477,9 +9471,6 @@ ctl_inquiry_evpd_serial(struct ctl_scsii
> {
> struct scsi_vpd_unit_serial_number *sn_ptr;
> struct ctl_lun *lun;
> -#ifndef CTL_USE_BACKEND_SN
> - char tmpstr[32];
> -#endif
>
> lun = (struct ctl_lun *)ctsio->io_hdr.ctl_private[CTL_PRIV_LUN].ptr;
>
> @@ -9513,7 +9504,6 @@ ctl_inquiry_evpd_serial(struct ctl_scsii
>
> sn_ptr->page_code = SVPD_UNIT_SERIAL_NUMBER;
> sn_ptr->length = ctl_min(sizeof(*sn_ptr) - 4, CTL_SN_LEN);
> -#ifdef CTL_USE_BACKEND_SN
> /*
> * If we don't have a LUN, we just leave the serial number as
> * all spaces.
> @@ -9523,15 +9513,6 @@ ctl_inquiry_evpd_serial(struct ctl_scsii
> strncpy((char *)sn_ptr->serial_num,
> (char *)lun->be_lun->serial_num, CTL_SN_LEN);
> }
> -#else
> - /*
> - * Note that we're using a non-unique serial number here,
> - */
> - snprintf(tmpstr, sizeof(tmpstr), "MYSERIALNUMIS000");
> - memset(sn_ptr->serial_num, 0x20, sizeof(sn_ptr->serial_num));
> - strncpy(sn_ptr->serial_num, tmpstr, ctl_min(CTL_SN_LEN,
> - ctl_min(sizeof(tmpstr), sizeof(*sn_ptr) - 4)));
> -#endif
> ctsio->scsi_status = SCSI_STATUS_OK;
>
> ctsio->be_move_done = ctl_config_move_done;
> @@ -9552,10 +9533,7 @@ ctl_inquiry_evpd_devid(struct ctl_scsiio
> struct ctl_lun *lun;
> struct ctl_frontend *fe;
> char *val;
> -#ifndef CTL_USE_BACKEND_SN
> - char tmpstr[32];
> -#endif /* CTL_USE_BACKEND_SN */
> - int devid_len;
> + int data_len, devid_len;
>
> ctl_softc = control_softc;
>
> @@ -9568,23 +9546,30 @@ ctl_inquiry_evpd_devid(struct ctl_scsiio
>
> lun = (struct ctl_lun *)ctsio->io_hdr.ctl_private[CTL_PRIV_LUN].ptr;
>
> - devid_len = sizeof(struct scsi_vpd_device_id) +
> + if (lun == NULL) {
> + devid_len = CTL_DEVID_MIN_LEN;
> + } else {
> + devid_len = max(CTL_DEVID_MIN_LEN,
> + strnlen(lun->be_lun->device_id, CTL_DEVID_LEN));
> + }
> +
> + data_len = sizeof(struct scsi_vpd_device_id) +
> sizeof(struct scsi_vpd_id_descriptor) +
> - sizeof(struct scsi_vpd_id_t10) + CTL_DEVID_LEN +
> + sizeof(struct scsi_vpd_id_t10) + devid_len +
> sizeof(struct scsi_vpd_id_descriptor) + CTL_WWPN_LEN +
> sizeof(struct scsi_vpd_id_descriptor) +
> sizeof(struct scsi_vpd_id_rel_trgt_port_id) +
> sizeof(struct scsi_vpd_id_descriptor) +
> sizeof(struct scsi_vpd_id_trgt_port_grp_id);
>
> - ctsio->kern_data_ptr = malloc(devid_len, M_CTL, M_WAITOK | M_ZERO);
> + ctsio->kern_data_ptr = malloc(data_len, M_CTL, M_WAITOK | M_ZERO);
> devid_ptr = (struct scsi_vpd_device_id *)ctsio->kern_data_ptr;
> ctsio->kern_sg_entries = 0;
>
> - if (devid_len < alloc_len) {
> - ctsio->residual = alloc_len - devid_len;
> - ctsio->kern_data_len = devid_len;
> - ctsio->kern_total_len = devid_len;
> + if (data_len < alloc_len) {
> + ctsio->residual = alloc_len - data_len;
> + ctsio->kern_data_len = data_len;
> + ctsio->kern_total_len = data_len;
> } else {
> ctsio->residual = 0;
> ctsio->kern_data_len = alloc_len;
> @@ -9597,7 +9582,7 @@ ctl_inquiry_evpd_devid(struct ctl_scsiio
> desc = (struct scsi_vpd_id_descriptor *)devid_ptr->desc_list;
> t10id = (struct scsi_vpd_id_t10 *)&desc->identifier[0];
> desc1 = (struct scsi_vpd_id_descriptor *)(&desc->identifier[0] +
> - sizeof(struct scsi_vpd_id_t10) + CTL_DEVID_LEN);
> + sizeof(struct scsi_vpd_id_t10) + devid_len);
> desc2 = (struct scsi_vpd_id_descriptor *)(&desc1->identifier[0] +
> CTL_WWPN_LEN);
> desc3 = (struct scsi_vpd_id_descriptor *)(&desc2->identifier[0] +
> @@ -9615,7 +9600,7 @@ ctl_inquiry_evpd_devid(struct ctl_scsiio
>
> devid_ptr->page_code = SVPD_DEVICE_ID;
>
> - scsi_ulto2b(devid_len - 4, devid_ptr->length);
> + scsi_ulto2b(data_len - 4, devid_ptr->length);
>
> mtx_lock(&ctl_softc->ctl_lock);
>
> @@ -9644,7 +9629,7 @@ ctl_inquiry_evpd_devid(struct ctl_scsiio
> * per-LUN identifier.
> */
> desc->id_type = SVPD_ID_PIV | SVPD_ID_ASSOC_LUN | SVPD_ID_TYPE_T10;
> - desc->length = sizeof(*t10id) + CTL_DEVID_LEN;
> + desc->length = sizeof(*t10id) + devid_len;
> if (lun == NULL || (val = ctl_get_opt(lun->be_lun, "vendor")) == NULL) {
> strncpy((char *)t10id->vendor, CTL_VENDOR, sizeof(t10id->vendor));
> } else {
> @@ -9701,7 +9686,6 @@ ctl_inquiry_evpd_devid(struct ctl_scsiio
> else
> desc3->identifier[3] = 2;
>
> -#ifdef CTL_USE_BACKEND_SN
> /*
> * If we've actually got a backend, copy the device id from the
> * per-LUN data. Otherwise, set it to all spaces.
> @@ -9711,19 +9695,13 @@ ctl_inquiry_evpd_devid(struct ctl_scsiio
> * Copy the backend's LUN ID.
> */
> strncpy((char *)t10id->vendor_spec_id,
> - (char *)lun->be_lun->device_id, CTL_DEVID_LEN);
> + (char *)lun->be_lun->device_id, devid_len);
> } else {
> /*
> * No backend, set this to spaces.
> */
> - memset(t10id->vendor_spec_id, 0x20, CTL_DEVID_LEN);
> + memset(t10id->vendor_spec_id, 0x20, devid_len);
> }
> -#else
> - snprintf(tmpstr, sizeof(tmpstr), "MYDEVICEIDIS%4d",
> - (lun != NULL) ? (int)lun->lun : 0);
> - strncpy(t10id->vendor_spec_id, tmpstr, ctl_min(CTL_DEVID_LEN,
> - sizeof(tmpstr)));
> -#endif
>
> ctsio->scsi_status = SCSI_STATUS_OK;
>
>
> Modified: head/sys/cam/ctl/ctl.h
> ==============================================================================
> --- head/sys/cam/ctl/ctl.h Thu Jun 19 09:08:20 2014 (r267638)
> +++ head/sys/cam/ctl/ctl.h Thu Jun 19 09:46:43 2014 (r267639)
> @@ -96,7 +96,8 @@ union ctl_modepage_info {
> /*
> * Device ID length, for VPD page 0x83.
> */
> -#define CTL_DEVID_LEN 16
> +#define CTL_DEVID_LEN 64
> +#define CTL_DEVID_MIN_LEN 16
> /*
> * WWPN length, for VPD page 0x83.
> */
>
> Modified: head/sys/cam/ctl/ctl_frontend_iscsi.c
> ==============================================================================
> --- head/sys/cam/ctl/ctl_frontend_iscsi.c Thu Jun 19 09:08:20 2014 (r267638)
> +++ head/sys/cam/ctl/ctl_frontend_iscsi.c Thu Jun 19 09:46:43 2014 (r267639)
> @@ -2060,7 +2060,7 @@ cfiscsi_devid(struct ctl_scsiio *ctsio,
> const struct icl_pdu *request;
> int i, ret;
> char *val;
> - size_t devid_len, wwnn_len, wwpn_len, lun_name_len;
> + size_t data_len, devid_len, wwnn_len, wwpn_len, lun_name_len;
>
> lun = (struct ctl_lun *)ctsio->io_hdr.ctl_private[CTL_PRIV_LUN].ptr;
> request = ctsio->io_hdr.ctl_private[CTL_PRIV_FRONTEND].ptr;
> @@ -2078,8 +2078,11 @@ cfiscsi_devid(struct ctl_scsiio *ctsio,
> wwnn_len += (4 - (wwnn_len % 4));
>
> if (lun == NULL) {
> + devid_len = CTL_DEVID_MIN_LEN;
> lun_name_len = 0;
> } else {
> + devid_len = max(CTL_DEVID_MIN_LEN,
> + strnlen(lun->be_lun->device_id, CTL_DEVID_LEN));
> lun_name_len = strlen(cs->cs_target->ct_name);
> lun_name_len += strlen(",lun,XXXXXXXX");
> lun_name_len += 1; /* '\0' */
> @@ -2087,9 +2090,9 @@ cfiscsi_devid(struct ctl_scsiio *ctsio,
> lun_name_len += (4 - (lun_name_len % 4));
> }
>
> - devid_len = sizeof(struct scsi_vpd_device_id) +
> + data_len = sizeof(struct scsi_vpd_device_id) +
> sizeof(struct scsi_vpd_id_descriptor) +
> - sizeof(struct scsi_vpd_id_t10) + CTL_DEVID_LEN +
> + sizeof(struct scsi_vpd_id_t10) + devid_len +
> sizeof(struct scsi_vpd_id_descriptor) + lun_name_len +
> sizeof(struct scsi_vpd_id_descriptor) + wwnn_len +
> sizeof(struct scsi_vpd_id_descriptor) + wwpn_len +
> @@ -2098,14 +2101,14 @@ cfiscsi_devid(struct ctl_scsiio *ctsio,
> sizeof(struct scsi_vpd_id_descriptor) +
> sizeof(struct scsi_vpd_id_trgt_port_grp_id);
>
> - ctsio->kern_data_ptr = malloc(devid_len, M_CTL, M_WAITOK | M_ZERO);
> + ctsio->kern_data_ptr = malloc(data_len, M_CTL, M_WAITOK | M_ZERO);
> devid_ptr = (struct scsi_vpd_device_id *)ctsio->kern_data_ptr;
> ctsio->kern_sg_entries = 0;
>
> - if (devid_len < alloc_len) {
> - ctsio->residual = alloc_len - devid_len;
> - ctsio->kern_data_len = devid_len;
> - ctsio->kern_total_len = devid_len;
> + if (data_len < alloc_len) {
> + ctsio->residual = alloc_len - data_len;
> + ctsio->kern_data_len = data_len;
> + ctsio->kern_total_len = data_len;
> } else {
> ctsio->residual = 0;
> ctsio->kern_data_len = alloc_len;
> @@ -2118,7 +2121,7 @@ cfiscsi_devid(struct ctl_scsiio *ctsio,
> desc = (struct scsi_vpd_id_descriptor *)devid_ptr->desc_list;
> t10id = (struct scsi_vpd_id_t10 *)&desc->identifier[0];
> desc1 = (struct scsi_vpd_id_descriptor *)(&desc->identifier[0] +
> - sizeof(struct scsi_vpd_id_t10) + CTL_DEVID_LEN);
> + sizeof(struct scsi_vpd_id_t10) + devid_len);
> desc2 = (struct scsi_vpd_id_descriptor *)(&desc1->identifier[0] +
> lun_name_len);
> desc3 = (struct scsi_vpd_id_descriptor *)(&desc2->identifier[0] +
> @@ -2136,7 +2139,7 @@ cfiscsi_devid(struct ctl_scsiio *ctsio,
>
> devid_ptr->page_code = SVPD_DEVICE_ID;
>
> - scsi_ulto2b(devid_len - 4, devid_ptr->length);
> + scsi_ulto2b(data_len - 4, devid_ptr->length);
>
> /*
> * We're using a LUN association here. i.e., this device ID is a
> @@ -2144,7 +2147,7 @@ cfiscsi_devid(struct ctl_scsiio *ctsio,
> */
> desc->proto_codeset = (SCSI_PROTO_ISCSI << 4) | SVPD_ID_CODESET_ASCII;
> desc->id_type = SVPD_ID_PIV | SVPD_ID_ASSOC_LUN | SVPD_ID_TYPE_T10;
> - desc->length = sizeof(*t10id) + CTL_DEVID_LEN;
> + desc->length = sizeof(*t10id) + devid_len;
> if (lun == NULL || (val = ctl_get_opt(lun->be_lun, "vendor")) == NULL) {
> strncpy((char *)t10id->vendor, CTL_VENDOR, sizeof(t10id->vendor));
> } else {
> @@ -2162,12 +2165,12 @@ cfiscsi_devid(struct ctl_scsiio *ctsio,
> * Copy the backend's LUN ID.
> */
> strncpy((char *)t10id->vendor_spec_id,
> - (char *)lun->be_lun->device_id, CTL_DEVID_LEN);
> + (char *)lun->be_lun->device_id, devid_len);
> } else {
> /*
> * No backend, set this to spaces.
> */
> - memset(t10id->vendor_spec_id, 0x20, CTL_DEVID_LEN);
> + memset(t10id->vendor_spec_id, 0x20, devid_len);
> }
>
> /*
>
More information about the svn-src-head
mailing list