From: Jeff Cody <jcody@redhat.com>
To: Max Reitz <mreitz@redhat.com>
Cc: qemu-block@nongnu.org, Kevin Wolf <kwolf@redhat.com>,
qemu-devel@nongnu.org, Stefan Hajnoczi <stefanha@redhat.com>
Subject: Re: [Qemu-devel] [Qemu-block] [PATCH 2/3] qcow2: Always execute preallocate() in a coroutine
Date: Mon, 9 Oct 2017 19:30:26 -0400 [thread overview]
Message-ID: <20171009233026.GC5170@localhost.localdomain> (raw)
In-Reply-To: <20171009215533.12530-3-mreitz@redhat.com>
On Mon, Oct 09, 2017 at 11:55:32PM +0200, Max Reitz wrote:
> Some qcow2 functions (at least perform_cow()) expect s->lock to be
> taken. Therefore, if we want to make use of them, we should execute
> preallocate() (as "preallocate_co") in a coroutine so that we can use
> the qemu_co_mutex_* functions.
>
> Signed-off-by: Max Reitz <mreitz@redhat.com>
Reviewed-by: Jeff Cody <jcody@redhat.com>
> ---
> block/qcow2.c | 41 ++++++++++++++++++++++++++++++++++-------
> 1 file changed, 34 insertions(+), 7 deletions(-)
>
> diff --git a/block/qcow2.c b/block/qcow2.c
> index c3b312cdef..cc75a5167f 100644
> --- a/block/qcow2.c
> +++ b/block/qcow2.c
> @@ -2460,6 +2460,14 @@ static int qcow2_set_up_encryption(BlockDriverState *bs, const char *encryptfmt,
> }
>
>
> +typedef struct PreallocCo {
> + BlockDriverState *bs;
> + uint64_t offset;
> + uint64_t new_length;
> +
> + int ret;
> +} PreallocCo;
> +
> /**
> * Preallocates metadata structures for data clusters between @offset (in the
> * guest disk) and @new_length (which is thus generally the new guest disk
> @@ -2467,9 +2475,12 @@ static int qcow2_set_up_encryption(BlockDriverState *bs, const char *encryptfmt,
> *
> * Returns: 0 on success, -errno on failure.
> */
> -static int preallocate(BlockDriverState *bs,
> - uint64_t offset, uint64_t new_length)
> +static void coroutine_fn preallocate_co(void *opaque)
> {
> + struct PreallocCo *params = opaque;
> + BlockDriverState *bs = params->bs;
> + uint64_t offset = params->offset;
> + uint64_t new_length = params->new_length;
> BDRVQcow2State *s = bs->opaque;
> uint64_t bytes;
> uint64_t host_offset = 0;
> @@ -2477,9 +2488,7 @@ static int preallocate(BlockDriverState *bs,
> int ret;
> QCowL2Meta *meta;
>
> - if (qemu_in_coroutine()) {
> - qemu_co_mutex_lock(&s->lock);
> - }
> + qemu_co_mutex_lock(&s->lock);
>
> assert(offset <= new_length);
> bytes = new_length - offset;
> @@ -2533,10 +2542,28 @@ static int preallocate(BlockDriverState *bs,
> ret = 0;
>
> done:
> + qemu_co_mutex_unlock(&s->lock);
> + params->ret = ret;
> +}
> +
> +static int preallocate(BlockDriverState *bs,
> + uint64_t offset, uint64_t new_length)
> +{
> + PreallocCo params = {
> + .bs = bs,
> + .offset = offset,
> + .new_length = new_length,
> + .ret = -EINPROGRESS,
> + };
> +
> if (qemu_in_coroutine()) {
> - qemu_co_mutex_unlock(&s->lock);
> + preallocate_co(¶ms);
> + } else {
> + Coroutine *co = qemu_coroutine_create(preallocate_co, ¶ms);
> + bdrv_coroutine_enter(bs, co);
> + BDRV_POLL_WHILE(bs, params.ret == -EINPROGRESS);
> }
> - return ret;
> + return params.ret;
> }
>
> /* qcow2_refcount_metadata_size:
> --
> 2.13.6
>
>
next prev parent reply other threads:[~2017-10-09 23:30 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-10-09 21:55 [Qemu-devel] [PATCH 0/3] qcow2: Fix preallocated truncation Max Reitz
2017-10-09 21:55 ` [Qemu-devel] [PATCH 1/3] qcow2: Fix unaligned " Max Reitz
2017-10-09 21:57 ` Max Reitz
2017-10-09 22:25 ` Eric Blake
2017-10-11 11:30 ` Max Reitz
2017-10-09 23:30 ` [Qemu-devel] [Qemu-block] " Jeff Cody
2017-10-09 21:55 ` [Qemu-devel] [PATCH 2/3] qcow2: Always execute preallocate() in a coroutine Max Reitz
2017-10-09 21:57 ` Max Reitz
2017-10-09 22:28 ` Eric Blake
2017-10-11 11:31 ` Max Reitz
2017-10-09 23:30 ` Jeff Cody [this message]
2017-10-09 21:55 ` [Qemu-devel] [PATCH 3/3] iotests: Add cluster_size=64k to 125 Max Reitz
2017-10-09 22:32 ` Eric Blake
2017-10-09 23:30 ` [Qemu-devel] [Qemu-block] " Jeff Cody
2017-10-11 13:23 ` [Qemu-devel] [PATCH 0/3] qcow2: Fix preallocated truncation Max Reitz
2017-10-11 15:05 ` Stefan Hajnoczi
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=20171009233026.GC5170@localhost.localdomain \
--to=jcody@redhat.com \
--cc=kwolf@redhat.com \
--cc=mreitz@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@redhat.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.