]> git.ipfire.org Git - thirdparty/qemu.git/commitdiff
block: Add BDS.never_freeze
authorMax Reitz <mreitz@redhat.com>
Wed, 3 Jul 2019 17:28:02 +0000 (19:28 +0200)
committerMax Reitz <mreitz@redhat.com>
Mon, 15 Jul 2019 13:48:40 +0000 (15:48 +0200)
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>
Message-id: 20190703172813.6868-2-mreitz@redhat.com
Signed-off-by: Max Reitz <mreitz@redhat.com>
block.c
block/commit.c
block/mirror.c
include/block/block_int.h

diff --git a/block.c b/block.c
index c139540f2bac727c17c0c6d150dc1d5c2f813618..6565192b91ed737a9ab0fc87dd36e4e43a1755c7 100644 (file)
--- a/block.c
+++ b/block.c
@@ -4416,6 +4416,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;
index ca7e408b26f4d00041b5f8d3cdae4078182e8a48..2c5a6d4ebca3cf928a30f5d7032fe901c59f9189 100644 (file)
@@ -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);
index 2fcec70e3583c83561c008c1cfa55ddd38bd1c5e..8cb75fb409b67a4edb7c07f20f37293443fd9844 100644 (file)
@@ -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 |
index d6415b53c1c3d181f0bc4e713b9f8d98eccbb4ec..50902531b730b370b7eaeba9ddf32ac48226a01e 100644 (file)
@@ -885,6 +885,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 {