block: use bdrv_can_set_read_only() during reopen

Signed-off-by: Jeff Cody <jcody@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Reviewed-by: John Snow <jsnow@redhat.com>
Message-id: 00aed7ffdd7be4b9ed9ce1007d50028a72b34ebe.1491597120.git.jcody@redhat.com
This commit is contained in:
Jeff Cody 2017-04-07 16:55:30 -04:00
parent 45803a0396
commit 3d8ce171cb
1 changed files with 8 additions and 6 deletions

14
block.c
View File

@ -2789,6 +2789,7 @@ int bdrv_reopen_prepare(BDRVReopenState *reopen_state, BlockReopenQueue *queue,
BlockDriver *drv; BlockDriver *drv;
QemuOpts *opts; QemuOpts *opts;
const char *value; const char *value;
bool read_only;
assert(reopen_state != NULL); assert(reopen_state != NULL);
assert(reopen_state->bs->drv != NULL); assert(reopen_state->bs->drv != NULL);
@ -2817,12 +2818,13 @@ int bdrv_reopen_prepare(BDRVReopenState *reopen_state, BlockReopenQueue *queue,
qdict_put(reopen_state->options, "driver", qstring_from_str(value)); qdict_put(reopen_state->options, "driver", qstring_from_str(value));
} }
/* if we are to stay read-only, do not allow permission change /* If we are to stay read-only, do not allow permission change
* to r/w */ * to r/w. Attempting to set to r/w may fail if either BDRV_O_ALLOW_RDWR is
if (!(reopen_state->bs->open_flags & BDRV_O_ALLOW_RDWR) && * not set, or if the BDS still has copy_on_read enabled */
reopen_state->flags & BDRV_O_RDWR) { read_only = !(reopen_state->flags & BDRV_O_RDWR);
error_setg(errp, "Node '%s' is read only", ret = bdrv_can_set_read_only(reopen_state->bs, read_only, &local_err);
bdrv_get_device_or_node_name(reopen_state->bs)); if (local_err) {
error_propagate(errp, local_err);
goto error; goto error;
} }