block: Image file option amendment
This patch adds the "amend" option to qemu-img which allows changing image options on existing image files. It also adds the generic bdrv implementation which is basically just a wrapper for the image format specific function. Signed-off-by: Max Reitz <mreitz@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
		
							parent
							
								
									56e023af80
								
							
						
					
					
						commit
						6f176b48f9
					
				
							
								
								
									
										8
									
								
								block.c
								
								
								
								
							
							
						
						
									
										8
									
								
								block.c
								
								
								
								
							| 
						 | 
				
			
			@ -4579,3 +4579,11 @@ void bdrv_add_before_write_notifier(BlockDriverState *bs,
 | 
			
		|||
{
 | 
			
		||||
    notifier_with_return_list_add(&bs->before_write_notifiers, notifier);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int bdrv_amend_options(BlockDriverState *bs, QEMUOptionParameter *options)
 | 
			
		||||
{
 | 
			
		||||
    if (bs->drv->bdrv_amend_options == NULL) {
 | 
			
		||||
        return -ENOTSUP;
 | 
			
		||||
    }
 | 
			
		||||
    return bs->drv->bdrv_amend_options(bs, options);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -241,6 +241,8 @@ typedef enum {
 | 
			
		|||
 | 
			
		||||
int bdrv_check(BlockDriverState *bs, BdrvCheckResult *res, BdrvCheckMode fix);
 | 
			
		||||
 | 
			
		||||
int bdrv_amend_options(BlockDriverState *bs_new, QEMUOptionParameter *options);
 | 
			
		||||
 | 
			
		||||
/* async block I/O */
 | 
			
		||||
typedef void BlockDriverDirtyHandler(BlockDriverState *bs, int64_t sector,
 | 
			
		||||
                                     int sector_num);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -188,6 +188,9 @@ struct BlockDriver {
 | 
			
		|||
    int (*bdrv_check)(BlockDriverState* bs, BdrvCheckResult *result,
 | 
			
		||||
        BdrvCheckMode fix);
 | 
			
		||||
 | 
			
		||||
    int (*bdrv_amend_options)(BlockDriverState *bs,
 | 
			
		||||
        QEMUOptionParameter *options);
 | 
			
		||||
 | 
			
		||||
    void (*bdrv_debug_event)(BlockDriverState *bs, BlkDebugEvent event);
 | 
			
		||||
 | 
			
		||||
    /* TODO Better pass a option string/QDict/QemuOpts to add any rule? */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -67,5 +67,11 @@ DEF("resize", img_resize,
 | 
			
		|||
    "resize [-q] filename [+ | -]size")
 | 
			
		||||
STEXI
 | 
			
		||||
@item resize [-q] @var{filename} [+ | -]@var{size}
 | 
			
		||||
ETEXI
 | 
			
		||||
 | 
			
		||||
DEF("amend", img_amend,
 | 
			
		||||
    "amend [-q] [-f fmt] -o options filename")
 | 
			
		||||
STEXI
 | 
			
		||||
@item amend [-q] [-f @var{fmt}] -o @var{options} @var{filename}
 | 
			
		||||
@end table
 | 
			
		||||
ETEXI
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										84
									
								
								qemu-img.c
								
								
								
								
							
							
						
						
									
										84
									
								
								qemu-img.c
								
								
								
								
							| 
						 | 
				
			
			@ -2525,6 +2525,90 @@ out:
 | 
			
		|||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int img_amend(int argc, char **argv)
 | 
			
		||||
{
 | 
			
		||||
    int c, ret = 0;
 | 
			
		||||
    char *options = NULL;
 | 
			
		||||
    QEMUOptionParameter *create_options = NULL, *options_param = NULL;
 | 
			
		||||
    const char *fmt = NULL, *filename;
 | 
			
		||||
    bool quiet = false;
 | 
			
		||||
    BlockDriverState *bs = NULL;
 | 
			
		||||
 | 
			
		||||
    for (;;) {
 | 
			
		||||
        c = getopt(argc, argv, "hqf:o:");
 | 
			
		||||
        if (c == -1) {
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        switch (c) {
 | 
			
		||||
            case 'h':
 | 
			
		||||
            case '?':
 | 
			
		||||
                help();
 | 
			
		||||
                break;
 | 
			
		||||
            case 'o':
 | 
			
		||||
                options = optarg;
 | 
			
		||||
                break;
 | 
			
		||||
            case 'f':
 | 
			
		||||
                fmt = optarg;
 | 
			
		||||
                break;
 | 
			
		||||
            case 'q':
 | 
			
		||||
                quiet = true;
 | 
			
		||||
                break;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (optind != argc - 1) {
 | 
			
		||||
        help();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (!options) {
 | 
			
		||||
        help();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    filename = argv[argc - 1];
 | 
			
		||||
 | 
			
		||||
    bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_RDWR, true, quiet);
 | 
			
		||||
    if (!bs) {
 | 
			
		||||
        error_report("Could not open image '%s'", filename);
 | 
			
		||||
        ret = -1;
 | 
			
		||||
        goto out;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fmt = bs->drv->format_name;
 | 
			
		||||
 | 
			
		||||
    if (is_help_option(options)) {
 | 
			
		||||
        ret = print_block_option_help(filename, fmt);
 | 
			
		||||
        goto out;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    create_options = append_option_parameters(create_options,
 | 
			
		||||
            bs->drv->create_options);
 | 
			
		||||
    options_param = parse_option_parameters(options, create_options,
 | 
			
		||||
            options_param);
 | 
			
		||||
    if (options_param == NULL) {
 | 
			
		||||
        error_report("Invalid options for file format '%s'", fmt);
 | 
			
		||||
        ret = -1;
 | 
			
		||||
        goto out;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ret = bdrv_amend_options(bs, options_param);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        error_report("Error while amending options: %s", strerror(-ret));
 | 
			
		||||
        goto out;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
out:
 | 
			
		||||
    if (bs) {
 | 
			
		||||
        bdrv_unref(bs);
 | 
			
		||||
    }
 | 
			
		||||
    free_option_parameters(create_options);
 | 
			
		||||
    free_option_parameters(options_param);
 | 
			
		||||
    if (ret) {
 | 
			
		||||
        return 1;
 | 
			
		||||
    }
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static const img_cmd_t img_cmds[] = {
 | 
			
		||||
#define DEF(option, callback, arg_string)        \
 | 
			
		||||
    { option, callback },
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -350,6 +350,11 @@ sizes accordingly.  Failure to do so will result in data loss!
 | 
			
		|||
After using this command to grow a disk image, you must use file system and
 | 
			
		||||
partitioning tools inside the VM to actually begin using the new space on the
 | 
			
		||||
device.
 | 
			
		||||
 | 
			
		||||
@item amend [-f @var{fmt}] -o @var{options} @var{filename}
 | 
			
		||||
 | 
			
		||||
Amends the image format specific @var{options} for the image file
 | 
			
		||||
@var{filename}. Not all file formats support this operation.
 | 
			
		||||
@end table
 | 
			
		||||
@c man end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue