From: Kevin Wolf <kwolf@redhat.com>
To: Alberto Garcia <berto@igalia.com>
Cc: qemu-devel@nongnu.org, qemu-block@nongnu.org,
Max Reitz <mreitz@redhat.com>, Eric Blake <eblake@redhat.com>,
Markus Armbruster <armbru@redhat.com>
Subject: Re: [Qemu-devel] [PATCH v12 02/19] block: Pause all jobs during bdrv_reopen_multiple()
Date: Wed, 26 Oct 2016 16:36:12 +0200 [thread overview]
Message-ID: <20161026143612.GP4758@noname.str.redhat.com> (raw)
In-Reply-To: <6cf9c4b12d9d95692664efa731d1f56c01dc1581.1477476553.git.berto@igalia.com>
Am 26.10.2016 um 12:29 hat Alberto Garcia geschrieben:
> When a BlockDriverState is about to be reopened it can trigger certain
> operations that need to write to disk. During this process a different
> block job can be woken up. If that block job completes and also needs
> to call bdrv_reopen() it can happen that it needs to do it on the same
> BlockDriverState that is still in the process of being reopened.
>
> This can have fatal consequences, like in this example:
>
> 1) Block job A starts and sleeps after a while.
> 2) Block job B starts and tries to reopen node1 (a qcow2 file).
> 3) Reopening node1 means flushing and replacing its qcow2 cache.
> 4) While the qcow2 cache is being flushed, job A wakes up.
> 5) Job A completes and reopens node1, replacing its cache.
> 6) Job B resumes, but the cache that was being flushed no longer
> exists.
>
> This patch splits the bdrv_drain_all() call to keep all block jobs
> paused during bdrv_reopen_multiple(), so that step 4 can never happen
> and the operation is safe.
>
> Note that this scenario can only happen if both bdrv_reopen() calls
> are made by block jobs on the same backing chain. Otherwise there's no
> chance that the same BlockDriverState appears in both reopen queues.
>
> Signed-off-by: Alberto Garcia <berto@igalia.com>
> Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
next prev parent reply other threads:[~2016-10-26 14:36 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-10-26 10:29 [Qemu-devel] [PATCH v12 00/19] Support streaming to an intermediate layer Alberto Garcia
2016-10-26 10:29 ` [Qemu-devel] [PATCH v12 01/19] block: Add bdrv_drain_all_{begin, end}() Alberto Garcia
2016-10-26 14:35 ` Kevin Wolf
2016-10-26 10:29 ` [Qemu-devel] [PATCH v12 02/19] block: Pause all jobs during bdrv_reopen_multiple() Alberto Garcia
2016-10-26 14:36 ` Kevin Wolf [this message]
2016-10-26 10:29 ` [Qemu-devel] [PATCH v12 03/19] block: Add block_job_add_bdrv() Alberto Garcia
2016-10-26 14:36 ` Kevin Wolf
2016-10-26 10:29 ` [Qemu-devel] [PATCH v12 04/19] block: Use block_job_add_bdrv() in mirror_start_job() Alberto Garcia
2016-10-26 14:40 ` Kevin Wolf
2016-10-26 10:29 ` [Qemu-devel] [PATCH v12 05/19] block: Use block_job_add_bdrv() in backup_start() Alberto Garcia
2016-10-26 14:41 ` Kevin Wolf
2016-10-26 10:29 ` [Qemu-devel] [PATCH v12 06/19] block: Check blockers in all nodes involved in a block-commit job Alberto Garcia
2016-10-26 10:29 ` [Qemu-devel] [PATCH v12 07/19] block: Block all nodes involved in the block-commit operation Alberto Garcia
2016-10-26 14:49 ` Kevin Wolf
2016-10-26 10:29 ` [Qemu-devel] [PATCH v12 08/19] block: Block all intermediate nodes in commit_active_start() Alberto Garcia
2016-10-26 10:29 ` [Qemu-devel] [PATCH v12 09/19] block: Support streaming to an intermediate layer Alberto Garcia
2016-10-26 14:52 ` Kevin Wolf
2016-10-26 10:29 ` [Qemu-devel] [PATCH v12 10/19] block: Add QMP support for " Alberto Garcia
2016-10-26 14:58 ` Kevin Wolf
2016-10-26 17:23 ` Alberto Garcia
2016-10-27 8:58 ` Kevin Wolf
2016-10-27 10:08 ` Alberto Garcia
2016-10-27 14:46 ` Eric Blake
2016-10-26 10:29 ` [Qemu-devel] [PATCH v12 11/19] docs: Document how to stream " Alberto Garcia
2016-10-26 15:01 ` Kevin Wolf
2016-10-26 10:29 ` [Qemu-devel] [PATCH v12 12/19] qemu-iotests: Test streaming " Alberto Garcia
2016-10-27 15:13 ` Kevin Wolf
2016-10-26 10:29 ` [Qemu-devel] [PATCH v12 13/19] qemu-iotests: Test block-stream operations in parallel Alberto Garcia
2016-10-27 15:23 ` Kevin Wolf
2016-10-26 10:29 ` [Qemu-devel] [PATCH v12 14/19] qemu-iotests: Test overlapping stream and commit operations Alberto Garcia
2016-10-27 15:36 ` Kevin Wolf
2016-10-26 10:29 ` [Qemu-devel] [PATCH v12 15/19] qemu-iotests: Test block-stream and block-commit in parallel Alberto Garcia
2016-10-27 15:54 ` Kevin Wolf
2016-10-26 10:29 ` [Qemu-devel] [PATCH v12 16/19] qemu-iotests: Add iotests.supports_quorum() Alberto Garcia
2016-10-27 15:56 ` Kevin Wolf
2016-10-26 10:29 ` [Qemu-devel] [PATCH v12 17/19] qemu-iotests: Test streaming to a Quorum child Alberto Garcia
2016-10-27 16:03 ` Kevin Wolf
2016-10-26 10:29 ` [Qemu-devel] [PATCH v12 18/19] block: Add 'base-node' parameter to the 'block-stream' command Alberto Garcia
2016-10-27 16:09 ` Kevin Wolf
2016-10-26 10:29 ` [Qemu-devel] [PATCH v12 19/19] qemu-iotests: Test the 'base-node' parameter of 'block-stream' Alberto Garcia
2016-10-27 16:13 ` Kevin Wolf
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=20161026143612.GP4758@noname.str.redhat.com \
--to=kwolf@redhat.com \
--cc=armbru@redhat.com \
--cc=berto@igalia.com \
--cc=eblake@redhat.com \
--cc=mreitz@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
/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.