All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 0/7] block: Relax restrictions for blockdev-snapshot
@ 2020-03-10 11:38 Kevin Wolf
  2020-03-10 11:38 ` [PATCH v2 1/7] block: Make bdrv_get_cumulative_perm() public Kevin Wolf
                   ` (7 more replies)
  0 siblings, 8 replies; 16+ messages in thread
From: Kevin Wolf @ 2020-03-10 11:38 UTC (permalink / raw)
  To: qemu-block; +Cc: kwolf, pkrempa, qemu-devel, mreitz

This series allows libvirt to fix a regression that its switch from
drive-mirror to blockdev-mirror caused: It currently requires that the
backing chain of the target image is already available when the mirror
operation is started.

In reality, the backing chain may only be copied while the operation is
in progress, so the backing file of the target image needs to stay
disabled until the operation completes and should be attached only at
that point. Without this series, we don't have a supported API to attach
the backing file at that later point.

v2:
- Added a fix and test case for iothreads [Peter]
- Added a blockdev-snapshot feature flag to indicate that it's usable
  for attaching a backing chain to an overlay that is already in
  write-only use (e.g. as a mirror target) [Peter]

Kevin Wolf (6):
  block: Make bdrv_get_cumulative_perm() public
  block: Relax restrictions for blockdev-snapshot
  iotests: Fix run_job() with use_log=False
  iotests: Test mirror with temporarily disabled target backing file
  block: Fix cross-AioContext blockdev-snapshot
  iotests: Add iothread cases to 155

Peter Krempa (1):
  qapi: Add '@allow-write-only-overlay' feature for 'blockdev-snapshot'

 qapi/block-core.json          |  9 +++-
 include/block/block_int.h     |  3 ++
 block.c                       |  7 ++-
 blockdev.c                    | 30 ++++--------
 tests/qemu-iotests/iotests.py |  5 +-
 tests/qemu-iotests/085.out    |  4 +-
 tests/qemu-iotests/155        | 88 +++++++++++++++++++++++++++++------
 tests/qemu-iotests/155.out    |  4 +-
 8 files changed, 104 insertions(+), 46 deletions(-)

-- 
2.20.1



^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH v2 1/7] block: Make bdrv_get_cumulative_perm() public
  2020-03-10 11:38 [PATCH v2 0/7] block: Relax restrictions for blockdev-snapshot Kevin Wolf
@ 2020-03-10 11:38 ` Kevin Wolf
  2020-03-10 13:10   ` Peter Krempa
  2020-03-10 11:38 ` [PATCH v2 2/7] block: Relax restrictions for blockdev-snapshot Kevin Wolf
                   ` (6 subsequent siblings)
  7 siblings, 1 reply; 16+ messages in thread
From: Kevin Wolf @ 2020-03-10 11:38 UTC (permalink / raw)
  To: qemu-block; +Cc: kwolf, pkrempa, qemu-devel, mreitz

Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
 include/block/block_int.h | 3 +++
 block.c                   | 6 ++----
 2 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/include/block/block_int.h b/include/block/block_int.h
index f422c0bff0..71164c4ee1 100644
--- a/include/block/block_int.h
+++ b/include/block/block_int.h
@@ -1226,6 +1226,9 @@ BdrvChild *bdrv_root_attach_child(BlockDriverState *child_bs,
                                   void *opaque, Error **errp);
 void bdrv_root_unref_child(BdrvChild *child);
 
+void bdrv_get_cumulative_perm(BlockDriverState *bs, uint64_t *perm,
+                              uint64_t *shared_perm);
+
 /**
  * Sets a BdrvChild's permissions.  Avoid if the parent is a BDS; use
  * bdrv_child_refresh_perms() instead and make the parent's
diff --git a/block.c b/block.c
index 957630b1c5..79a5a2770f 100644
--- a/block.c
+++ b/block.c
@@ -1872,8 +1872,6 @@ static int bdrv_child_check_perm(BdrvChild *c, BlockReopenQueue *q,
                                  bool *tighten_restrictions, Error **errp);
 static void bdrv_child_abort_perm_update(BdrvChild *c);
 static void bdrv_child_set_perm(BdrvChild *c, uint64_t perm, uint64_t shared);
-static void bdrv_get_cumulative_perm(BlockDriverState *bs, uint64_t *perm,
-                                     uint64_t *shared_perm);
 
 typedef struct BlockReopenQueueEntry {
      bool prepared;
@@ -2097,8 +2095,8 @@ static void bdrv_set_perm(BlockDriverState *bs, uint64_t cumulative_perms,
     }
 }
 
-static void bdrv_get_cumulative_perm(BlockDriverState *bs, uint64_t *perm,
-                                     uint64_t *shared_perm)
+void bdrv_get_cumulative_perm(BlockDriverState *bs, uint64_t *perm,
+                              uint64_t *shared_perm)
 {
     BdrvChild *c;
     uint64_t cumulative_perms = 0;
-- 
2.20.1



^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH v2 2/7] block: Relax restrictions for blockdev-snapshot
  2020-03-10 11:38 [PATCH v2 0/7] block: Relax restrictions for blockdev-snapshot Kevin Wolf
  2020-03-10 11:38 ` [PATCH v2 1/7] block: Make bdrv_get_cumulative_perm() public Kevin Wolf
@ 2020-03-10 11:38 ` Kevin Wolf
  2020-03-10 13:15   ` Peter Krempa
  2020-03-10 11:38 ` [PATCH v2 3/7] iotests: Fix run_job() with use_log=False Kevin Wolf
                   ` (5 subsequent siblings)
  7 siblings, 1 reply; 16+ messages in thread
From: Kevin Wolf @ 2020-03-10 11:38 UTC (permalink / raw)
  To: qemu-block; +Cc: kwolf, pkrempa, qemu-devel, mreitz

blockdev-snapshot returned an error if the overlay was already in use,
which it defined as having any BlockBackend parent. This is in fact both
too strict (some parents can tolerate the change of visible data caused
by attaching a backing file) and too loose (some non-BlockBackend
parents may not be happy with it).

One important use case that is prevented by the too strict check is live
storage migration with blockdev-mirror. Here, the target node is
usually opened without a backing file so that the active layer is
mirrored while its backing chain can be copied in the background.

The backing chain should be attached to the mirror target node when
finalising the job, just before switching the users of the source node
to the new copy (at which point the mirror job still has a reference to
the node). drive-mirror did this automatically, but with blockdev-mirror
this is the job of the QMP client, so it needs a way to do this.

blockdev-snapshot is the obvious way, so this patch makes it work in
this scenario. The new condition is that no parent uses CONSISTENT_READ
permissions. This will ensure that the operation will still be blocked
when the node is attached to the guest device, so blockdev-snapshot
remains safe.

(For the sake of completeness, x-blockdev-reopen can be used to achieve
the same, however it is a big hammer, performs the graph change
completely unchecked and is still experimental. So even with the option
of using x-blockdev-reopen, there are reasons why blockdev-snapshot
should be able to perform this operation.)

Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
 blockdev.c                 | 14 ++++++++------
 tests/qemu-iotests/085.out |  4 ++--
 2 files changed, 10 insertions(+), 8 deletions(-)

diff --git a/blockdev.c b/blockdev.c
index 3e44fa766b..bba0e9775b 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -1501,6 +1501,7 @@ static void external_snapshot_prepare(BlkActionState *common,
     TransactionAction *action = common->action;
     AioContext *aio_context;
     AioContext *old_context;
+    uint64_t perm, shared;
     int ret;
 
     /* 'blockdev-snapshot' and 'blockdev-snapshot-sync' have similar
@@ -1616,16 +1617,17 @@ static void external_snapshot_prepare(BlkActionState *common,
         goto out;
     }
 
-    if (bdrv_has_blk(state->new_bs)) {
+    /*
+     * Allow attaching a backing file to an overlay that's already in use only
+     * if the parents don't assume that they are already seeing a valid image.
+     * (Specifically, allow it as a mirror target, which is write-only access.)
+     */
+    bdrv_get_cumulative_perm(state->new_bs, &perm, &shared);
+    if (perm & BLK_PERM_CONSISTENT_READ) {
         error_setg(errp, "The overlay is already in use");
         goto out;
     }
 
-    if (bdrv_op_is_blocked(state->new_bs, BLOCK_OP_TYPE_EXTERNAL_SNAPSHOT,
-                           errp)) {
-        goto out;
-    }
-
     if (state->new_bs->backing != NULL) {
         error_setg(errp, "The overlay already has a backing image");
         goto out;
diff --git a/tests/qemu-iotests/085.out b/tests/qemu-iotests/085.out
index d94ad22f70..fd11aae678 100644
--- a/tests/qemu-iotests/085.out
+++ b/tests/qemu-iotests/085.out
@@ -82,7 +82,7 @@ Formatting 'TEST_DIR/12-snapshot-v0.IMGFMT', fmt=IMGFMT size=134217728 backing_f
 === Invalid command - cannot create a snapshot using a file BDS ===
 
 { 'execute': 'blockdev-snapshot', 'arguments': { 'node':'virtio0', 'overlay':'file_12' } }
-{"error": {"class": "GenericError", "desc": "The overlay does not support backing images"}}
+{"error": {"class": "GenericError", "desc": "The overlay is already in use"}}
 
 === Invalid command - snapshot node used as active layer ===
 
@@ -96,7 +96,7 @@ Formatting 'TEST_DIR/12-snapshot-v0.IMGFMT', fmt=IMGFMT size=134217728 backing_f
 === Invalid command - snapshot node used as backing hd ===
 
 { 'execute': 'blockdev-snapshot', 'arguments': { 'node': 'virtio0', 'overlay':'snap_11' } }
-{"error": {"class": "GenericError", "desc": "Node 'snap_11' is busy: node is used as backing hd of 'snap_12'"}}
+{"error": {"class": "GenericError", "desc": "The overlay is already in use"}}
 
 === Invalid command - snapshot node has a backing image ===
 
-- 
2.20.1



^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH v2 3/7] iotests: Fix run_job() with use_log=False
  2020-03-10 11:38 [PATCH v2 0/7] block: Relax restrictions for blockdev-snapshot Kevin Wolf
  2020-03-10 11:38 ` [PATCH v2 1/7] block: Make bdrv_get_cumulative_perm() public Kevin Wolf
  2020-03-10 11:38 ` [PATCH v2 2/7] block: Relax restrictions for blockdev-snapshot Kevin Wolf
@ 2020-03-10 11:38 ` Kevin Wolf
  2020-03-10 13:16   ` Peter Krempa
  2020-03-10 11:38 ` [PATCH v2 4/7] iotests: Test mirror with temporarily disabled target backing file Kevin Wolf
                   ` (4 subsequent siblings)
  7 siblings, 1 reply; 16+ messages in thread
From: Kevin Wolf @ 2020-03-10 11:38 UTC (permalink / raw)
  To: qemu-block; +Cc: kwolf, pkrempa, qemu-devel, mreitz

The 'job-complete' QMP command should be run with qmp() rather than
qmp_log() if use_log=False is passed.

Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
 tests/qemu-iotests/iotests.py | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/tests/qemu-iotests/iotests.py b/tests/qemu-iotests/iotests.py
index 8815052eb5..23043baa26 100644
--- a/tests/qemu-iotests/iotests.py
+++ b/tests/qemu-iotests/iotests.py
@@ -624,7 +624,10 @@ class VM(qtest.QEMUQtestMachine):
                         if use_log:
                             log('Job failed: %s' % (j['error']))
             elif status == 'ready':
-                self.qmp_log('job-complete', id=job)
+                if use_log:
+                    self.qmp_log('job-complete', id=job)
+                else:
+                    self.qmp('job-complete', id=job)
             elif status == 'pending' and not auto_finalize:
                 if pre_finalize:
                     pre_finalize()
-- 
2.20.1



^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH v2 4/7] iotests: Test mirror with temporarily disabled target backing file
  2020-03-10 11:38 [PATCH v2 0/7] block: Relax restrictions for blockdev-snapshot Kevin Wolf
                   ` (2 preceding siblings ...)
  2020-03-10 11:38 ` [PATCH v2 3/7] iotests: Fix run_job() with use_log=False Kevin Wolf
@ 2020-03-10 11:38 ` Kevin Wolf
  2020-03-10 13:25   ` Peter Krempa
  2020-03-10 11:38 ` [PATCH v2 5/7] block: Fix cross-AioContext blockdev-snapshot Kevin Wolf
                   ` (3 subsequent siblings)
  7 siblings, 1 reply; 16+ messages in thread
From: Kevin Wolf @ 2020-03-10 11:38 UTC (permalink / raw)
  To: qemu-block; +Cc: kwolf, pkrempa, qemu-devel, mreitz

The newly tested scenario is a common live storage migration scenario:
The target node is opened without a backing file so that the active
layer is mirrored while its backing chain can be copied in the
background.

The backing chain should be attached to the mirror target node when
finalising the job, just before switching the users of the source node
to the new copy (at which point the mirror job still has a reference to
the node). drive-mirror did this automatically, but with blockdev-mirror
this is the job of the QMP client.

This patch adds test cases for two ways to achieve the desired result,
using either x-blockdev-reopen or blockdev-snapshot.

Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
 tests/qemu-iotests/155     | 56 ++++++++++++++++++++++++++++++++++----
 tests/qemu-iotests/155.out |  4 +--
 2 files changed, 53 insertions(+), 7 deletions(-)

diff --git a/tests/qemu-iotests/155 b/tests/qemu-iotests/155
index f237868710..74ddefc849 100755
--- a/tests/qemu-iotests/155
+++ b/tests/qemu-iotests/155
@@ -45,10 +45,15 @@ target_img = os.path.join(iotests.test_dir, 'target.' + iotests.imgfmt)
 #                      image during runtime, only makes sense if
 #                      target_blockdev_backing is not None
 #                      (None: same as target_backing)
+# target_open_with_backing: If True, the target image is added with its backing
+#                           chain opened right away. If False, blockdev-add
+#                           opens it without a backing file and job completion
+#                           is supposed to open the backing chain.
 
 class BaseClass(iotests.QMPTestCase):
     target_blockdev_backing = None
     target_real_backing = None
+    target_open_with_backing = True
 
     def setUp(self):
         qemu_img('create', '-f', iotests.imgfmt, back0_img, '1440K')
@@ -80,9 +85,13 @@ class BaseClass(iotests.QMPTestCase):
                 options = { 'node-name': 'target',
                             'driver': iotests.imgfmt,
                             'file': { 'driver': 'file',
+                                      'node-name': 'target-file',
                                       'filename': target_img } }
-                if self.target_blockdev_backing:
-                    options['backing'] = self.target_blockdev_backing
+
+                if not self.target_open_with_backing:
+                        options['backing'] = None
+                elif self.target_blockdev_backing:
+                        options['backing'] = self.target_blockdev_backing
 
                 result = self.vm.qmp('blockdev-add', **options)
                 self.assert_qmp(result, 'return', {})
@@ -147,10 +156,14 @@ class BaseClass(iotests.QMPTestCase):
 # cmd: Mirroring command to execute, either drive-mirror or blockdev-mirror
 
 class MirrorBaseClass(BaseClass):
+    def openBacking(self):
+        pass
+
     def runMirror(self, sync):
         if self.cmd == 'blockdev-mirror':
             result = self.vm.qmp(self.cmd, job_id='mirror-job', device='source',
-                                 sync=sync, target='target')
+                                 sync=sync, target='target',
+                                 auto_finalize=False)
         else:
             if self.existing:
                 mode = 'existing'
@@ -159,11 +172,12 @@ class MirrorBaseClass(BaseClass):
             result = self.vm.qmp(self.cmd, job_id='mirror-job', device='source',
                                  sync=sync, target=target_img,
                                  format=iotests.imgfmt, mode=mode,
-                                 node_name='target')
+                                 node_name='target', auto_finalize=False)
 
         self.assert_qmp(result, 'return', {})
 
-        self.complete_and_wait('mirror-job')
+        self.vm.run_job('mirror-job', use_log=False, auto_finalize=False,
+                        pre_finalize=self.openBacking, auto_dismiss=True)
 
     def testFull(self):
         self.runMirror('full')
@@ -221,6 +235,38 @@ class TestBlockdevMirrorForcedBacking(MirrorBaseClass):
     target_blockdev_backing = { 'driver': 'null-co' }
     target_real_backing = 'null-co://'
 
+# Attach the backing chain only during completion, with blockdev-reopen
+class TestBlockdevMirrorReopen(MirrorBaseClass):
+    cmd = 'blockdev-mirror'
+    existing = True
+    target_backing = 'null-co://'
+    target_open_with_backing = False
+
+    def openBacking(self):
+        if not self.target_open_with_backing:
+            result = self.vm.qmp('blockdev-add', node_name="backing",
+                                 driver="null-co")
+            self.assert_qmp(result, 'return', {})
+            result = self.vm.qmp('x-blockdev-reopen', node_name="target",
+                                 driver=iotests.imgfmt, file="target-file",
+                                 backing="backing")
+            self.assert_qmp(result, 'return', {})
+
+# Attach the backing chain only during completion, with blockdev-snapshot
+class TestBlockdevMirrorSnapshot(MirrorBaseClass):
+    cmd = 'blockdev-mirror'
+    existing = True
+    target_backing = 'null-co://'
+    target_open_with_backing = False
+
+    def openBacking(self):
+        if not self.target_open_with_backing:
+            result = self.vm.qmp('blockdev-add', node_name="backing",
+                                 driver="null-co")
+            self.assert_qmp(result, 'return', {})
+            result = self.vm.qmp('blockdev-snapshot', node="backing",
+                                 overlay="target")
+            self.assert_qmp(result, 'return', {})
 
 class TestCommit(BaseClass):
     existing = False
diff --git a/tests/qemu-iotests/155.out b/tests/qemu-iotests/155.out
index 4176bb9402..4fd1c2dcd2 100644
--- a/tests/qemu-iotests/155.out
+++ b/tests/qemu-iotests/155.out
@@ -1,5 +1,5 @@
-...................
+.........................
 ----------------------------------------------------------------------
-Ran 19 tests
+Ran 25 tests
 
 OK
-- 
2.20.1



^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH v2 5/7] block: Fix cross-AioContext blockdev-snapshot
  2020-03-10 11:38 [PATCH v2 0/7] block: Relax restrictions for blockdev-snapshot Kevin Wolf
                   ` (3 preceding siblings ...)
  2020-03-10 11:38 ` [PATCH v2 4/7] iotests: Test mirror with temporarily disabled target backing file Kevin Wolf
@ 2020-03-10 11:38 ` Kevin Wolf
  2020-03-10 13:27   ` Peter Krempa
  2020-03-10 11:38 ` [PATCH v2 6/7] iotests: Add iothread cases to 155 Kevin Wolf
                   ` (2 subsequent siblings)
  7 siblings, 1 reply; 16+ messages in thread
From: Kevin Wolf @ 2020-03-10 11:38 UTC (permalink / raw)
  To: qemu-block; +Cc: kwolf, pkrempa, qemu-devel, mreitz

external_snapshot_prepare() tries to move the overlay to the AioContext
of the backing file (the snapshotted node). However, it's possible that
this doesn't work, but the backing file can instead be moved to the
overlay's AioContext (e.g. opening the backing chain for a mirror
target).

bdrv_append() already indirectly uses bdrv_attach_node(), which takes
care to move nodes to make sure they use the same AioContext and which
tries both directions.

So the problem has a simple fix: Just delete the unnecessary extra
bdrv_try_set_aio_context() call in external_snapshot_prepare() and
instead assert in bdrv_append() that both nodes were indeed moved to the
same AioContext.

Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
 block.c    |  1 +
 blockdev.c | 16 ----------------
 2 files changed, 1 insertion(+), 16 deletions(-)

diff --git a/block.c b/block.c
index 79a5a2770f..8fc7b56937 100644
--- a/block.c
+++ b/block.c
@@ -4365,6 +4365,7 @@ void bdrv_replace_node(BlockDriverState *from, BlockDriverState *to,
     bdrv_ref(from);
 
     assert(qemu_get_current_aio_context() == qemu_get_aio_context());
+    assert(bdrv_get_aio_context(from) == bdrv_get_aio_context(to));
     bdrv_drained_begin(from);
 
     /* Put all parents into @list and calculate their cumulative permissions */
diff --git a/blockdev.c b/blockdev.c
index bba0e9775b..95a0b53d57 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -1500,9 +1500,7 @@ static void external_snapshot_prepare(BlkActionState *common,
                              DO_UPCAST(ExternalSnapshotState, common, common);
     TransactionAction *action = common->action;
     AioContext *aio_context;
-    AioContext *old_context;
     uint64_t perm, shared;
-    int ret;
 
     /* 'blockdev-snapshot' and 'blockdev-snapshot-sync' have similar
      * purpose but a different set of parameters */
@@ -1638,20 +1636,6 @@ static void external_snapshot_prepare(BlkActionState *common,
         goto out;
     }
 
-    /* Honor bdrv_try_set_aio_context() context acquisition requirements. */
-    old_context = bdrv_get_aio_context(state->new_bs);
-    aio_context_release(aio_context);
-    aio_context_acquire(old_context);
-
-    ret = bdrv_try_set_aio_context(state->new_bs, aio_context, errp);
-
-    aio_context_release(old_context);
-    aio_context_acquire(aio_context);
-
-    if (ret < 0) {
-        goto out;
-    }
-
     /* This removes our old bs and adds the new bs. This is an operation that
      * can fail, so we need to do it in .prepare; undoing it for abort is
      * always possible. */
-- 
2.20.1



^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH v2 6/7] iotests: Add iothread cases to 155
  2020-03-10 11:38 [PATCH v2 0/7] block: Relax restrictions for blockdev-snapshot Kevin Wolf
                   ` (4 preceding siblings ...)
  2020-03-10 11:38 ` [PATCH v2 5/7] block: Fix cross-AioContext blockdev-snapshot Kevin Wolf
@ 2020-03-10 11:38 ` Kevin Wolf
  2020-03-10 13:28   ` Peter Krempa
  2020-03-10 11:38 ` [PATCH v2 7/7] qapi: Add '@allow-write-only-overlay' feature for 'blockdev-snapshot' Kevin Wolf
  2020-03-10 17:43 ` [PATCH v2 0/7] block: Relax restrictions for blockdev-snapshot Kevin Wolf
  7 siblings, 1 reply; 16+ messages in thread
From: Kevin Wolf @ 2020-03-10 11:38 UTC (permalink / raw)
  To: qemu-block; +Cc: kwolf, pkrempa, qemu-devel, mreitz

This patch adds test cases for attaching the backing chain to a mirror
job target right before finalising the job, where the image is in a
non-mainloop AioContext (i.e. the backing chain needs to be moved to the
AioContext of the mirror target).

This requires switching the test case from virtio-blk to virtio-scsi
because virtio-blk only actually starts using the iothreads when the
guest driver initialises the device (which never happens in a test case
without a guest OS). virtio-scsi always keeps its block nodes in the
AioContext of the the requested iothread without guest interaction.

Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
 tests/qemu-iotests/155     | 32 +++++++++++++++++++++++---------
 tests/qemu-iotests/155.out |  4 ++--
 2 files changed, 25 insertions(+), 11 deletions(-)

diff --git a/tests/qemu-iotests/155 b/tests/qemu-iotests/155
index 74ddefc849..571bce9de4 100755
--- a/tests/qemu-iotests/155
+++ b/tests/qemu-iotests/155
@@ -49,11 +49,14 @@ target_img = os.path.join(iotests.test_dir, 'target.' + iotests.imgfmt)
 #                           chain opened right away. If False, blockdev-add
 #                           opens it without a backing file and job completion
 #                           is supposed to open the backing chain.
+# use_iothread: If True, an iothread is configured for the virtio-blk device
+#               that uses the image being mirrored
 
 class BaseClass(iotests.QMPTestCase):
     target_blockdev_backing = None
     target_real_backing = None
     target_open_with_backing = True
+    use_iothread = False
 
     def setUp(self):
         qemu_img('create', '-f', iotests.imgfmt, back0_img, '1440K')
@@ -69,7 +72,16 @@ class BaseClass(iotests.QMPTestCase):
                     'file': {'driver': 'file',
                              'filename': source_img}}
         self.vm.add_blockdev(self.vm.qmp_to_opts(blockdev))
-        self.vm.add_device('virtio-blk,id=qdev0,drive=source')
+
+        if self.use_iothread:
+            self.vm.add_object('iothread,id=iothread0')
+            iothread = ",iothread=iothread0"
+        else:
+            iothread = ""
+
+        self.vm.add_device('virtio-scsi%s' % iothread)
+        self.vm.add_device('scsi-hd,id=qdev0,drive=source')
+
         self.vm.launch()
 
         self.assertIntactSourceBackingChain()
@@ -182,24 +194,21 @@ class MirrorBaseClass(BaseClass):
     def testFull(self):
         self.runMirror('full')
 
-        node = self.findBlockNode('target',
-                                  '/machine/peripheral/qdev0/virtio-backend')
+        node = self.findBlockNode('target', 'qdev0')
         self.assertCorrectBackingImage(node, None)
         self.assertIntactSourceBackingChain()
 
     def testTop(self):
         self.runMirror('top')
 
-        node = self.findBlockNode('target',
-                                  '/machine/peripheral/qdev0/virtio-backend')
+        node = self.findBlockNode('target', 'qdev0')
         self.assertCorrectBackingImage(node, back2_img)
         self.assertIntactSourceBackingChain()
 
     def testNone(self):
         self.runMirror('none')
 
-        node = self.findBlockNode('target',
-                                  '/machine/peripheral/qdev0/virtio-backend')
+        node = self.findBlockNode('target', 'qdev0')
         self.assertCorrectBackingImage(node, source_img)
         self.assertIntactSourceBackingChain()
 
@@ -252,6 +261,9 @@ class TestBlockdevMirrorReopen(MirrorBaseClass):
                                  backing="backing")
             self.assert_qmp(result, 'return', {})
 
+class TestBlockdevMirrorReopenIothread(TestBlockdevMirrorReopen):
+    use_iothread = True
+
 # Attach the backing chain only during completion, with blockdev-snapshot
 class TestBlockdevMirrorSnapshot(MirrorBaseClass):
     cmd = 'blockdev-mirror'
@@ -268,6 +280,9 @@ class TestBlockdevMirrorSnapshot(MirrorBaseClass):
                                  overlay="target")
             self.assert_qmp(result, 'return', {})
 
+class TestBlockdevMirrorSnapshotIothread(TestBlockdevMirrorSnapshot):
+    use_iothread = True
+
 class TestCommit(BaseClass):
     existing = False
 
@@ -283,8 +298,7 @@ class TestCommit(BaseClass):
 
         self.vm.event_wait('BLOCK_JOB_COMPLETED')
 
-        node = self.findBlockNode(None,
-                                  '/machine/peripheral/qdev0/virtio-backend')
+        node = self.findBlockNode(None, 'qdev0')
         self.assert_qmp(node, 'image' + '/backing-image' * 0 + '/filename',
                         back1_img)
         self.assert_qmp(node, 'image' + '/backing-image' * 1 + '/filename',
diff --git a/tests/qemu-iotests/155.out b/tests/qemu-iotests/155.out
index 4fd1c2dcd2..ed714d5263 100644
--- a/tests/qemu-iotests/155.out
+++ b/tests/qemu-iotests/155.out
@@ -1,5 +1,5 @@
-.........................
+...............................
 ----------------------------------------------------------------------
-Ran 25 tests
+Ran 31 tests
 
 OK
-- 
2.20.1



^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH v2 7/7] qapi: Add '@allow-write-only-overlay' feature for 'blockdev-snapshot'
  2020-03-10 11:38 [PATCH v2 0/7] block: Relax restrictions for blockdev-snapshot Kevin Wolf
                   ` (5 preceding siblings ...)
  2020-03-10 11:38 ` [PATCH v2 6/7] iotests: Add iothread cases to 155 Kevin Wolf
@ 2020-03-10 11:38 ` Kevin Wolf
  2020-03-10 17:43 ` [PATCH v2 0/7] block: Relax restrictions for blockdev-snapshot Kevin Wolf
  7 siblings, 0 replies; 16+ messages in thread
From: Kevin Wolf @ 2020-03-10 11:38 UTC (permalink / raw)
  To: qemu-block; +Cc: kwolf, pkrempa, qemu-devel, mreitz

From: Peter Krempa <pkrempa@redhat.com>

Anounce that 'blockdev-snapshot' command's permissions allow changing
of the backing file if the 'consistent_read' permission is not required.

This is useful for libvirt to allow late opening of the backing chain
during a blockdev-mirror.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
 qapi/block-core.json | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/qapi/block-core.json b/qapi/block-core.json
index 9758fc48d2..91586fb1fb 100644
--- a/qapi/block-core.json
+++ b/qapi/block-core.json
@@ -1472,6 +1472,12 @@
 #
 # For the arguments, see the documentation of BlockdevSnapshot.
 #
+# Features:
+# @allow-write-only-overlay: If present, the check whether this operation is safe
+#                            was relaxed so that it can be used to change
+#                            backing file of a destination of a blockdev-mirror.
+#                            (since 5.0)
+#
 # Since: 2.5
 #
 # Example:
@@ -1492,7 +1498,8 @@
 #
 ##
 { 'command': 'blockdev-snapshot',
-  'data': 'BlockdevSnapshot' }
+  'data': 'BlockdevSnapshot',
+  'features': [ 'allow-write-only-overlay' ] }
 
 ##
 # @change-backing-file:
-- 
2.20.1



^ permalink raw reply related	[flat|nested] 16+ messages in thread

* Re: [PATCH v2 1/7] block: Make bdrv_get_cumulative_perm() public
  2020-03-10 11:38 ` [PATCH v2 1/7] block: Make bdrv_get_cumulative_perm() public Kevin Wolf
@ 2020-03-10 13:10   ` Peter Krempa
  0 siblings, 0 replies; 16+ messages in thread
From: Peter Krempa @ 2020-03-10 13:10 UTC (permalink / raw)
  To: Kevin Wolf; +Cc: qemu-devel, qemu-block, mreitz

On Tue, Mar 10, 2020 at 12:38:25 +0100, Kevin Wolf wrote:
> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
> ---
>  include/block/block_int.h | 3 +++
>  block.c                   | 6 ++----
>  2 files changed, 5 insertions(+), 4 deletions(-)

Reviewed-by: Peter Krempa <pkrempa@redhat.com>



^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH v2 2/7] block: Relax restrictions for blockdev-snapshot
  2020-03-10 11:38 ` [PATCH v2 2/7] block: Relax restrictions for blockdev-snapshot Kevin Wolf
@ 2020-03-10 13:15   ` Peter Krempa
  2020-03-10 13:27     ` Kevin Wolf
  0 siblings, 1 reply; 16+ messages in thread
From: Peter Krempa @ 2020-03-10 13:15 UTC (permalink / raw)
  To: Kevin Wolf; +Cc: qemu-devel, qemu-block, mreitz

On Tue, Mar 10, 2020 at 12:38:26 +0100, Kevin Wolf wrote:
> blockdev-snapshot returned an error if the overlay was already in use,
> which it defined as having any BlockBackend parent. This is in fact both
> too strict (some parents can tolerate the change of visible data caused
> by attaching a backing file) and too loose (some non-BlockBackend
> parents may not be happy with it).
> 
> One important use case that is prevented by the too strict check is live
> storage migration with blockdev-mirror. Here, the target node is
> usually opened without a backing file so that the active layer is
> mirrored while its backing chain can be copied in the background.
> 
> The backing chain should be attached to the mirror target node when
> finalising the job, just before switching the users of the source node
> to the new copy (at which point the mirror job still has a reference to
> the node). drive-mirror did this automatically, but with blockdev-mirror
> this is the job of the QMP client, so it needs a way to do this.
> 
> blockdev-snapshot is the obvious way, so this patch makes it work in
> this scenario. The new condition is that no parent uses CONSISTENT_READ
> permissions. This will ensure that the operation will still be blocked
> when the node is attached to the guest device, so blockdev-snapshot
> remains safe.
> 
> (For the sake of completeness, x-blockdev-reopen can be used to achieve
> the same, however it is a big hammer, performs the graph change
> completely unchecked and is still experimental. So even with the option
> of using x-blockdev-reopen, there are reasons why blockdev-snapshot
> should be able to perform this operation.)
> 
> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
> ---
>  blockdev.c                 | 14 ++++++++------
>  tests/qemu-iotests/085.out |  4 ++--
>  2 files changed, 10 insertions(+), 8 deletions(-)
> 
> diff --git a/blockdev.c b/blockdev.c
> index 3e44fa766b..bba0e9775b 100644
> --- a/blockdev.c
> +++ b/blockdev.c
> @@ -1501,6 +1501,7 @@ static void external_snapshot_prepare(BlkActionState *common,
>      TransactionAction *action = common->action;
>      AioContext *aio_context;
>      AioContext *old_context;
> +    uint64_t perm, shared;
>      int ret;
>  
>      /* 'blockdev-snapshot' and 'blockdev-snapshot-sync' have similar
> @@ -1616,16 +1617,17 @@ static void external_snapshot_prepare(BlkActionState *common,
>          goto out;
>      }
>  
> -    if (bdrv_has_blk(state->new_bs)) {
> +    /*
> +     * Allow attaching a backing file to an overlay that's already in use only
> +     * if the parents don't assume that they are already seeing a valid image.
> +     * (Specifically, allow it as a mirror target, which is write-only access.)
> +     */
> +    bdrv_get_cumulative_perm(state->new_bs, &perm, &shared);
> +    if (perm & BLK_PERM_CONSISTENT_READ) {
>          error_setg(errp, "The overlay is already in use");
>          goto out;
>      }

Moving this code a bit further down ...

>  
> -    if (bdrv_op_is_blocked(state->new_bs, BLOCK_OP_TYPE_EXTERNAL_SNAPSHOT,
> -                           errp)) {
> -        goto out;
> -    }
> -
>      if (state->new_bs->backing != NULL) {
>          error_setg(errp, "The overlay already has a backing image");
>          goto out;
> diff --git a/tests/qemu-iotests/085.out b/tests/qemu-iotests/085.out
> index d94ad22f70..fd11aae678 100644
> --- a/tests/qemu-iotests/085.out
> +++ b/tests/qemu-iotests/085.out
> @@ -82,7 +82,7 @@ Formatting 'TEST_DIR/12-snapshot-v0.IMGFMT', fmt=IMGFMT size=134217728 backing_f
>  === Invalid command - cannot create a snapshot using a file BDS ===
>  
>  { 'execute': 'blockdev-snapshot', 'arguments': { 'node':'virtio0', 'overlay':'file_12' } }
> -{"error": {"class": "GenericError", "desc": "The overlay does not support backing images"}}
> +{"error": {"class": "GenericError", "desc": "The overlay is already in use"}}
>  
>  === Invalid command - snapshot node used as active layer ===
>  
> @@ -96,7 +96,7 @@ Formatting 'TEST_DIR/12-snapshot-v0.IMGFMT', fmt=IMGFMT size=134217728 backing_f
>  === Invalid command - snapshot node used as backing hd ===
>  
>  { 'execute': 'blockdev-snapshot', 'arguments': { 'node': 'virtio0', 'overlay':'snap_11' } }
> -{"error": {"class": "GenericError", "desc": "Node 'snap_11' is busy: node is used as backing hd of 'snap_12'"}}
> +{"error": {"class": "GenericError", "desc": "The overlay is already in use"}}

Would probably prevent these test changes.

Reviewed-by: Peter Krempa <pkrempa@redhat.com>
Tested-by: Peter Krempa <pkrempa@redhat.com>



^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH v2 3/7] iotests: Fix run_job() with use_log=False
  2020-03-10 11:38 ` [PATCH v2 3/7] iotests: Fix run_job() with use_log=False Kevin Wolf
@ 2020-03-10 13:16   ` Peter Krempa
  0 siblings, 0 replies; 16+ messages in thread
From: Peter Krempa @ 2020-03-10 13:16 UTC (permalink / raw)
  To: Kevin Wolf; +Cc: qemu-devel, qemu-block, mreitz

On Tue, Mar 10, 2020 at 12:38:27 +0100, Kevin Wolf wrote:
> The 'job-complete' QMP command should be run with qmp() rather than
> qmp_log() if use_log=False is passed.
> 
> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
> ---
>  tests/qemu-iotests/iotests.py | 5 ++++-
>  1 file changed, 4 insertions(+), 1 deletion(-)

Reviewed-by: Peter Krempa <pkrempa@redhat.com>



^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH v2 4/7] iotests: Test mirror with temporarily disabled target backing file
  2020-03-10 11:38 ` [PATCH v2 4/7] iotests: Test mirror with temporarily disabled target backing file Kevin Wolf
@ 2020-03-10 13:25   ` Peter Krempa
  0 siblings, 0 replies; 16+ messages in thread
From: Peter Krempa @ 2020-03-10 13:25 UTC (permalink / raw)
  To: Kevin Wolf; +Cc: qemu-devel, qemu-block, mreitz

On Tue, Mar 10, 2020 at 12:38:28 +0100, Kevin Wolf wrote:
> The newly tested scenario is a common live storage migration scenario:
> The target node is opened without a backing file so that the active
> layer is mirrored while its backing chain can be copied in the
> background.
> 
> The backing chain should be attached to the mirror target node when
> finalising the job, just before switching the users of the source node
> to the new copy (at which point the mirror job still has a reference to
> the node). drive-mirror did this automatically, but with blockdev-mirror
> this is the job of the QMP client.
> 
> This patch adds test cases for two ways to achieve the desired result,
> using either x-blockdev-reopen or blockdev-snapshot.
> 
> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
> ---
>  tests/qemu-iotests/155     | 56 ++++++++++++++++++++++++++++++++++----
>  tests/qemu-iotests/155.out |  4 +--
>  2 files changed, 53 insertions(+), 7 deletions(-)

Reviewed-by: Peter Krempa <pkrempa@redhat.com>



^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH v2 5/7] block: Fix cross-AioContext blockdev-snapshot
  2020-03-10 11:38 ` [PATCH v2 5/7] block: Fix cross-AioContext blockdev-snapshot Kevin Wolf
@ 2020-03-10 13:27   ` Peter Krempa
  0 siblings, 0 replies; 16+ messages in thread
From: Peter Krempa @ 2020-03-10 13:27 UTC (permalink / raw)
  To: Kevin Wolf; +Cc: qemu-devel, qemu-block, mreitz

On Tue, Mar 10, 2020 at 12:38:29 +0100, Kevin Wolf wrote:
> external_snapshot_prepare() tries to move the overlay to the AioContext
> of the backing file (the snapshotted node). However, it's possible that
> this doesn't work, but the backing file can instead be moved to the
> overlay's AioContext (e.g. opening the backing chain for a mirror
> target).
> 
> bdrv_append() already indirectly uses bdrv_attach_node(), which takes
> care to move nodes to make sure they use the same AioContext and which
> tries both directions.
> 
> So the problem has a simple fix: Just delete the unnecessary extra
> bdrv_try_set_aio_context() call in external_snapshot_prepare() and
> instead assert in bdrv_append() that both nodes were indeed moved to the
> same AioContext.
> 
> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
> ---
>  block.c    |  1 +
>  blockdev.c | 16 ----------------
>  2 files changed, 1 insertion(+), 16 deletions(-)

Tested-by: Peter Krempa <pkrempa@redhat.com>

Unfortunately I don't feel confident enough in the intricacies of the
aio contexts. Nevertheless Fixing bugs by deleting code is awesome!



^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH v2 2/7] block: Relax restrictions for blockdev-snapshot
  2020-03-10 13:15   ` Peter Krempa
@ 2020-03-10 13:27     ` Kevin Wolf
  0 siblings, 0 replies; 16+ messages in thread
From: Kevin Wolf @ 2020-03-10 13:27 UTC (permalink / raw)
  To: Peter Krempa; +Cc: qemu-devel, qemu-block, mreitz

Am 10.03.2020 um 14:15 hat Peter Krempa geschrieben:
> On Tue, Mar 10, 2020 at 12:38:26 +0100, Kevin Wolf wrote:
> > blockdev-snapshot returned an error if the overlay was already in use,
> > which it defined as having any BlockBackend parent. This is in fact both
> > too strict (some parents can tolerate the change of visible data caused
> > by attaching a backing file) and too loose (some non-BlockBackend
> > parents may not be happy with it).
> > 
> > One important use case that is prevented by the too strict check is live
> > storage migration with blockdev-mirror. Here, the target node is
> > usually opened without a backing file so that the active layer is
> > mirrored while its backing chain can be copied in the background.
> > 
> > The backing chain should be attached to the mirror target node when
> > finalising the job, just before switching the users of the source node
> > to the new copy (at which point the mirror job still has a reference to
> > the node). drive-mirror did this automatically, but with blockdev-mirror
> > this is the job of the QMP client, so it needs a way to do this.
> > 
> > blockdev-snapshot is the obvious way, so this patch makes it work in
> > this scenario. The new condition is that no parent uses CONSISTENT_READ
> > permissions. This will ensure that the operation will still be blocked
> > when the node is attached to the guest device, so blockdev-snapshot
> > remains safe.
> > 
> > (For the sake of completeness, x-blockdev-reopen can be used to achieve
> > the same, however it is a big hammer, performs the graph change
> > completely unchecked and is still experimental. So even with the option
> > of using x-blockdev-reopen, there are reasons why blockdev-snapshot
> > should be able to perform this operation.)
> > 
> > Signed-off-by: Kevin Wolf <kwolf@redhat.com>
> > ---
> >  blockdev.c                 | 14 ++++++++------
> >  tests/qemu-iotests/085.out |  4 ++--
> >  2 files changed, 10 insertions(+), 8 deletions(-)
> > 
> > diff --git a/blockdev.c b/blockdev.c
> > index 3e44fa766b..bba0e9775b 100644
> > --- a/blockdev.c
> > +++ b/blockdev.c
> > @@ -1501,6 +1501,7 @@ static void external_snapshot_prepare(BlkActionState *common,
> >      TransactionAction *action = common->action;
> >      AioContext *aio_context;
> >      AioContext *old_context;
> > +    uint64_t perm, shared;
> >      int ret;
> >  
> >      /* 'blockdev-snapshot' and 'blockdev-snapshot-sync' have similar
> > @@ -1616,16 +1617,17 @@ static void external_snapshot_prepare(BlkActionState *common,
> >          goto out;
> >      }
> >  
> > -    if (bdrv_has_blk(state->new_bs)) {
> > +    /*
> > +     * Allow attaching a backing file to an overlay that's already in use only
> > +     * if the parents don't assume that they are already seeing a valid image.
> > +     * (Specifically, allow it as a mirror target, which is write-only access.)
> > +     */
> > +    bdrv_get_cumulative_perm(state->new_bs, &perm, &shared);
> > +    if (perm & BLK_PERM_CONSISTENT_READ) {
> >          error_setg(errp, "The overlay is already in use");
> >          goto out;
> >      }
> 
> Moving this code a bit further down ...
> 
> >  
> > -    if (bdrv_op_is_blocked(state->new_bs, BLOCK_OP_TYPE_EXTERNAL_SNAPSHOT,
> > -                           errp)) {
> > -        goto out;
> > -    }
> > -
> >      if (state->new_bs->backing != NULL) {
> >          error_setg(errp, "The overlay already has a backing image");
> >          goto out;
> > diff --git a/tests/qemu-iotests/085.out b/tests/qemu-iotests/085.out
> > index d94ad22f70..fd11aae678 100644
> > --- a/tests/qemu-iotests/085.out
> > +++ b/tests/qemu-iotests/085.out
> > @@ -82,7 +82,7 @@ Formatting 'TEST_DIR/12-snapshot-v0.IMGFMT', fmt=IMGFMT size=134217728 backing_f
> >  === Invalid command - cannot create a snapshot using a file BDS ===
> >  
> >  { 'execute': 'blockdev-snapshot', 'arguments': { 'node':'virtio0', 'overlay':'file_12' } }
> > -{"error": {"class": "GenericError", "desc": "The overlay does not support backing images"}}
> > +{"error": {"class": "GenericError", "desc": "The overlay is already in use"}}
> >  
> >  === Invalid command - snapshot node used as active layer ===
> >  
> > @@ -96,7 +96,7 @@ Formatting 'TEST_DIR/12-snapshot-v0.IMGFMT', fmt=IMGFMT size=134217728 backing_f
> >  === Invalid command - snapshot node used as backing hd ===
> >  
> >  { 'execute': 'blockdev-snapshot', 'arguments': { 'node': 'virtio0', 'overlay':'snap_11' } }
> > -{"error": {"class": "GenericError", "desc": "Node 'snap_11' is busy: node is used as backing hd of 'snap_12'"}}
> > +{"error": {"class": "GenericError", "desc": "The overlay is already in use"}}
> 
> Would probably prevent these test changes.

It would prevent the first one, though I don't think it's important
which of the two checks make it error out.

The second message came from the bdrv_op_is_blocked() that this patch
removes, so this change would be there anyway.

> Reviewed-by: Peter Krempa <pkrempa@redhat.com>
> Tested-by: Peter Krempa <pkrempa@redhat.com>

Thanks!

Kevin



^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH v2 6/7] iotests: Add iothread cases to 155
  2020-03-10 11:38 ` [PATCH v2 6/7] iotests: Add iothread cases to 155 Kevin Wolf
@ 2020-03-10 13:28   ` Peter Krempa
  0 siblings, 0 replies; 16+ messages in thread
From: Peter Krempa @ 2020-03-10 13:28 UTC (permalink / raw)
  To: Kevin Wolf; +Cc: qemu-devel, qemu-block, mreitz

On Tue, Mar 10, 2020 at 12:38:30 +0100, Kevin Wolf wrote:
> This patch adds test cases for attaching the backing chain to a mirror
> job target right before finalising the job, where the image is in a
> non-mainloop AioContext (i.e. the backing chain needs to be moved to the
> AioContext of the mirror target).
> 
> This requires switching the test case from virtio-blk to virtio-scsi
> because virtio-blk only actually starts using the iothreads when the
> guest driver initialises the device (which never happens in a test case
> without a guest OS). virtio-scsi always keeps its block nodes in the
> AioContext of the the requested iothread without guest interaction.
> 
> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
> ---
>  tests/qemu-iotests/155     | 32 +++++++++++++++++++++++---------
>  tests/qemu-iotests/155.out |  4 ++--
>  2 files changed, 25 insertions(+), 11 deletions(-)

Reviewed-by: Peter Krempa <pkrempa@redhat.com>



^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH v2 0/7] block: Relax restrictions for blockdev-snapshot
  2020-03-10 11:38 [PATCH v2 0/7] block: Relax restrictions for blockdev-snapshot Kevin Wolf
                   ` (6 preceding siblings ...)
  2020-03-10 11:38 ` [PATCH v2 7/7] qapi: Add '@allow-write-only-overlay' feature for 'blockdev-snapshot' Kevin Wolf
@ 2020-03-10 17:43 ` Kevin Wolf
  7 siblings, 0 replies; 16+ messages in thread
From: Kevin Wolf @ 2020-03-10 17:43 UTC (permalink / raw)
  To: qemu-block; +Cc: pkrempa, qemu-devel, mreitz

Am 10.03.2020 um 12:38 hat Kevin Wolf geschrieben:
> This series allows libvirt to fix a regression that its switch from
> drive-mirror to blockdev-mirror caused: It currently requires that the
> backing chain of the target image is already available when the mirror
> operation is started.
> 
> In reality, the backing chain may only be copied while the operation is
> in progress, so the backing file of the target image needs to stay
> disabled until the operation completes and should be attached only at
> that point. Without this series, we don't have a supported API to attach
> the backing file at that later point.
> 
> v2:
> - Added a fix and test case for iothreads [Peter]
> - Added a blockdev-snapshot feature flag to indicate that it's usable
>   for attaching a backing chain to an overlay that is already in
>   write-only use (e.g. as a mirror target) [Peter]

Thanks for review and testing, applied to the block branch.

Kevin



^ permalink raw reply	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2020-03-10 17:44 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-03-10 11:38 [PATCH v2 0/7] block: Relax restrictions for blockdev-snapshot Kevin Wolf
2020-03-10 11:38 ` [PATCH v2 1/7] block: Make bdrv_get_cumulative_perm() public Kevin Wolf
2020-03-10 13:10   ` Peter Krempa
2020-03-10 11:38 ` [PATCH v2 2/7] block: Relax restrictions for blockdev-snapshot Kevin Wolf
2020-03-10 13:15   ` Peter Krempa
2020-03-10 13:27     ` Kevin Wolf
2020-03-10 11:38 ` [PATCH v2 3/7] iotests: Fix run_job() with use_log=False Kevin Wolf
2020-03-10 13:16   ` Peter Krempa
2020-03-10 11:38 ` [PATCH v2 4/7] iotests: Test mirror with temporarily disabled target backing file Kevin Wolf
2020-03-10 13:25   ` Peter Krempa
2020-03-10 11:38 ` [PATCH v2 5/7] block: Fix cross-AioContext blockdev-snapshot Kevin Wolf
2020-03-10 13:27   ` Peter Krempa
2020-03-10 11:38 ` [PATCH v2 6/7] iotests: Add iothread cases to 155 Kevin Wolf
2020-03-10 13:28   ` Peter Krempa
2020-03-10 11:38 ` [PATCH v2 7/7] qapi: Add '@allow-write-only-overlay' feature for 'blockdev-snapshot' Kevin Wolf
2020-03-10 17:43 ` [PATCH v2 0/7] block: Relax restrictions for blockdev-snapshot Kevin Wolf

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.