Strip leading spaces off of a SCSI disk's serial number

sys/cam/scsi/scsi_xpt.c
	Strip leading spaces off of a SCSI disk's reported serial number
	when populating the CAM serial number. This affects the output of
	"diskinfo -v" and the names of /dev/diskid/DISK-* device nodes,
	among other things.

	SPC5r05 says that the Product Serial Number field from the Unit
	Serial Number VPD page is right-aligned. So any leading spaces are
	not part of the actual serial number. Most devices don't left-pad
	their serial numbers, but some do. In particular, the SN VPD page
	that an LSI HBA emulates for a SATA drive contains enough
	left-padding to fill a 20-byte field.

UPDATING
	Add a note to UPDATING, because some users may have to update
	/etc/fstab or geom labels.

Reviewed by:	ken, mav
MFC after:	Never
Sponsored by:	Spectra Logic Corp
Differential Revision:	https://reviews.freebsd.org/D6516
This commit is contained in:
Alan Somers 2016-05-27 22:26:43 +00:00
parent 3920312eeb
commit 583febf416
2 changed files with 25 additions and 6 deletions

View File

@ -31,6 +31,16 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 11.x IS SLOW:
disable the most expensive debugging functionality run
"ln -s 'abort:false,junk:false' /etc/malloc.conf".)
20160527:
CAM will now strip leading spaces from SCSI disks' serial numbers.
This will effect users who create UFS filesystems on SCSI disks using
those disk's diskid device nodes. For example, if /etc/fstab
previously contained a line like
"/dev/diskid/DISK-%20%20%20%20%20%20%20ABCDEFG0123456", you should
change it to "/dev/diskid/DISK-ABCDEFG0123456". Users of geom
transfers like gmirror may also be affected. ZFS users should
generally be fine.
20160523:
The bitstring(3) API has been updated with new functionality and
improved performance. But it is binary-incompatible with the old API.

View File

@ -1559,13 +1559,22 @@ probedone(struct cam_periph *periph, union ccb *done_ccb)
(u_int8_t *)malloc((serial_buf->length + 1),
M_CAMXPT, M_NOWAIT);
if (path->device->serial_num != NULL) {
int start, slen;
start = strspn(serial_buf->serial_num, " ");
slen = serial_buf->length - start;
if (slen <= 0) {
/*
* SPC5r05 says that an all-space serial
* number means no product serial number
* is available
*/
slen = 0;
}
memcpy(path->device->serial_num,
serial_buf->serial_num,
serial_buf->length);
path->device->serial_num_len =
serial_buf->length;
path->device->serial_num[serial_buf->length]
= '\0';
&serial_buf->serial_num[start], slen);
path->device->serial_num_len = slen;
path->device->serial_num[slen] = '\0';
}
} else if (cam_periph_error(done_ccb, 0,
SF_RETRY_UA|SF_NO_PRINT,