[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 12/69] block: Introduce .bdrv_co_preadv/pwritev Block
From: |
Kevin Wolf |
Subject: |
[Qemu-devel] [PULL 12/69] block: Introduce .bdrv_co_preadv/pwritev BlockDriver function |
Date: |
Thu, 12 May 2016 16:34:52 +0200 |
Many parts of the block layer are already byte granularity. The block
driver interface, however, was still missing an interface that allows
making use of this. This patch introduces a new BlockDriver interface,
which is based on coroutines, vectored, has flags and uses a byte
granularity. This is now the preferred interface for new drivers.
Signed-off-by: Kevin Wolf <address@hidden>
Reviewed-by: Eric Blake <address@hidden>
Reviewed-by: Fam Zheng <address@hidden>
---
block/io.c | 28 ++++++++++++++++++++++------
include/block/block_int.h | 4 ++++
2 files changed, 26 insertions(+), 6 deletions(-)
diff --git a/block/io.c b/block/io.c
index feddb71..70caadd 100644
--- a/block/io.c
+++ b/block/io.c
@@ -803,8 +803,15 @@ static int coroutine_fn
bdrv_driver_preadv(BlockDriverState *bs,
QEMUIOVector *qiov, int flags)
{
BlockDriver *drv = bs->drv;
- int64_t sector_num = offset >> BDRV_SECTOR_BITS;
- unsigned int nb_sectors = bytes >> BDRV_SECTOR_BITS;
+ int64_t sector_num;
+ unsigned int nb_sectors;
+
+ if (drv->bdrv_co_preadv) {
+ return drv->bdrv_co_preadv(bs, offset, bytes, qiov, flags);
+ }
+
+ sector_num = offset >> BDRV_SECTOR_BITS;
+ nb_sectors = bytes >> BDRV_SECTOR_BITS;
assert((offset & (BDRV_SECTOR_SIZE - 1)) == 0);
assert((bytes & (BDRV_SECTOR_SIZE - 1)) == 0);
@@ -834,10 +841,18 @@ static int coroutine_fn
bdrv_driver_pwritev(BlockDriverState *bs,
QEMUIOVector *qiov, int flags)
{
BlockDriver *drv = bs->drv;
- int64_t sector_num = offset >> BDRV_SECTOR_BITS;
- unsigned int nb_sectors = bytes >> BDRV_SECTOR_BITS;
+ int64_t sector_num;
+ unsigned int nb_sectors;
int ret;
+ if (drv->bdrv_co_pwritev) {
+ ret = drv->bdrv_co_pwritev(bs, offset, bytes, qiov, flags);
+ goto emulate_flags;
+ }
+
+ sector_num = offset >> BDRV_SECTOR_BITS;
+ nb_sectors = bytes >> BDRV_SECTOR_BITS;
+
assert((offset & (BDRV_SECTOR_SIZE - 1)) == 0);
assert((bytes & (BDRV_SECTOR_SIZE - 1)) == 0);
assert((bytes >> BDRV_SECTOR_BITS) <= BDRV_REQUEST_MAX_SECTORS);
@@ -857,13 +872,14 @@ static int coroutine_fn
bdrv_driver_pwritev(BlockDriverState *bs,
acb = bs->drv->bdrv_aio_writev(bs, sector_num, qiov, nb_sectors,
bdrv_co_io_em_complete, &co);
if (acb == NULL) {
- return -EIO;
+ ret = -EIO;
} else {
qemu_coroutine_yield();
- return co.ret;
+ ret = co.ret;
}
}
+emulate_flags:
if (ret == 0 && (flags & BDRV_REQ_FUA) &&
!(drv->supported_write_flags & BDRV_REQ_FUA))
{
diff --git a/include/block/block_int.h b/include/block/block_int.h
index 804bc1d..565f795 100644
--- a/include/block/block_int.h
+++ b/include/block/block_int.h
@@ -153,10 +153,14 @@ struct BlockDriver {
int coroutine_fn (*bdrv_co_readv)(BlockDriverState *bs,
int64_t sector_num, int nb_sectors, QEMUIOVector *qiov);
+ int coroutine_fn (*bdrv_co_preadv)(BlockDriverState *bs,
+ uint64_t offset, uint64_t bytes, QEMUIOVector *qiov, int flags);
int coroutine_fn (*bdrv_co_writev)(BlockDriverState *bs,
int64_t sector_num, int nb_sectors, QEMUIOVector *qiov);
int coroutine_fn (*bdrv_co_writev_flags)(BlockDriverState *bs,
int64_t sector_num, int nb_sectors, QEMUIOVector *qiov, int flags);
+ int coroutine_fn (*bdrv_co_pwritev)(BlockDriverState *bs,
+ uint64_t offset, uint64_t bytes, QEMUIOVector *qiov, int flags);
int supported_write_flags;
--
1.8.3.1
- [Qemu-devel] [PULL 00/69] Block layer patches, Kevin Wolf, 2016/05/12
- [Qemu-devel] [PULL 04/69] block: extract bdrv_drain_poll/bdrv_co_yield_to_drain from bdrv_drain/bdrv_co_drain, Kevin Wolf, 2016/05/12
- [Qemu-devel] [PULL 03/69] block: move restarting of throttled reqs to block/throttle-groups.c, Kevin Wolf, 2016/05/12
- [Qemu-devel] [PULL 09/69] block: Introduce bdrv_driver_pwritev(), Kevin Wolf, 2016/05/12
- [Qemu-devel] [PULL 07/69] linux-aio: make it more type safe, Kevin Wolf, 2016/05/12
- [Qemu-devel] [PULL 05/69] block: introduce bdrv_no_throttling_begin/end, Kevin Wolf, 2016/05/12
- [Qemu-devel] [PULL 01/69] block: Don't disable I/O throttling on sync requests, Kevin Wolf, 2016/05/12
- [Qemu-devel] [PULL 02/69] block: make bdrv_start_throttled_reqs return void, Kevin Wolf, 2016/05/12
- [Qemu-devel] [PULL 16/69] vdi: Implement .bdrv_co_preadv() interface, Kevin Wolf, 2016/05/12
- [Qemu-devel] [PULL 12/69] block: Introduce .bdrv_co_preadv/pwritev BlockDriver function,
Kevin Wolf <=
- [Qemu-devel] [PULL 06/69] block: plug whole tree at once, introduce bdrv_io_unplugged_begin/end, Kevin Wolf, 2016/05/12
- [Qemu-devel] [PULL 10/69] block: Support AIO drivers in bdrv_driver_preadv/pwritev(), Kevin Wolf, 2016/05/12
- [Qemu-devel] [PULL 11/69] block: Rename bdrv_co_do_preadv/writev to bdrv_co_preadv/writev, Kevin Wolf, 2016/05/12
- [Qemu-devel] [PULL 17/69] vdi: Implement .bdrv_co_pwritev() interface, Kevin Wolf, 2016/05/12
- [Qemu-devel] [PULL 20/69] vmdk: Implement .bdrv_co_pwritev() interface, Kevin Wolf, 2016/05/12
- [Qemu-devel] [PULL 13/69] bochs: Implement .bdrv_co_preadv() interface, Kevin Wolf, 2016/05/12
- [Qemu-devel] [PULL 08/69] block: Introduce bdrv_driver_preadv(), Kevin Wolf, 2016/05/12
- [Qemu-devel] [PULL 15/69] dmg: Implement .bdrv_co_preadv() interface, Kevin Wolf, 2016/05/12
- [Qemu-devel] [PULL 24/69] block: Remove BlockDriver.bdrv_read/write, Kevin Wolf, 2016/05/12
- [Qemu-devel] [PULL 21/69] vpc: Implement .bdrv_co_preadv() interface, Kevin Wolf, 2016/05/12