From: Max Reitz <mreitz@redhat.com>
To: qemu-block@nongnu.org
Cc: Kevin Wolf <kwolf@redhat.com>,
qemu-devel@nongnu.org, Max Reitz <mreitz@redhat.com>
Subject: [Qemu-devel] [PATCH v2 01/12] block: Add BDS.never_freeze
Date: Wed, 3 Jul 2019 19:28:02 +0200 [thread overview]
Message-ID: <20190703172813.6868-2-mreitz@redhat.com> (raw)
In-Reply-To: <20190703172813.6868-1-mreitz@redhat.com>
The commit and the mirror block job must be able to drop their filter
node at any point. However, this will not be possible if any of the
BdrvChild links to them is frozen. Therefore, we need to prevent them
from ever becoming frozen.
Signed-off-by: Max Reitz <mreitz@redhat.com>
Reviewed-by: Andrey Shinkevich <andrey.shinkevich@virtuozzo.com>
Reviewed-by: Alberto Garcia <berto@igalia.com>
---
include/block/block_int.h | 3 +++
block.c | 8 ++++++++
block/commit.c | 4 ++++
block/mirror.c | 4 ++++
4 files changed, 19 insertions(+)
diff --git a/include/block/block_int.h b/include/block/block_int.h
index fce9a9e7ee..bc378a49dc 100644
--- a/include/block/block_int.h
+++ b/include/block/block_int.h
@@ -908,6 +908,9 @@ struct BlockDriverState {
/* Only read/written by whoever has set active_flush_req to true. */
unsigned int flushed_gen; /* Flushed write generation */
+
+ /* BdrvChild links to this node may never be frozen */
+ bool never_freeze;
};
struct BlockBackendRootState {
diff --git a/block.c b/block.c
index 1652f3d29b..a06f07347f 100644
--- a/block.c
+++ b/block.c
@@ -4420,6 +4420,14 @@ int bdrv_freeze_backing_chain(BlockDriverState *bs, BlockDriverState *base,
return -EPERM;
}
+ for (i = bs; i != base; i = backing_bs(i)) {
+ if (i->backing && backing_bs(i)->never_freeze) {
+ error_setg(errp, "Cannot freeze '%s' link to '%s'",
+ i->backing->name, backing_bs(i)->node_name);
+ return -EPERM;
+ }
+ }
+
for (i = bs; i != base; i = backing_bs(i)) {
if (i->backing) {
i->backing->frozen = true;
diff --git a/block/commit.c b/block/commit.c
index ca7e408b26..2c5a6d4ebc 100644
--- a/block/commit.c
+++ b/block/commit.c
@@ -298,6 +298,10 @@ void commit_start(const char *job_id, BlockDriverState *bs,
if (!filter_node_name) {
commit_top_bs->implicit = true;
}
+
+ /* So that we can always drop this node */
+ commit_top_bs->never_freeze = true;
+
commit_top_bs->total_sectors = top->total_sectors;
bdrv_append(commit_top_bs, top, &local_err);
diff --git a/block/mirror.c b/block/mirror.c
index 2fcec70e35..8cb75fb409 100644
--- a/block/mirror.c
+++ b/block/mirror.c
@@ -1551,6 +1551,10 @@ static BlockJob *mirror_start_job(
if (!filter_node_name) {
mirror_top_bs->implicit = true;
}
+
+ /* So that we can always drop this node */
+ mirror_top_bs->never_freeze = true;
+
mirror_top_bs->total_sectors = bs->total_sectors;
mirror_top_bs->supported_write_flags = BDRV_REQ_WRITE_UNCHANGED;
mirror_top_bs->supported_zero_flags = BDRV_REQ_WRITE_UNCHANGED |
--
2.21.0
next prev parent reply other threads:[~2019-07-03 17:30 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-07-03 17:28 [Qemu-devel] [PATCH v2 00/12] block: Fixes for concurrent block jobs Max Reitz
2019-07-03 17:28 ` Max Reitz [this message]
2019-07-03 17:28 ` [Qemu-devel] [PATCH v2 02/12] block/stream: Fix error path Max Reitz
2019-07-03 17:28 ` [Qemu-devel] [PATCH v2 03/12] block/stream: Swap backing file change order Max Reitz
2019-07-03 17:28 ` [Qemu-devel] [PATCH v2 04/12] block: Keep subtree drained in drop_intermediate Max Reitz
2019-07-16 17:03 ` Kevin Wolf
2019-07-03 17:28 ` [Qemu-devel] [PATCH v2 05/12] block: Reduce (un)drains when replacing a child Max Reitz
2019-07-16 17:18 ` Kevin Wolf
2019-07-03 17:28 ` [Qemu-devel] [PATCH v2 06/12] block: Deep-clear inherits_from Max Reitz
2019-07-16 17:01 ` Kevin Wolf
2019-07-17 7:47 ` Max Reitz
2019-07-17 8:17 ` Kevin Wolf
2019-07-17 9:07 ` Max Reitz
2019-07-17 12:01 ` Kevin Wolf
2019-07-03 17:28 ` [Qemu-devel] [PATCH v2 07/12] iotests: Fix throttling in 030 Max Reitz
2019-07-03 17:28 ` [Qemu-devel] [PATCH v2 08/12] iotests: Compare error messages " Max Reitz
2019-07-03 17:28 ` [Qemu-devel] [PATCH v2 09/12] iotests: Add @use_log to VM.run_job() Max Reitz
2019-07-03 17:28 ` [Qemu-devel] [PATCH v2 10/12] iotests: Add new case to 030 Max Reitz
2019-07-03 17:28 ` [Qemu-devel] [PATCH v2 11/12] iotests: Add read-only test " Max Reitz
2019-07-03 17:28 ` [Qemu-devel] [PATCH v2 12/12] iotests: Add test for concurrent stream/commit Max Reitz
2019-07-10 21:28 ` [Qemu-devel] [PATCH v2 00/12] block: Fixes for concurrent block jobs Max Reitz
2019-07-15 13:41 ` Max Reitz
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=20190703172813.6868-2-mreitz@redhat.com \
--to=mreitz@redhat.com \
--cc=kwolf@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 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).