summaryrefslogtreecommitdiff
path: root/block.c
diff options
context:
space:
mode:
authoraliguori <aliguori@c046a42c-6fe2-441c-8c8c-71466251a162>2009-03-12 19:57:08 +0000
committeraliguori <aliguori@c046a42c-6fe2-441c-8c8c-71466251a162>2009-03-12 19:57:08 +0000
commit3ae1852b9102f1dc3fa58037c8fbad819547afe5 (patch)
tree8a29ece82d1a77db49c8679502641eb2f6b9079c /block.c
parent57b47182c4217836e2542f052b8bfd5d820d82ec (diff)
downloadqemu-3ae1852b9102f1dc3fa58037c8fbad819547afe5.tar.gz
qemu-3ae1852b9102f1dc3fa58037c8fbad819547afe5.tar.bz2
qemu-3ae1852b9102f1dc3fa58037c8fbad819547afe5.zip
Add specialized block driver scsi generic API (Avi Kivity)
When a scsi device is backed by a scsi generic device instead of an ordinary host block device, the block API is abused in a couple of annoying ways: - nb_sectors is negative, and specifies a byte count instead of a sector count - offset is ignored, since scsi-generic is essentially a packet protocol This overloading makes hacking the block layer difficult. Remove it by introducing a new explicit API for scsi-generic devices. The new API is still backed by the old implementation, but at least the users are insulated. Signed-off-by: Avi Kivity <avi@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6822 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'block.c')
-rw-r--r--block.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/block.c b/block.c
index 1ef4ae5f3e..39b27b2702 100644
--- a/block.c
+++ b/block.c
@@ -1675,3 +1675,25 @@ int bdrv_ioctl(BlockDriverState *bs, unsigned long int req, void *buf)
return drv->bdrv_ioctl(bs, req, buf);
return -ENOTSUP;
}
+
+int bdrv_sg_send_command(BlockDriverState *bs, void *buf, int count)
+{
+ return bdrv_pwrite(bs, -1, buf, count);
+}
+
+int bdrv_sg_recv_response(BlockDriverState *bs, void *buf, int count)
+{
+ return bdrv_pread(bs, -1, buf, count);
+}
+
+BlockDriverAIOCB *bdrv_sg_aio_read(BlockDriverState *bs, void *buf, int count,
+ BlockDriverCompletionFunc *cb, void *opaque)
+{
+ return bdrv_aio_read(bs, 0, buf, -(int64_t)count, cb, opaque);
+}
+
+BlockDriverAIOCB *bdrv_sg_aio_write(BlockDriverState *bs, void *buf, int count,
+ BlockDriverCompletionFunc *cb, void *opaque)
+{
+ return bdrv_aio_write(bs, 0, buf, -(int64_t)count, cb, opaque);
+}