MFC 303737

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>
    Sponsored by:   Microsoft
    Differential Revision:  https://reviews.freebsd.org/D7405
This commit is contained in:
Sepherosa Ziehau 2016-08-08 06:33:59 +00:00
parent a3ca655be2
commit 96c62bcea9
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/stable/10/; revision=303827

View File

@ -2062,8 +2062,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;
@ -2092,6 +2092,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);