[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-block] [PULL 02/11] block: Add BDS.never_freeze
From: |
Max Reitz |
Subject: |
[Qemu-block] [PULL 02/11] block: Add BDS.never_freeze |
Date: |
Mon, 15 Jul 2019 16:28:56 +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 <address@hidden>
Reviewed-by: Andrey Shinkevich <address@hidden>
Reviewed-by: Alberto Garcia <address@hidden>
Message-id: address@hidden
Signed-off-by: Max Reitz <address@hidden>
---
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 d6415b53c1..50902531b7 100644
--- a/include/block/block_int.h
+++ b/include/block/block_int.h
@@ -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 {
diff --git a/block.c b/block.c
index c139540f2b..6565192b91 100644
--- 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;
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
- [Qemu-block] [PULL 00/11] Block patches for rc1, Max Reitz, 2019/07/15
- [Qemu-block] [PULL 01/11] nvme: Set number of queues later in nvme_init(), Max Reitz, 2019/07/15
- [Qemu-block] [PULL 02/11] block: Add BDS.never_freeze,
Max Reitz <=
- [Qemu-block] [PULL 03/11] block/stream: Fix error path, Max Reitz, 2019/07/15
- [Qemu-block] [PULL 04/11] block/stream: Swap backing file change order, Max Reitz, 2019/07/15
- [Qemu-block] [PULL 05/11] block: Deep-clear inherits_from, Max Reitz, 2019/07/15
- [Qemu-block] [PULL 06/11] iotests: Fix throttling in 030, Max Reitz, 2019/07/15
- [Qemu-block] [PULL 07/11] iotests: Compare error messages in 030, Max Reitz, 2019/07/15
- [Qemu-block] [PULL 08/11] iotests: Add @use_log to VM.run_job(), Max Reitz, 2019/07/15
- [Qemu-block] [PULL 09/11] iotests: Add new case to 030, Max Reitz, 2019/07/15
- [Qemu-block] [PULL 10/11] iotests: Add read-only test case to 030, Max Reitz, 2019/07/15
- [Qemu-block] [PULL 11/11] gluster: fix .bdrv_reopen_prepare when backing file is a JSON object, Max Reitz, 2019/07/15
- Re: [Qemu-block] [PULL 00/11] Block patches for rc1, Peter Maydell, 2019/07/15