This series adds a new scsi-block device that is able to do SCSI passthrough for block devices only, but at the same time does not suffer the limitations of scsi-generic. In particular it does not need a bounce buffer that is as big as the request, and will be able to support s/g lists. This puts scsi-block and virtio-blk on feature parity.
To do this, scsi-generic is simplified to the point that its ReqOps can be used by any SCSIDevice. Then, a new scsi-disk variant is introduced that uses regular AIO read/writes whenever possible, and falls back to SG_IO for other SCSI commands. Management can then choose between isolating the guest from the specificities of the target device (scsi-hd/scsi-cd), or making it aware of them (scsi-block). In the future, both scsi-generic and scsi-block could be made to support other types of passthrough, for example iSCSI passthrough. Patches 1-4 are cleanups to scsi-generic, patches 5-6 are cleanups to scsi-disk. Then comes the actual implementation of the feature. Paolo Bonzini (10): scsi-generic: drop SCSIGenericState scsi-generic: remove scsi_req_fixup scsi-generic: check ioctl statuses when SG_IO succeeds scsi-generic: look at host status scsi-disk: do not duplicate BlockDriverState member scsi-disk: small clean up to INQUIRY scsi: make reqops const scsi: export scsi_generic_reqops scsi: pass cdb to alloc_req scsi-disk: add scsi-block for device passthrough hw/scsi-bus.c | 12 ++-- hw/scsi-disk.c | 260 +++++++++++++++++++++++++++++++++++++--------------- hw/scsi-generic.c | 128 ++++++++++++--------------- hw/scsi.h | 12 ++- 4 files changed, 255 insertions(+), 157 deletions(-) -- 1.7.6