Message ID | 1462406126-22946-6-git-send-email-eblake@redhat.com |
---|---|
State | New |
Headers | show |
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
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 --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) {
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(+)