aboutsummaryrefslogtreecommitdiff
path: root/block/rbd.c
diff options
context:
space:
mode:
authorKevin Wolf <kwolf@redhat.com>2017-05-29 14:08:32 +0200
committerKevin Wolf <kwolf@redhat.com>2017-05-29 15:37:26 +0200
commit63c8ef289087a225d445319d047501d4fe593687 (patch)
treef056c0eefd0c16112218e54f74013ff8c90ebf2f /block/rbd.c
parenta896f7f26a1a0417322463439825073c1a917e41 (diff)
downloadqemu-63c8ef289087a225d445319d047501d4fe593687.zip
qemu-63c8ef289087a225d445319d047501d4fe593687.tar.gz
qemu-63c8ef289087a225d445319d047501d4fe593687.tar.bz2
mirror: Drop permissions on s->target on completion
This fixes an assertion failure that was triggered by qemu-iotests 129 on some CI host, while the same test case didn't seem to fail on other hosts. Essentially the problem is that the blk_unref(s->target) in mirror_exit() doesn't necessarily mean that the BlockBackend goes away immediately. It is possible that the job completion was triggered nested in mirror_drain(), which looks like this: BlockBackend *target = s->target; blk_ref(target); blk_drain(target); blk_unref(target); In this case, the write permissions for s->target are retained until after blk_drain(), which makes removing mirror_top_bs fail for the active commit case (can't have a writable backing file in the chain without the filter driver). Explicitly dropping the permissions first means that the additional reference doesn't hurt and the job can complete successfully even if called from the nested blk_drain(). Cc: qemu-stable@nongnu.org Signed-off-by: Kevin Wolf <kwolf@redhat.com> Acked-by: Paolo Bonzini <pbonzini@redhat.com> Reviewed-by: Max Reitz <mreitz@redhat.com>
Diffstat (limited to 'block/rbd.c')
0 files changed, 0 insertions, 0 deletions