aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoraliguori <aliguori@c046a42c-6fe2-441c-8c8c-71466251a162>2009-03-12 19:57:12 +0000
committeraliguori <aliguori@c046a42c-6fe2-441c-8c8c-71466251a162>2009-03-12 19:57:12 +0000
commit04eeb8b6d68ed314746856c813ce6fa8bc1a95df (patch)
tree46b648594c2e0c1db08685d4396e373b8d53cc87
parent7d78066926b68afe28a1948c64618ee085d9ab02 (diff)
Add internal scsi generic block API (Avi Kivity)
Add an internal API for the generic block layer to send scsi generic commands to block format driver. This means block format drivers no longer need to consider overloaded nb_sectors parameters. 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@6823 c046a42c-6fe2-441c-8c8c-71466251a162
-rw-r--r--block-raw-posix.c30
-rw-r--r--block.c8
-rw-r--r--block_int.h10
3 files changed, 44 insertions, 4 deletions
diff --git a/block-raw-posix.c b/block-raw-posix.c
index 8b28a43c50..a2ac48a068 100644
--- a/block-raw-posix.c
+++ b/block-raw-posix.c
@@ -1179,6 +1179,32 @@ static int raw_ioctl(BlockDriverState *bs, unsigned long int req, void *buf)
}
#endif /* !linux */
+static int raw_sg_send_command(BlockDriverState *bs, void *buf, int count)
+{
+ return raw_pwrite(bs, -1, buf, count);
+}
+
+static int raw_sg_recv_response(BlockDriverState *bs, void *buf, int count)
+{
+ return raw_pread(bs, -1, buf, count);
+}
+
+static BlockDriverAIOCB *raw_sg_aio_read(BlockDriverState *bs,
+ void *buf, int count,
+ BlockDriverCompletionFunc *cb,
+ void *opaque)
+{
+ return raw_aio_read(bs, 0, buf, -(int64_t)count, cb, opaque);
+}
+
+static BlockDriverAIOCB *raw_sg_aio_write(BlockDriverState *bs,
+ void *buf, int count,
+ BlockDriverCompletionFunc *cb,
+ void *opaque)
+{
+ return raw_aio_write(bs, 0, buf, -(int64_t)count, cb, opaque);
+}
+
BlockDriver bdrv_host_device = {
.format_name = "host_device",
.instance_size = sizeof(BDRVRawState),
@@ -1204,4 +1230,8 @@ BlockDriver bdrv_host_device = {
.bdrv_set_locked = raw_set_locked,
/* generic scsi device */
.bdrv_ioctl = raw_ioctl,
+ .bdrv_sg_send_command = raw_sg_send_command,
+ .bdrv_sg_recv_response = raw_sg_recv_response,
+ .bdrv_sg_aio_read = raw_sg_aio_read,
+ .bdrv_sg_aio_write = raw_sg_aio_write,
};
diff --git a/block.c b/block.c
index 39b27b2702..e2a75b0f88 100644
--- a/block.c
+++ b/block.c
@@ -1678,22 +1678,22 @@ int bdrv_ioctl(BlockDriverState *bs, unsigned long int req, void *buf)
int bdrv_sg_send_command(BlockDriverState *bs, void *buf, int count)
{
- return bdrv_pwrite(bs, -1, buf, count);
+ return bs->drv->bdrv_sg_send_command(bs, buf, count);
}
int bdrv_sg_recv_response(BlockDriverState *bs, void *buf, int count)
{
- return bdrv_pread(bs, -1, buf, count);
+ return bs->drv->bdrv_sg_recv_response(bs, 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);
+ return bs->drv->bdrv_sg_aio_read(bs, buf, 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);
+ return bs->drv->bdrv_sg_aio_write(bs, buf, count, cb, opaque);
}
diff --git a/block_int.h b/block_int.h
index 44eb280684..e274293a19 100644
--- a/block_int.h
+++ b/block_int.h
@@ -84,6 +84,16 @@ struct BlockDriver {
/* to control generic scsi devices */
int (*bdrv_ioctl)(BlockDriverState *bs, unsigned long int req, void *buf);
+ int (*bdrv_sg_send_command)(BlockDriverState *bs, void *buf, int count);
+ int (*bdrv_sg_recv_response)(BlockDriverState *bs, void *buf, int count);
+ BlockDriverAIOCB *(*bdrv_sg_aio_read)(BlockDriverState *bs,
+ void *buf, int count,
+ BlockDriverCompletionFunc *cb,
+ void *opaque);
+ BlockDriverAIOCB *(*bdrv_sg_aio_write)(BlockDriverState *bs,
+ void *buf, int count,
+ BlockDriverCompletionFunc *cb,
+ void *opaque);
BlockDriverAIOCB *free_aiocb;
struct BlockDriver *next;