hyperv/storvsc: Claim SPC-3 conformance, thus enable UNMAP support

The Hyper-V on pre-win10 systems will only report SPC-2 conformance,
but it actually conforms to SPC-3.  The INQUIRY response is adjusted
to propagate the SPC-3 version information to CAM.

Submitted by:	Hongjiang Zhang <honzhan microsoft com>
MFC after:	3 days
Sponsored by:	Microsoft
Differential Revision:	https://reviews.freebsd.org/D7405
This commit is contained in:
sephe 2016-08-04 05:05:35 +00:00
parent d1a4bf3e24
commit 4b9098483e

View File

@ -2124,8 +2124,8 @@ storvsc_io_done(struct hv_storvsc_request *reqp)
* For more information about INQUIRY, please refer to:
* ftp://ftp.avc-pioneer.com/Mtfuji_7/Proposal/Jun09/INQUIRY.pdf
*/
const struct scsi_inquiry_data *inq_data =
(const struct scsi_inquiry_data *)csio->data_ptr;
struct scsi_inquiry_data *inq_data =
(struct scsi_inquiry_data *)csio->data_ptr;
uint8_t* resp_buf = (uint8_t*)csio->data_ptr;
/* Get the buffer length reported by host */
int resp_xfer_len = vm_srb->transfer_len;
@ -2154,6 +2154,25 @@ storvsc_io_done(struct hv_storvsc_request *reqp)
mtx_unlock(&sc->hs_lock);
}
} else {
char vendor[16];
cam_strvis(vendor, inq_data->vendor, sizeof(inq_data->vendor),
sizeof(vendor));
/**
* XXX: upgrade SPC2 to SPC3 if host is WIN8 or WIN2012 R2
* in order to support UNMAP feature
*/
if (!strncmp(vendor,"Msft",4) &&
SID_ANSI_REV(inq_data) == SCSI_REV_SPC2 &&
(vmstor_proto_version == VMSTOR_PROTOCOL_VERSION_WIN8_1 ||
vmstor_proto_version== VMSTOR_PROTOCOL_VERSION_WIN8)) {
inq_data->version = SCSI_REV_SPC3;
if (bootverbose) {
mtx_lock(&sc->hs_lock);
xpt_print(ccb->ccb_h.path,
"storvsc upgrades SPC2 to SPC3\n");
mtx_unlock(&sc->hs_lock);
}
}
ccb->ccb_h.status |= CAM_REQ_CMP;
if (bootverbose) {
mtx_lock(&sc->hs_lock);