qemu-io: Drop write permissions before read-only reopen
qemu-io provides a 'reopen' command that allows switching from writable to read-only access. We need to make sure that we don't try to keep write permissions to a BlockBackend that becomes read-only, otherwise things are going to fail. This requires a bdrv_drain() call because otherwise in-flight AIO write requests could issue new internal requests while the permission has already gone away, which would cause assertion failures. Draining the queue doesn't break AIO requests in any new way, bdrv_reopen() would drain it anyway only a few lines later. Signed-off-by: Kevin Wolf <kwolf@redhat.com> Reviewed-by: Fam Zheng <famz@redhat.com>
This commit is contained in:
parent
7a6ab45e19
commit
f3adefb2ce
@ -2010,6 +2010,18 @@ static int reopen_f(BlockBackend *blk, int argc, char **argv)
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!(flags & BDRV_O_RDWR)) {
|
||||
uint64_t orig_perm, orig_shared_perm;
|
||||
|
||||
bdrv_drain(bs);
|
||||
|
||||
blk_get_perm(blk, &orig_perm, &orig_shared_perm);
|
||||
blk_set_perm(blk,
|
||||
orig_perm & ~(BLK_PERM_WRITE | BLK_PERM_WRITE_UNCHANGED),
|
||||
orig_shared_perm,
|
||||
&error_abort);
|
||||
}
|
||||
|
||||
qopts = qemu_opts_find(&reopen_opts, NULL);
|
||||
opts = qopts ? qemu_opts_to_qdict(qopts, NULL) : NULL;
|
||||
qemu_opts_reset(&reopen_opts);
|
||||
|
@ -12,7 +12,7 @@ Start from read-write
|
||||
|
||||
wrote 65536/65536 bytes at offset 0
|
||||
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||
write failed: Operation not permitted
|
||||
Block node is read-only
|
||||
wrote 65536/65536 bytes at offset 0
|
||||
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||
*** done
|
||||
|
Loading…
Reference in New Issue
Block a user