scsi-block: always use scsi_generic_ops for cache != none

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Paolo Bonzini 2012-02-15 14:11:22 +01:00
parent d3d250bddb
commit eaccf49e95
1 changed files with 14 additions and 4 deletions

View File

@ -1754,6 +1754,15 @@ static SCSIRequest *scsi_block_new_request(SCSIDevice *d, uint32_t tag,
case WRITE_VERIFY_10: case WRITE_VERIFY_10:
case WRITE_VERIFY_12: case WRITE_VERIFY_12:
case WRITE_VERIFY_16: case WRITE_VERIFY_16:
/* If we are not using O_DIRECT, we might read stale data from the
* host cache if writes were made using other commands than these
* ones (such as WRITE SAME or EXTENDED COPY, etc.). So, without
* O_DIRECT everything must go through SG_IO.
*/
if (!(s->qdev.conf.bs->open_flags & BDRV_O_NOCACHE)) {
break;
}
/* MMC writing cannot be done via pread/pwrite, because it sometimes /* MMC writing cannot be done via pread/pwrite, because it sometimes
* involves writing beyond the maximum LBA or to negative LBA (lead-in). * involves writing beyond the maximum LBA or to negative LBA (lead-in).
* And once you do these writes, reading from the block device is * And once you do these writes, reading from the block device is
@ -1764,11 +1773,12 @@ static SCSIRequest *scsi_block_new_request(SCSIDevice *d, uint32_t tag,
* seen, but performance usually isn't paramount on optical media. So, * seen, but performance usually isn't paramount on optical media. So,
* just make scsi-block operate the same as scsi-generic for them. * just make scsi-block operate the same as scsi-generic for them.
*/ */
if (s->qdev.type != TYPE_ROM) { if (s->qdev.type == TYPE_ROM) {
break;
}
return scsi_req_alloc(&scsi_disk_reqops, &s->qdev, tag, lun, return scsi_req_alloc(&scsi_disk_reqops, &s->qdev, tag, lun,
hba_private); hba_private);
} }
}
return scsi_req_alloc(&scsi_generic_req_ops, &s->qdev, tag, lun, return scsi_req_alloc(&scsi_generic_req_ops, &s->qdev, tag, lun,
hba_private); hba_private);