diff options
-rw-r--r-- | sys/cam/ctl/ctl.c | 62 | ||||
-rw-r--r-- | sys/cam/ctl/ctl.h | 3 | ||||
-rw-r--r-- | sys/cam/ctl/ctl_frontend_iscsi.c | 29 |
3 files changed, 38 insertions, 56 deletions
diff --git a/sys/cam/ctl/ctl.c b/sys/cam/ctl/ctl.c index 7afc155..6d0a8e7 100644 --- a/sys/cam/ctl/ctl.c +++ b/sys/cam/ctl/ctl.c @@ -83,12 +83,6 @@ __FBSDID("$FreeBSD$"); struct ctl_softc *control_softc = NULL; /* - * 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. @@ -9480,9 +9474,6 @@ ctl_inquiry_evpd_serial(struct ctl_scsiio *ctsio, int alloc_len) { 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; @@ -9516,7 +9507,6 @@ ctl_inquiry_evpd_serial(struct ctl_scsiio *ctsio, int alloc_len) 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. @@ -9526,15 +9516,6 @@ ctl_inquiry_evpd_serial(struct ctl_scsiio *ctsio, int alloc_len) 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->io_hdr.flags |= CTL_FLAG_ALLOCATED; @@ -9556,10 +9537,7 @@ ctl_inquiry_evpd_devid(struct ctl_scsiio *ctsio, int alloc_len) 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; @@ -9570,23 +9548,30 @@ ctl_inquiry_evpd_devid(struct ctl_scsiio *ctsio, int alloc_len) 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; @@ -9599,7 +9584,7 @@ ctl_inquiry_evpd_devid(struct ctl_scsiio *ctsio, int alloc_len) 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] + @@ -9617,7 +9602,7 @@ ctl_inquiry_evpd_devid(struct ctl_scsiio *ctsio, int alloc_len) devid_ptr->page_code = SVPD_DEVICE_ID; - scsi_ulto2b(devid_len - 4, devid_ptr->length); + scsi_ulto2b(data_len - 4, devid_ptr->length); /* * For Fibre channel, @@ -9643,7 +9628,7 @@ ctl_inquiry_evpd_devid(struct ctl_scsiio *ctsio, int alloc_len) * 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 { @@ -9700,7 +9685,6 @@ ctl_inquiry_evpd_devid(struct ctl_scsiio *ctsio, int alloc_len) 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. @@ -9710,19 +9694,13 @@ ctl_inquiry_evpd_devid(struct ctl_scsiio *ctsio, int alloc_len) * 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; diff --git a/sys/cam/ctl/ctl.h b/sys/cam/ctl/ctl.h index d6dde33..99fadc8 100644 --- a/sys/cam/ctl/ctl.h +++ b/sys/cam/ctl/ctl.h @@ -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. */ diff --git a/sys/cam/ctl/ctl_frontend_iscsi.c b/sys/cam/ctl/ctl_frontend_iscsi.c index 500abc4..6a76170 100644 --- a/sys/cam/ctl/ctl_frontend_iscsi.c +++ b/sys/cam/ctl/ctl_frontend_iscsi.c @@ -2059,7 +2059,7 @@ cfiscsi_devid(struct ctl_scsiio *ctsio, int alloc_len) 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; @@ -2077,8 +2077,11 @@ cfiscsi_devid(struct ctl_scsiio *ctsio, int alloc_len) 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' */ @@ -2086,9 +2089,9 @@ cfiscsi_devid(struct ctl_scsiio *ctsio, int alloc_len) 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 + @@ -2097,14 +2100,14 @@ cfiscsi_devid(struct ctl_scsiio *ctsio, int alloc_len) 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; @@ -2117,7 +2120,7 @@ cfiscsi_devid(struct ctl_scsiio *ctsio, int alloc_len) 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] + @@ -2135,7 +2138,7 @@ cfiscsi_devid(struct ctl_scsiio *ctsio, int alloc_len) 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 @@ -2143,7 +2146,7 @@ cfiscsi_devid(struct ctl_scsiio *ctsio, int alloc_len) */ 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 { @@ -2161,12 +2164,12 @@ cfiscsi_devid(struct ctl_scsiio *ctsio, int alloc_len) * 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); } /* |