[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-block] [PATCH 05/17] block: Introduce .bdrv_co_preadv/pwritev Bloc
From: |
Kevin Wolf |
Subject: |
[Qemu-block] [PATCH 05/17] block: Introduce .bdrv_co_preadv/pwritev BlockDriver function |
Date: |
Wed, 27 Apr 2016 11:52:35 +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>
---
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 11ff421..4aac4ab 100644
--- a/block/io.c
+++ b/block/io.c
@@ -806,8 +806,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);
@@ -837,10 +844,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);
@@ -860,13 +875,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 f0171e3..0ef6f2c 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
- Re: [Qemu-block] [Qemu-devel] [PATCH 02/17] block: Introduce bdrv_driver_pwritev(), (continued)
- [Qemu-block] [PATCH 03/17] block: Support AIO drivers in bdrv_driver_preadv/pwritev(), Kevin Wolf, 2016/04/27
- [Qemu-block] [PATCH 04/17] block: Rename bdrv_co_do_preadv/writev to bdrv_co_preadv/writev, Kevin Wolf, 2016/04/27
- [Qemu-block] [PATCH 08/17] dmg: Implement .bdrv_co_preadv() interface, Kevin Wolf, 2016/04/27
- [Qemu-block] [PATCH 07/17] cloop: Implement .bdrv_co_preadv() interface, Kevin Wolf, 2016/04/27
- [Qemu-block] [PATCH 09/17] vdi: Implement .bdrv_co_preadv() interface, Kevin Wolf, 2016/04/27
- [Qemu-block] [PATCH 05/17] block: Introduce .bdrv_co_preadv/pwritev BlockDriver function,
Kevin Wolf <=
- [Qemu-block] [PATCH 06/17] bochs: Implement .bdrv_co_preadv() interface, Kevin Wolf, 2016/04/27
- [Qemu-block] [PATCH 15/17] vpc: Implement .bdrv_co_pwritev() interface, Kevin Wolf, 2016/04/27
- [Qemu-block] [PATCH 16/17] vvfat: Implement .bdrv_co_preadv/pwritev interfaces, Kevin Wolf, 2016/04/27
- [Qemu-block] [PATCH 17/17] block: Remove BlockDriver.bdrv_read/write, Kevin Wolf, 2016/04/27