Index: umass.c =================================================================== --- umass.c (revision 196776) +++ umass.c (working copy) @@ -124,6 +124,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include "usbdevs.h" #include @@ -2978,6 +2979,25 @@ umass_cam_action(struct cam_sim *sim, union ccb *c if (sc->sc_transfer.cmd_data[0] == INQUIRY) { /* + * Umass devices don't generally report their serial numbers + * in the usual SCSI way. Emulate it here. + */ + if (sc->sc_transfer.cmd_data[1] & SI_EVPD && + sc->sc_transfer.cmd_data[2] == 0x80) { + struct scsi_vpd_unit_serial_number *vpd_serial; + + vpd_serial = (struct scsi_vpd_unit_serial_number *)ccb->csio.data_ptr; + vpd_serial->length = strlen(sc->sc_udev->serial); + if (vpd_serial->length > sizeof(vpd_serial->serial_num)) + vpd_serial->length = sizeof(vpd_serial->serial_num); + memcpy(vpd_serial->serial_num, sc->sc_udev->serial, vpd_serial->length); + ccb->csio.scsi_status = SCSI_STATUS_OK; + ccb->ccb_h.status = CAM_REQ_CMP; + xpt_done(ccb); + goto done; + } + + /* * Handle EVPD inquiry for broken devices first * NO_INQUIRY also implies NO_INQUIRY_EVPD */