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;