From: Paolo Bonzini <pbonzini@redhat.com>
To: qemu-devel <qemu-devel@nongnu.org>
Cc: Kevin Wolf <kwolf@redhat.com>,
Stefan Hajnoczi <stefanha@linux.vnet.ibm.com>
Subject: Re: [Qemu-devel] [PATCH] block: emulate .bdrv_flush() using .bdrv_aio_flush()
Date: Mon, 12 Sep 2011 13:35:18 +0200 [thread overview]
Message-ID: <4E6DEE76.3020502@redhat.com> (raw)
In-Reply-To: <1315818870-31575-1-git-send-email-stefanha@linux.vnet.ibm.com>
On 09/12/2011 11:14 AM, Stefan Hajnoczi wrote:
> Block drivers typically have two copies of the flush operation: a
> synchronous .bdrv_flush() and an asynchronous .bdrv_aio_flush(). This
> patch applies the same emulation that we already do for
> .bdrv_read()/.bdrv_write() to .bdrv_flush(). Now block drivers only
> need to provide either .bdrv_aio_flush() or, in the case of legacy
> drivers, .bdrv_flush().
>
> Signed-off-by: Stefan Hajnoczi<stefanha@linux.vnet.ibm.com>
> ---
> block.c | 31 +++++++++++++++++++++++++++----
> block/blkdebug.c | 6 ------
> block/blkverify.c | 9 ---------
> block/qcow.c | 6 ------
> block/qcow2.c | 19 -------------------
> block/qed.c | 6 ------
> block/raw-posix.c | 11 -----------
> 7 files changed, 27 insertions(+), 61 deletions(-)
>
> diff --git a/block.c b/block.c
> index a8c789a..4992d98 100644
> --- a/block.c
> +++ b/block.c
> @@ -59,6 +59,7 @@ static int bdrv_read_em(BlockDriverState *bs, int64_t sector_num,
> uint8_t *buf, int nb_sectors);
> static int bdrv_write_em(BlockDriverState *bs, int64_t sector_num,
> const uint8_t *buf, int nb_sectors);
> +static int bdrv_flush_em(BlockDriverState *bs);
> static BlockDriverAIOCB *bdrv_co_aio_readv_em(BlockDriverState *bs,
> int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
> BlockDriverCompletionFunc *cb, void *opaque);
> @@ -205,8 +206,11 @@ void bdrv_register(BlockDriver *bdrv)
> }
> }
>
> - if (!bdrv->bdrv_aio_flush)
> + if (!bdrv->bdrv_aio_flush) {
> bdrv->bdrv_aio_flush = bdrv_aio_flush_em;
> + } else if (!bdrv->bdrv_flush) {
> + bdrv->bdrv_flush = bdrv_flush_em;
> + }
>
> QLIST_INSERT_HEAD(&bdrv_drivers, bdrv, list);
> }
> @@ -2848,7 +2852,7 @@ static BlockDriverAIOCB *bdrv_aio_noop_em(BlockDriverState *bs,
> /**************************************************************/
> /* sync block device emulation */
>
> -static void bdrv_rw_em_cb(void *opaque, int ret)
> +static void bdrv_em_cb(void *opaque, int ret)
> {
> *(int *)opaque = ret;
> }
> @@ -2868,7 +2872,7 @@ static int bdrv_read_em(BlockDriverState *bs, int64_t sector_num,
> iov.iov_len = nb_sectors * BDRV_SECTOR_SIZE;
> qemu_iovec_init_external(&qiov,&iov, 1);
> acb = bdrv_aio_readv(bs, sector_num,&qiov, nb_sectors,
> - bdrv_rw_em_cb,&async_ret);
> + bdrv_em_cb,&async_ret);
> if (acb == NULL) {
> async_ret = -1;
> goto fail;
> @@ -2896,7 +2900,26 @@ static int bdrv_write_em(BlockDriverState *bs, int64_t sector_num,
> iov.iov_len = nb_sectors * BDRV_SECTOR_SIZE;
> qemu_iovec_init_external(&qiov,&iov, 1);
> acb = bdrv_aio_writev(bs, sector_num,&qiov, nb_sectors,
> - bdrv_rw_em_cb,&async_ret);
> + bdrv_em_cb,&async_ret);
> + if (acb == NULL) {
> + async_ret = -1;
> + goto fail;
> + }
> + while (async_ret == NOT_DONE) {
> + qemu_aio_wait();
> + }
> +
> +fail:
> + return async_ret;
> +}
> +
> +static int bdrv_flush_em(BlockDriverState *bs)
> +{
> + int async_ret;
> + BlockDriverAIOCB *acb;
> +
> + async_ret = NOT_DONE;
> + acb = bdrv_aio_flush(bs, bdrv_em_cb,&async_ret);
> if (acb == NULL) {
> async_ret = -1;
> goto fail;
> diff --git a/block/blkdebug.c b/block/blkdebug.c
> index b3c5d42..9b88535 100644
> --- a/block/blkdebug.c
> +++ b/block/blkdebug.c
> @@ -397,11 +397,6 @@ static void blkdebug_close(BlockDriverState *bs)
> }
> }
>
> -static int blkdebug_flush(BlockDriverState *bs)
> -{
> - return bdrv_flush(bs->file);
> -}
> -
> static BlockDriverAIOCB *blkdebug_aio_flush(BlockDriverState *bs,
> BlockDriverCompletionFunc *cb, void *opaque)
> {
> @@ -454,7 +449,6 @@ static BlockDriver bdrv_blkdebug = {
>
> .bdrv_file_open = blkdebug_open,
> .bdrv_close = blkdebug_close,
> - .bdrv_flush = blkdebug_flush,
>
> .bdrv_aio_readv = blkdebug_aio_readv,
> .bdrv_aio_writev = blkdebug_aio_writev,
> diff --git a/block/blkverify.c b/block/blkverify.c
> index c7522b4..483f3b3 100644
> --- a/block/blkverify.c
> +++ b/block/blkverify.c
> @@ -116,14 +116,6 @@ static void blkverify_close(BlockDriverState *bs)
> s->test_file = NULL;
> }
>
> -static int blkverify_flush(BlockDriverState *bs)
> -{
> - BDRVBlkverifyState *s = bs->opaque;
> -
> - /* Only flush test file, the raw file is not important */
> - return bdrv_flush(s->test_file);
> -}
> -
> static int64_t blkverify_getlength(BlockDriverState *bs)
> {
> BDRVBlkverifyState *s = bs->opaque;
> @@ -368,7 +360,6 @@ static BlockDriver bdrv_blkverify = {
>
> .bdrv_file_open = blkverify_open,
> .bdrv_close = blkverify_close,
> - .bdrv_flush = blkverify_flush,
>
> .bdrv_aio_readv = blkverify_aio_readv,
> .bdrv_aio_writev = blkverify_aio_writev,
> diff --git a/block/qcow.c b/block/qcow.c
> index c8bfecc..9b71116 100644
> --- a/block/qcow.c
> +++ b/block/qcow.c
> @@ -781,11 +781,6 @@ static int qcow_write_compressed(BlockDriverState *bs, int64_t sector_num,
> return 0;
> }
>
> -static int qcow_flush(BlockDriverState *bs)
> -{
> - return bdrv_flush(bs->file);
> -}
> -
> static BlockDriverAIOCB *qcow_aio_flush(BlockDriverState *bs,
> BlockDriverCompletionFunc *cb, void *opaque)
> {
> @@ -826,7 +821,6 @@ static BlockDriver bdrv_qcow = {
> .bdrv_open = qcow_open,
> .bdrv_close = qcow_close,
> .bdrv_create = qcow_create,
> - .bdrv_flush = qcow_flush,
> .bdrv_is_allocated = qcow_is_allocated,
> .bdrv_set_key = qcow_set_key,
> .bdrv_make_empty = qcow_make_empty,
> diff --git a/block/qcow2.c b/block/qcow2.c
> index 8aed310..2b4ea0d 100644
> --- a/block/qcow2.c
> +++ b/block/qcow2.c
> @@ -1092,24 +1092,6 @@ static int qcow2_write_compressed(BlockDriverState *bs, int64_t sector_num,
> return 0;
> }
>
> -static int qcow2_flush(BlockDriverState *bs)
> -{
> - BDRVQcowState *s = bs->opaque;
> - int ret;
> -
> - ret = qcow2_cache_flush(bs, s->l2_table_cache);
> - if (ret< 0) {
> - return ret;
> - }
> -
> - ret = qcow2_cache_flush(bs, s->refcount_block_cache);
> - if (ret< 0) {
> - return ret;
> - }
> -
> - return bdrv_flush(bs->file);
> -}
> -
> static BlockDriverAIOCB *qcow2_aio_flush(BlockDriverState *bs,
> BlockDriverCompletionFunc *cb,
> void *opaque)
> @@ -1242,7 +1224,6 @@ static BlockDriver bdrv_qcow2 = {
> .bdrv_open = qcow2_open,
> .bdrv_close = qcow2_close,
> .bdrv_create = qcow2_create,
> - .bdrv_flush = qcow2_flush,
> .bdrv_is_allocated = qcow2_is_allocated,
> .bdrv_set_key = qcow2_set_key,
> .bdrv_make_empty = qcow2_make_empty,
> diff --git a/block/qed.c b/block/qed.c
> index 624e261..5cf4e08 100644
> --- a/block/qed.c
> +++ b/block/qed.c
> @@ -533,11 +533,6 @@ static void bdrv_qed_close(BlockDriverState *bs)
> qemu_vfree(s->l1_table);
> }
>
> -static int bdrv_qed_flush(BlockDriverState *bs)
> -{
> - return bdrv_flush(bs->file);
> -}
> -
> static int qed_create(const char *filename, uint32_t cluster_size,
> uint64_t image_size, uint32_t table_size,
> const char *backing_file, const char *backing_fmt)
> @@ -1479,7 +1474,6 @@ static BlockDriver bdrv_qed = {
> .bdrv_open = bdrv_qed_open,
> .bdrv_close = bdrv_qed_close,
> .bdrv_create = bdrv_qed_create,
> - .bdrv_flush = bdrv_qed_flush,
> .bdrv_is_allocated = bdrv_qed_is_allocated,
> .bdrv_make_empty = bdrv_qed_make_empty,
> .bdrv_aio_readv = bdrv_qed_aio_readv,
> diff --git a/block/raw-posix.c b/block/raw-posix.c
> index bcf50b2..f5a011a 100644
> --- a/block/raw-posix.c
> +++ b/block/raw-posix.c
> @@ -836,12 +836,6 @@ static int raw_create(const char *filename, QEMUOptionParameter *options)
> return result;
> }
>
> -static int raw_flush(BlockDriverState *bs)
> -{
> - BDRVRawState *s = bs->opaque;
> - return qemu_fdatasync(s->fd);
> -}
> -
> #ifdef CONFIG_XFS
> static int xfs_discard(BDRVRawState *s, int64_t sector_num, int nb_sectors)
> {
> @@ -893,7 +887,6 @@ static BlockDriver bdrv_file = {
> .bdrv_write = raw_write,
> .bdrv_close = raw_close,
> .bdrv_create = raw_create,
> - .bdrv_flush = raw_flush,
> .bdrv_discard = raw_discard,
>
> .bdrv_aio_readv = raw_aio_readv,
> @@ -1163,7 +1156,6 @@ static BlockDriver bdrv_host_device = {
> .bdrv_create = hdev_create,
> .create_options = raw_create_options,
> .bdrv_has_zero_init = hdev_has_zero_init,
> - .bdrv_flush = raw_flush,
>
> .bdrv_aio_readv = raw_aio_readv,
> .bdrv_aio_writev = raw_aio_writev,
> @@ -1284,7 +1276,6 @@ static BlockDriver bdrv_host_floppy = {
> .bdrv_create = hdev_create,
> .create_options = raw_create_options,
> .bdrv_has_zero_init = hdev_has_zero_init,
> - .bdrv_flush = raw_flush,
>
> .bdrv_aio_readv = raw_aio_readv,
> .bdrv_aio_writev = raw_aio_writev,
> @@ -1385,7 +1376,6 @@ static BlockDriver bdrv_host_cdrom = {
> .bdrv_create = hdev_create,
> .create_options = raw_create_options,
> .bdrv_has_zero_init = hdev_has_zero_init,
> - .bdrv_flush = raw_flush,
>
> .bdrv_aio_readv = raw_aio_readv,
> .bdrv_aio_writev = raw_aio_writev,
> @@ -1506,7 +1496,6 @@ static BlockDriver bdrv_host_cdrom = {
> .bdrv_create = hdev_create,
> .create_options = raw_create_options,
> .bdrv_has_zero_init = hdev_has_zero_init,
> - .bdrv_flush = raw_flush,
>
> .bdrv_aio_readv = raw_aio_readv,
> .bdrv_aio_writev = raw_aio_writev,
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Paolo
prev parent reply other threads:[~2011-09-12 11:35 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-09-12 9:14 [Qemu-devel] [PATCH] block: emulate .bdrv_flush() using .bdrv_aio_flush() Stefan Hajnoczi
2011-09-12 11:15 ` Paolo Bonzini
2011-09-12 11:35 ` Paolo Bonzini [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4E6DEE76.3020502@redhat.com \
--to=pbonzini@redhat.com \
--cc=kwolf@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@linux.vnet.ibm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.