diff mbox

[v6,05/20] block: Introduce byte-based aio read/write

Message ID 1462406126-22946-6-git-send-email-eblake@redhat.com
State New
Headers show

Commit Message

Eric Blake May 4, 2016, 11:55 p.m. UTC
blk_aio_readv() and blk_aio_writev() are annoying in that they
can't access sub-sector granularity, and cannot pass flags.
Also, they require the caller to pass redundant information
about the size of the I/O.

Add new blk_aio_preadv() and blk_aio_pwritev() functions to fix
the flaws. The next few patches will upgrade callers, then
finally delete the old interfaces.

Signed-off-by: Eric Blake <eblake@redhat.com>
---
 include/sysemu/block-backend.h |  6 ++++++
 block/block-backend.c          | 16 ++++++++++++++++
 2 files changed, 22 insertions(+)

Comments

Kevin Wolf May 6, 2016, 12:31 p.m. UTC | #1
Am 05.05.2016 um 01:55 hat Eric Blake geschrieben:
> blk_aio_readv() and blk_aio_writev() are annoying in that they
> can't access sub-sector granularity, and cannot pass flags.
> Also, they require the caller to pass redundant information
> about the size of the I/O.
> 
> Add new blk_aio_preadv() and blk_aio_pwritev() functions to fix
> the flaws. The next few patches will upgrade callers, then
> finally delete the old interfaces.
> 
> Signed-off-by: Eric Blake <eblake@redhat.com>
> ---
>  include/sysemu/block-backend.h |  6 ++++++
>  block/block-backend.c          | 16 ++++++++++++++++
>  2 files changed, 22 insertions(+)
> 
> diff --git a/include/sysemu/block-backend.h b/include/sysemu/block-backend.h
> index 851376b..8d7839c 100644
> --- a/include/sysemu/block-backend.h
> +++ b/include/sysemu/block-backend.h
> @@ -110,9 +110,15 @@ int64_t blk_nb_sectors(BlockBackend *blk);
>  BlockAIOCB *blk_aio_readv(BlockBackend *blk, int64_t sector_num,
>                            QEMUIOVector *iov, int nb_sectors,
>                            BlockCompletionFunc *cb, void *opaque);
> +BlockAIOCB *blk_aio_preadv(BlockBackend *blk, int64_t offset,
> +                           QEMUIOVector *iov, BdrvRequestFlags flags,

If you have to respin for some reason, I think QEMUIOVectors are
commonly called qiov, whereas iov is usually the name for struct iovec.

Kevin
Eric Blake May 6, 2016, 2:12 p.m. UTC | #2
On 05/06/2016 06:31 AM, Kevin Wolf wrote:
>> +++ b/include/sysemu/block-backend.h
>> @@ -110,9 +110,15 @@ int64_t blk_nb_sectors(BlockBackend *blk);
>>  BlockAIOCB *blk_aio_readv(BlockBackend *blk, int64_t sector_num,
>>                            QEMUIOVector *iov, int nb_sectors,
>>                            BlockCompletionFunc *cb, void *opaque);
>> +BlockAIOCB *blk_aio_preadv(BlockBackend *blk, int64_t offset,
>> +                           QEMUIOVector *iov, BdrvRequestFlags flags,
> 
> If you have to respin for some reason, I think QEMUIOVectors are
> commonly called qiov, whereas iov is usually the name for struct iovec.

Copy-and-paste, but also a trivial cleanup.
diff mbox

Patch

diff --git a/include/sysemu/block-backend.h b/include/sysemu/block-backend.h
index 851376b..8d7839c 100644
--- a/include/sysemu/block-backend.h
+++ b/include/sysemu/block-backend.h
@@ -110,9 +110,15 @@  int64_t blk_nb_sectors(BlockBackend *blk);
 BlockAIOCB *blk_aio_readv(BlockBackend *blk, int64_t sector_num,
                           QEMUIOVector *iov, int nb_sectors,
                           BlockCompletionFunc *cb, void *opaque);
+BlockAIOCB *blk_aio_preadv(BlockBackend *blk, int64_t offset,
+                           QEMUIOVector *iov, BdrvRequestFlags flags,
+                           BlockCompletionFunc *cb, void *opaque);
 BlockAIOCB *blk_aio_writev(BlockBackend *blk, int64_t sector_num,
                            QEMUIOVector *iov, int nb_sectors,
                            BlockCompletionFunc *cb, void *opaque);
+BlockAIOCB *blk_aio_pwritev(BlockBackend *blk, int64_t offset,
+                            QEMUIOVector *iov, BdrvRequestFlags flags,
+                            BlockCompletionFunc *cb, void *opaque);
 BlockAIOCB *blk_aio_flush(BlockBackend *blk,
                           BlockCompletionFunc *cb, void *opaque);
 BlockAIOCB *blk_aio_discard(BlockBackend *blk,
diff --git a/block/block-backend.c b/block/block-backend.c
index f8f88a6..104852d 100644
--- a/block/block-backend.c
+++ b/block/block-backend.c
@@ -998,6 +998,14 @@  BlockAIOCB *blk_aio_readv(BlockBackend *blk, int64_t sector_num,
                         blk_aio_read_entry, 0, cb, opaque);
 }

+BlockAIOCB *blk_aio_preadv(BlockBackend *blk, int64_t offset,
+                           QEMUIOVector *iov, BdrvRequestFlags flags,
+                           BlockCompletionFunc *cb, void *opaque)
+{
+    return blk_aio_prwv(blk, offset, iov->size, iov,
+                        blk_aio_read_entry, flags, cb, opaque);
+}
+
 BlockAIOCB *blk_aio_writev(BlockBackend *blk, int64_t sector_num,
                            QEMUIOVector *iov, int nb_sectors,
                            BlockCompletionFunc *cb, void *opaque)
@@ -1011,6 +1019,14 @@  BlockAIOCB *blk_aio_writev(BlockBackend *blk, int64_t sector_num,
                         blk_aio_write_entry, 0, cb, opaque);
 }

+BlockAIOCB *blk_aio_pwritev(BlockBackend *blk, int64_t offset,
+                            QEMUIOVector *iov, BdrvRequestFlags flags,
+                            BlockCompletionFunc *cb, void *opaque)
+{
+    return blk_aio_prwv(blk, offset, iov->size, iov,
+                        blk_aio_write_entry, flags, cb, opaque);
+}
+
 BlockAIOCB *blk_aio_flush(BlockBackend *blk,
                           BlockCompletionFunc *cb, void *opaque)
 {