block/mirror.c | 4 ++++ 1 file changed, 4 insertions(+)
If a blockcommit is aborted the base image remains in RW mode, that leads
to a fail of subsequent live migration.
How to reproduce:
$ virsh snapshot-create-as vm snp1 --disk-only
*** write something to the disk ***
$ virsh blockcommit vm vda --active --shallow && virsh blockjob vm vda --abort
$ lsof /vzt/vm.qcow2
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
qemu-syst 433203 root 45u REG 253,0 1724776448 133 /vzt/vm.qcow2
$ cat /proc/433203/fdinfo/45
pos: 0
flags: 02140002
Reopen the base image in RO mode in mirror_exit_common() if the blockjob
is aborted.
Signed-off-by: Alexander Ivanov <alexander.ivanov@virtuozzo.com>
---
block/mirror.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/block/mirror.c b/block/mirror.c
index dcd88de2e3..50a2825b1c 100644
--- a/block/mirror.c
+++ b/block/mirror.c
@@ -789,6 +789,10 @@ static int mirror_exit_common(Job *job)
block_job_remove_all_bdrv(bjob);
bdrv_replace_node(mirror_top_bs, mirror_top_bs->backing->bs, &error_abort);
+ if (abort && !bdrv_is_read_only(target_bs)) {
+ bdrv_reopen_set_read_only(target_bs, true, NULL);
+ }
+
bs_opaque->job = NULL;
bdrv_drained_end(src);
--
2.39.2
On 30.11.23 13:11, Alexander Ivanov wrote: > If a blockcommit is aborted the base image remains in RW mode, that leads > to a fail of subsequent live migration. > > How to reproduce: > $ virsh snapshot-create-as vm snp1 --disk-only > > *** write something to the disk *** > > $ virsh blockcommit vm vda --active --shallow && virsh blockjob vm vda --abort > $ lsof /vzt/vm.qcow2 > COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME > qemu-syst 433203 root 45u REG 253,0 1724776448 133 /vzt/vm.qcow2 > $ cat /proc/433203/fdinfo/45 > pos: 0 > flags: 02140002 > > Reopen the base image in RO mode in mirror_exit_common() if the blockjob > is aborted. > > Signed-off-by: Alexander Ivanov <alexander.ivanov@virtuozzo.com> > --- > block/mirror.c | 4 ++++ > 1 file changed, 4 insertions(+) > > diff --git a/block/mirror.c b/block/mirror.c > index dcd88de2e3..50a2825b1c 100644 > --- a/block/mirror.c > +++ b/block/mirror.c > @@ -789,6 +789,10 @@ static int mirror_exit_common(Job *job) > block_job_remove_all_bdrv(bjob); > bdrv_replace_node(mirror_top_bs, mirror_top_bs->backing->bs, &error_abort); > > + if (abort && !bdrv_is_read_only(target_bs)) { I think, we also should check here, that we did bdrv_reopen_set_read_only(false) at job start (probably we didn't, or we are in mirror job) > + bdrv_reopen_set_read_only(target_bs, true, NULL); > + } > + > bs_opaque->job = NULL; > > bdrv_drained_end(src); -- Best regards, Vladimir
Ping. Could someone please review the code? On 11/30/23 11:11, Alexander Ivanov wrote: > If a blockcommit is aborted the base image remains in RW mode, that leads > to a fail of subsequent live migration. > > How to reproduce: > $ virsh snapshot-create-as vm snp1 --disk-only > > *** write something to the disk *** > > $ virsh blockcommit vm vda --active --shallow && virsh blockjob vm vda --abort > $ lsof /vzt/vm.qcow2 > COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME > qemu-syst 433203 root 45u REG 253,0 1724776448 133 /vzt/vm.qcow2 > $ cat /proc/433203/fdinfo/45 > pos: 0 > flags: 02140002 > > Reopen the base image in RO mode in mirror_exit_common() if the blockjob > is aborted. > > Signed-off-by: Alexander Ivanov <alexander.ivanov@virtuozzo.com> > --- > block/mirror.c | 4 ++++ > 1 file changed, 4 insertions(+) > > diff --git a/block/mirror.c b/block/mirror.c > index dcd88de2e3..50a2825b1c 100644 > --- a/block/mirror.c > +++ b/block/mirror.c > @@ -789,6 +789,10 @@ static int mirror_exit_common(Job *job) > block_job_remove_all_bdrv(bjob); > bdrv_replace_node(mirror_top_bs, mirror_top_bs->backing->bs, &error_abort); > > + if (abort && !bdrv_is_read_only(target_bs)) { > + bdrv_reopen_set_read_only(target_bs, true, NULL); > + } > + > bs_opaque->job = NULL; > > bdrv_drained_end(src); -- Best regards, Alexander Ivanov
© 2016 - 2024 Red Hat, Inc.