blockdev: Don't disable COR automatically with blockdev-add
If a read-only device is configured with copy-on-read=on, the old code only prints a warning and automatically disables copy on read. Make it a real error for blockdev-add. Signed-off-by: Kevin Wolf <kwolf@redhat.com> Reviewed-by: Max Reitz <mreitz@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com>
This commit is contained in:
parent
e34ef04641
commit
0ebd24e0a2
7
block.c
7
block.c
@ -778,8 +778,13 @@ static int bdrv_open_common(BlockDriverState *bs, BlockDriverState *file,
|
||||
}
|
||||
|
||||
assert(bs->copy_on_read == 0); /* bdrv_new() and bdrv_close() make it so */
|
||||
if (!bs->read_only && (flags & BDRV_O_COPY_ON_READ)) {
|
||||
if (flags & BDRV_O_COPY_ON_READ) {
|
||||
if (!bs->read_only) {
|
||||
bdrv_enable_copy_on_read(bs);
|
||||
} else {
|
||||
error_setg(errp, "Can't use copy-on-read on read-only device");
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
if (filename != NULL) {
|
||||
|
31
blockdev.c
31
blockdev.c
@ -510,10 +510,6 @@ static DriveInfo *blockdev_init(QDict *bs_opts,
|
||||
|
||||
bdrv_flags |= ro ? 0 : BDRV_O_RDWR;
|
||||
|
||||
if (ro && copy_on_read) {
|
||||
error_report("warning: disabling copy_on_read on read-only drive");
|
||||
}
|
||||
|
||||
QINCREF(bs_opts);
|
||||
ret = bdrv_open(dinfo->bdrv, file, bs_opts, bdrv_flags, drv, &error);
|
||||
|
||||
@ -601,6 +597,18 @@ QemuOptsList qemu_legacy_drive_opts = {
|
||||
.type = QEMU_OPT_STRING,
|
||||
.help = "pci address (virtio only)",
|
||||
},
|
||||
|
||||
/* Options that are passed on, but have special semantics with -drive */
|
||||
{
|
||||
.name = "read-only",
|
||||
.type = QEMU_OPT_BOOL,
|
||||
.help = "open drive file as read-only",
|
||||
},{
|
||||
.name = "copy-on-read",
|
||||
.type = QEMU_OPT_BOOL,
|
||||
.help = "copy read data from backing file into image file",
|
||||
},
|
||||
|
||||
{ /* end of list */ }
|
||||
},
|
||||
};
|
||||
@ -616,6 +624,7 @@ DriveInfo *drive_init(QemuOpts *all_opts, BlockInterfaceType block_default_type)
|
||||
int cyls, heads, secs, translation;
|
||||
int max_devs, bus_id, unit_id, index;
|
||||
const char *devaddr;
|
||||
bool read_only, copy_on_read;
|
||||
Error *local_err = NULL;
|
||||
|
||||
/* Change legacy command line options into QMP ones */
|
||||
@ -698,6 +707,20 @@ DriveInfo *drive_init(QemuOpts *all_opts, BlockInterfaceType block_default_type)
|
||||
}
|
||||
}
|
||||
|
||||
/* copy-on-read is disabled with a warning for read-only devices */
|
||||
read_only = qemu_opt_get_bool(legacy_opts, "read-only", false);
|
||||
copy_on_read = qemu_opt_get_bool(legacy_opts, "copy-on-read", false);
|
||||
|
||||
if (read_only && copy_on_read) {
|
||||
error_report("warning: disabling copy-on-read on read-only drive");
|
||||
copy_on_read = false;
|
||||
}
|
||||
|
||||
qdict_put(bs_opts, "read-only",
|
||||
qstring_from_str(read_only ? "on" : "off"));
|
||||
qdict_put(bs_opts, "copy-on-read",
|
||||
qstring_from_str(copy_on_read ? "on" :"off"));
|
||||
|
||||
/* Controller type */
|
||||
value = qemu_opt_get(legacy_opts, "if");
|
||||
if (value) {
|
||||
|
Loading…
Reference in New Issue
Block a user