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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Kevin Wolf
						Kevin Wolf