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
					
				
							
								
								
									
										9
									
								
								block.c
								
								
								
								
							
							
						
						
									
										9
									
								
								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)) {
 | 
			
		||||
        bdrv_enable_copy_on_read(bs);
 | 
			
		||||
    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