Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 19 Jun 2014 09:46:43 +0000 (UTC)
From:      Alexander Motin <mav@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r267639 - head/sys/cam/ctl
Message-ID:  <201406190946.s5J9khBe031610@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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);
 	}
 
 	/*



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201406190946.s5J9khBe031610>