From: Kevin Wolf <kwolf@redhat.com>
To: qemu-devel@nongnu.org
Cc: kwolf@redhat.com
Subject: [Qemu-devel] [PULL 12/73] blockdev: acquire AioContext in change-backing-file
Date: Wed, 10 Dec 2014 11:33:38 +0100 [thread overview]
Message-ID: <1418207679-32260-13-git-send-email-kwolf@redhat.com> (raw)
In-Reply-To: <1418207679-32260-1-git-send-email-kwolf@redhat.com>
From: Stefan Hajnoczi <stefanha@redhat.com>
Add dataplane support to the change-backing-file QMP commands. By
acquiring the AioContext we avoid race conditions with the dataplane
thread which may also be accessing the BlockDriverState.
Note that this command operates on both bs and a node in its chain
(image_bs). The bdrv_chain_contains(bs, image_bs) check guarantees that
bs and image_bs are in the same AioContext.
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
Reviewed-by: Max Reitz <mreitz@redhat.com>
Signed-off-by: Max Reitz <mreitz@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
blockdev.c | 19 +++++++++++++------
hw/block/dataplane/virtio-blk.c | 1 +
2 files changed, 14 insertions(+), 6 deletions(-)
diff --git a/blockdev.c b/blockdev.c
index 7bf88d4..a52f205 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -2584,6 +2584,7 @@ void qmp_change_backing_file(const char *device,
Error **errp)
{
BlockDriverState *bs = NULL;
+ AioContext *aio_context;
BlockDriverState *image_bs = NULL;
Error *local_err = NULL;
bool ro;
@@ -2597,34 +2598,37 @@ void qmp_change_backing_file(const char *device,
return;
}
+ aio_context = bdrv_get_aio_context(bs);
+ aio_context_acquire(aio_context);
+
image_bs = bdrv_lookup_bs(NULL, image_node_name, &local_err);
if (local_err) {
error_propagate(errp, local_err);
- return;
+ goto out;
}
if (!image_bs) {
error_setg(errp, "image file not found");
- return;
+ goto out;
}
if (bdrv_find_base(image_bs) == image_bs) {
error_setg(errp, "not allowing backing file change on an image "
"without a backing file");
- return;
+ goto out;
}
/* even though we are not necessarily operating on bs, we need it to
* determine if block ops are currently prohibited on the chain */
if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_CHANGE, errp)) {
- return;
+ goto out;
}
/* final sanity check */
if (!bdrv_chain_contains(bs, image_bs)) {
error_setg(errp, "'%s' and image file are not in the same chain",
device);
- return;
+ goto out;
}
/* if not r/w, reopen to make r/w */
@@ -2635,7 +2639,7 @@ void qmp_change_backing_file(const char *device,
bdrv_reopen(image_bs, open_flags | BDRV_O_RDWR, &local_err);
if (local_err) {
error_propagate(errp, local_err);
- return;
+ goto out;
}
}
@@ -2655,6 +2659,9 @@ void qmp_change_backing_file(const char *device,
error_propagate(errp, local_err); /* will preserve prior errp */
}
}
+
+out:
+ aio_context_release(aio_context);
}
void qmp_blockdev_add(BlockdevOptions *options, Error **errp)
diff --git a/hw/block/dataplane/virtio-blk.c b/hw/block/dataplane/virtio-blk.c
index 2548113..90ab27e 100644
--- a/hw/block/dataplane/virtio-blk.c
+++ b/hw/block/dataplane/virtio-blk.c
@@ -197,6 +197,7 @@ void virtio_blk_data_plane_create(VirtIODevice *vdev, VirtIOBlkConf *conf,
blk_op_unblock(conf->conf.blk, BLOCK_OP_TYPE_RESIZE, s->blocker);
blk_op_unblock(conf->conf.blk, BLOCK_OP_TYPE_DRIVE_DEL, s->blocker);
blk_op_unblock(conf->conf.blk, BLOCK_OP_TYPE_BACKUP_SOURCE, s->blocker);
+ blk_op_unblock(conf->conf.blk, BLOCK_OP_TYPE_CHANGE, s->blocker);
blk_op_unblock(conf->conf.blk, BLOCK_OP_TYPE_COMMIT, s->blocker);
blk_op_unblock(conf->conf.blk, BLOCK_OP_TYPE_EJECT, s->blocker);
blk_op_unblock(conf->conf.blk, BLOCK_OP_TYPE_INTERNAL_SNAPSHOT_DELETE,
--
1.8.3.1
next prev parent reply other threads:[~2014-12-10 12:15 UTC|newest]
Thread overview: 75+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-12-10 10:33 [Qemu-devel] [PULL 00/73] Merging block-next for 2.3 Kevin Wolf
2014-12-10 10:33 ` [Qemu-devel] [PULL 01/73] block: Add bdrv_next_node Kevin Wolf
2014-12-10 10:33 ` [Qemu-devel] [PULL 02/73] block: Add bdrv_get_node_name Kevin Wolf
2014-12-10 10:33 ` [Qemu-devel] [PULL 03/73] block: Include "node-name" if present in query-blockstats Kevin Wolf
2014-12-10 10:33 ` [Qemu-devel] [PULL 04/73] qmp: Add optional switch "query-nodes" " Kevin Wolf
2014-12-10 10:33 ` [Qemu-devel] [PULL 05/73] qjson: Drop trailing space for pretty formatting Kevin Wolf
2014-12-10 10:33 ` [Qemu-devel] [PULL 06/73] chardev: Add -qmp-pretty Kevin Wolf
2014-12-10 10:33 ` [Qemu-devel] [PULL 07/73] iotests: _filter_qmp for pretty JSON output Kevin Wolf
2014-12-10 10:33 ` [Qemu-devel] [PULL 08/73] iotests: Use -qmp-pretty in 067 Kevin Wolf
2014-12-10 10:33 ` [Qemu-devel] [PULL 09/73] blockdev: acquire AioContext in blockdev-snapshot-delete-internal-sync Kevin Wolf
2014-12-10 10:33 ` [Qemu-devel] [PULL 10/73] blockdev: check for BLOCK_OP_TYPE_INTERNAL_SNAPSHOT_DELETE Kevin Wolf
2014-12-10 10:33 ` [Qemu-devel] [PULL 11/73] blockdev: acquire AioContext in eject, change, and block_passwd Kevin Wolf
2014-12-10 10:33 ` Kevin Wolf [this message]
2014-12-10 10:33 ` [Qemu-devel] [PULL 13/73] block/qapi: Add cache information to query-block Kevin Wolf
2014-12-10 10:33 ` [Qemu-devel] [PULL 14/73] block/hmp: Factor out print_block_info() Kevin Wolf
2014-12-10 10:33 ` [Qemu-devel] [PULL 15/73] block/hmp: Allow info = NULL in print_block_info() Kevin Wolf
2014-12-10 10:33 ` [Qemu-devel] [PULL 16/73] block/hmp: Allow node-name in 'info block' Kevin Wolf
2014-12-10 10:33 ` [Qemu-devel] [PULL 17/73] monitor: Fix HMP tab completion Kevin Wolf
2014-12-10 10:33 ` [Qemu-devel] [PULL 18/73] blkdebug: Simplify and improve filename generation Kevin Wolf
2014-12-10 10:33 ` [Qemu-devel] [PULL 19/73] iotests: Plain blkdebug " Kevin Wolf
2014-12-10 10:33 ` [Qemu-devel] [PULL 20/73] ahci: avoid #ifdef DEBUG_AHCI bitrot Kevin Wolf
2014-12-10 10:33 ` [Qemu-devel] [PULL 21/73] ahci: replace SATA FIS type magic numbers with constants Kevin Wolf
2014-12-10 10:33 ` [Qemu-devel] [PULL 22/73] block: Lift more functions into BlockBackend Kevin Wolf
2014-12-10 10:33 ` [Qemu-devel] [PULL 23/73] block: Add AioContextNotifier functions to BB Kevin Wolf
2014-12-10 10:33 ` [Qemu-devel] [PULL 24/73] block: Add blk_add_close_notifier() for BB Kevin Wolf
2014-12-10 10:33 ` [Qemu-devel] [PULL 25/73] nbd: Change external interface to BlockBackend Kevin Wolf
2014-12-10 10:33 ` [Qemu-devel] [PULL 26/73] nbd: Use BlockBackend internally Kevin Wolf
2014-12-10 10:33 ` [Qemu-devel] [PULL 27/73] qemu-nbd: Use BlockBackend where reasonable Kevin Wolf
2014-12-10 10:33 ` [Qemu-devel] [PULL 28/73] tests: Use "command -v" instead of which(1) in shell scripts Kevin Wolf
2014-12-10 10:33 ` [Qemu-devel] [PULL 29/73] qemu-io: Allow explicitly specifying format Kevin Wolf
2014-12-10 10:33 ` [Qemu-devel] [PULL 30/73] qemu-iotests: Use qemu-io -f $IMGFMT Kevin Wolf
2014-12-10 10:33 ` [Qemu-devel] [PULL 31/73] qemu-iotests: Add qemu-io format option in Python tests Kevin Wolf
2014-12-10 10:33 ` [Qemu-devel] [PULL 32/73] qtests: Specify image format explicitly Kevin Wolf
2014-12-10 10:33 ` [Qemu-devel] [PULL 33/73] block: Factor bdrv_probe_all() out of find_image_format() Kevin Wolf
2014-12-10 10:34 ` [Qemu-devel] [PULL 34/73] block: Read only one sector for format probing Kevin Wolf
2014-12-10 10:34 ` [Qemu-devel] [PULL 35/73] raw: Prohibit dangerous writes for probed images Kevin Wolf
2014-12-10 10:34 ` [Qemu-devel] [PULL 36/73] qemu-iotests: Fix stderr handling in common.qemu Kevin Wolf
2014-12-10 10:34 ` [Qemu-devel] [PULL 37/73] qemu-iotests: Test writing non-raw image headers to raw image Kevin Wolf
2014-12-10 10:34 ` [Qemu-devel] [PULL 38/73] blockdev: update outdated qmp_transaction() comments Kevin Wolf
2014-12-10 10:34 ` [Qemu-devel] [PULL 39/73] blockdev: drop unnecessary DriveBackupState field assignment Kevin Wolf
2014-12-10 10:34 ` [Qemu-devel] [PULL 40/73] blockdev: acquire AioContext in QMP 'transaction' actions Kevin Wolf
2014-12-10 10:34 ` [Qemu-devel] [PULL 41/73] blockdev: check for BLOCK_OP_TYPE_INTERNAL_SNAPSHOT Kevin Wolf
2014-12-10 10:34 ` [Qemu-devel] [PULL 42/73] qcow2: Fix header extension size check Kevin Wolf
2014-12-10 10:34 ` [Qemu-devel] [PULL 43/73] qcow2.py: Add required padding for header extensions Kevin Wolf
2014-12-10 10:34 ` [Qemu-devel] [PULL 44/73] block: Don't probe for unknown backing file format Kevin Wolf
2014-12-10 10:34 ` [Qemu-devel] [PULL 45/73] block: do not use get_clock() Kevin Wolf
2014-12-10 10:34 ` [Qemu-devel] [PULL 46/73] qemu-iotests: 060: Filter the real disk size Kevin Wolf
2014-12-10 10:34 ` [Qemu-devel] [PULL 47/73] qemu-iotests: 082: " Kevin Wolf
2014-12-10 10:34 ` [Qemu-devel] [PULL 48/73] nvme: 64kB page size fixes Kevin Wolf
2014-12-10 10:34 ` [Qemu-devel] [PULL 49/73] ide: Check validity of logical block size Kevin Wolf
2014-12-10 10:34 ` [Qemu-devel] [PULL 50/73] iotests: Specify qcow2 format for qemu-io in 059 Kevin Wolf
2014-12-10 10:34 ` [Qemu-devel] [PULL 51/73] block: Make essential BlockDriver objects public Kevin Wolf
2014-12-10 10:34 ` [Qemu-devel] [PULL 52/73] block: Omit bdrv_find_format for essential drivers Kevin Wolf
2014-12-10 10:34 ` [Qemu-devel] [PULL 53/73] block/vvfat: qcow driver may not be found Kevin Wolf
2014-12-10 10:34 ` [Qemu-devel] [PULL 54/73] block/nfs: Add create_opts Kevin Wolf
2014-12-10 10:34 ` [Qemu-devel] [PULL 55/73] block: Check create_opts before image creation Kevin Wolf
2014-12-10 10:34 ` [Qemu-devel] [PULL 56/73] qemu-img: " Kevin Wolf
2014-12-10 10:34 ` [Qemu-devel] [PULL 57/73] qemu-img: Check create_opts before image amendment Kevin Wolf
2014-12-10 10:34 ` [Qemu-devel] [PULL 58/73] iotests: Only kill NBD server if it runs Kevin Wolf
2014-12-10 10:34 ` [Qemu-devel] [PULL 59/73] iotests: Add test for unsupported image creation Kevin Wolf
2014-12-10 10:34 ` [Qemu-devel] [PULL 60/73] qcow2: Prevent numerical overflow Kevin Wolf
2014-12-10 10:34 ` [Qemu-devel] [PULL 61/73] qcow2: Flushing the caches in qcow2_close may fail Kevin Wolf
2014-12-10 10:34 ` [Qemu-devel] [PULL 62/73] qcow2: Respect bdrv_truncate() error Kevin Wolf
2014-12-10 10:34 ` [Qemu-devel] [PULL 63/73] block/raw-posix: Fix ret in raw_open_common() Kevin Wolf
2014-12-10 10:34 ` [Qemu-devel] [PULL 64/73] qemu-iotests: Skip 099 for VMDK subformats with desc file Kevin Wolf
2014-12-10 10:34 ` [Qemu-devel] [PULL 65/73] block: remove BLOCK_OPT_NOCOW from vdi_create_opts Kevin Wolf
2014-12-10 10:34 ` [Qemu-devel] [PULL 66/73] block: remove BLOCK_OPT_NOCOW from vpc_create_opts Kevin Wolf
2014-12-10 10:34 ` [Qemu-devel] [PULL 67/73] block: Use g_new0() for a bit of extra type checking Kevin Wolf
2014-12-10 10:34 ` [Qemu-devel] [PULL 68/73] vmdk: Use g_random_int to generate CID Kevin Wolf
2014-12-10 10:34 ` [Qemu-devel] [PULL 69/73] vmdk: Fix comment to match code of extent lines Kevin Wolf
2014-12-10 10:34 ` [Qemu-devel] [PULL 70/73] vmdk: Clean up descriptor file reading Kevin Wolf
2014-12-10 10:34 ` [Qemu-devel] [PULL 71/73] vmdk: Check descriptor file length when reading it Kevin Wolf
2014-12-10 10:34 ` [Qemu-devel] [PULL 72/73] vmdk: Remove unnecessary initialization Kevin Wolf
2014-12-10 10:34 ` [Qemu-devel] [PULL 73/73] vmdk: Set errp on failures in vmdk_open_vmdk4 Kevin Wolf
2014-12-11 15:45 ` [Qemu-devel] [PULL 00/73] Merging block-next for 2.3 Peter Maydell
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=1418207679-32260-13-git-send-email-kwolf@redhat.com \
--to=kwolf@redhat.com \
--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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).