Commit efa84d43cc9f4e21d564e7415778166735890bc1
Committed by
Anthony Liguori
1 parent
9ea2ea71
Convert qemu-img convert to new bdrv_create
This is part two of the qemu-img conversion. This really works the same as the previous conversion of qemu-img create: It introduces a new -o option for the generic approach and adds the old-style options to this option set. Signed-off-by: Kevin Wolf <kwolf@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Showing
1 changed file
with
65 additions
and
32 deletions
qemu-img.c
... | ... | @@ -215,6 +215,32 @@ static BlockDriverState *bdrv_new_open(const char *filename, |
215 | 215 | return bs; |
216 | 216 | } |
217 | 217 | |
218 | +static void add_old_style_options(const char *fmt, QEMUOptionParameter *list, | |
219 | + int flags, const char *base_filename, const char *base_fmt) | |
220 | +{ | |
221 | + if (flags & BLOCK_FLAG_ENCRYPT) { | |
222 | + if (set_option_parameter(list, BLOCK_OPT_ENCRYPT, "on")) { | |
223 | + error("Encryption not supported for file format '%s'", fmt); | |
224 | + } | |
225 | + } | |
226 | + if (flags & BLOCK_FLAG_COMPAT6) { | |
227 | + if (set_option_parameter(list, BLOCK_OPT_COMPAT6, "on")) { | |
228 | + error("VMDK version 6 not supported for file format '%s'", fmt); | |
229 | + } | |
230 | + } | |
231 | + | |
232 | + if (base_filename) { | |
233 | + if (set_option_parameter(list, BLOCK_OPT_BACKING_FILE, base_filename)) { | |
234 | + error("Backing file not supported for file format '%s'", fmt); | |
235 | + } | |
236 | + } | |
237 | + if (base_fmt) { | |
238 | + if (set_option_parameter(list, BLOCK_OPT_BACKING_FMT, base_fmt)) { | |
239 | + error("Backing file format not supported for file format '%s'", fmt); | |
240 | + } | |
241 | + } | |
242 | +} | |
243 | + | |
218 | 244 | static int img_create(int argc, char **argv) |
219 | 245 | { |
220 | 246 | int c, ret, flags; |
... | ... | @@ -279,27 +305,7 @@ static int img_create(int argc, char **argv) |
279 | 305 | } |
280 | 306 | |
281 | 307 | /* Add old-style options to parameters */ |
282 | - if (flags & BLOCK_FLAG_ENCRYPT) { | |
283 | - if (set_option_parameter(param, BLOCK_OPT_ENCRYPT, "on")) { | |
284 | - error("Encryption not supported for file format '%s'", fmt); | |
285 | - } | |
286 | - } | |
287 | - if (flags & BLOCK_FLAG_COMPAT6) { | |
288 | - if (set_option_parameter(param, BLOCK_OPT_COMPAT6, "on")) { | |
289 | - error("VMDK version 6 not supported for file format '%s'", fmt); | |
290 | - } | |
291 | - } | |
292 | - | |
293 | - if (base_filename) { | |
294 | - if (set_option_parameter(param, BLOCK_OPT_BACKING_FILE, base_filename)) { | |
295 | - error("Backing file not supported for file format '%s'", fmt); | |
296 | - } | |
297 | - } | |
298 | - if (base_fmt) { | |
299 | - if (set_option_parameter(param, BLOCK_OPT_BACKING_FMT, base_fmt)) { | |
300 | - error("Backing file format not supported for file format '%s'", fmt); | |
301 | - } | |
302 | - } | |
308 | + add_old_style_options(fmt, param, flags, base_filename, base_fmt); | |
303 | 309 | |
304 | 310 | // The size for the image must always be specified, with one exception: |
305 | 311 | // If we are using a backing file, we can obtain the size from there |
... | ... | @@ -525,13 +531,15 @@ static int img_convert(int argc, char **argv) |
525 | 531 | uint8_t buf[IO_BUF_SIZE]; |
526 | 532 | const uint8_t *buf1; |
527 | 533 | BlockDriverInfo bdi; |
534 | + QEMUOptionParameter *param = NULL; | |
535 | + char *options = NULL; | |
528 | 536 | |
529 | 537 | fmt = NULL; |
530 | 538 | out_fmt = "raw"; |
531 | 539 | out_baseimg = NULL; |
532 | 540 | flags = 0; |
533 | 541 | for(;;) { |
534 | - c = getopt(argc, argv, "f:O:B:hce6"); | |
542 | + c = getopt(argc, argv, "f:O:B:hce6o:"); | |
535 | 543 | if (c == -1) |
536 | 544 | break; |
537 | 545 | switch(c) { |
... | ... | @@ -556,6 +564,9 @@ static int img_convert(int argc, char **argv) |
556 | 564 | case '6': |
557 | 565 | flags |= BLOCK_FLAG_COMPAT6; |
558 | 566 | break; |
567 | + case 'o': | |
568 | + options = optarg; | |
569 | + break; | |
559 | 570 | } |
560 | 571 | } |
561 | 572 | |
... | ... | @@ -580,19 +591,41 @@ static int img_convert(int argc, char **argv) |
580 | 591 | total_sectors += bs_sectors; |
581 | 592 | } |
582 | 593 | |
594 | + /* Find driver and parse its options */ | |
583 | 595 | drv = bdrv_find_format(out_fmt); |
584 | 596 | if (!drv) |
585 | 597 | error("Unknown file format '%s'", out_fmt); |
586 | - if (flags & BLOCK_FLAG_COMPRESS && strcmp(drv->format_name, "qcow") && strcmp(drv->format_name, "qcow2")) | |
587 | - error("Compression not supported for this file format"); | |
588 | - if (flags & BLOCK_FLAG_ENCRYPT && strcmp(drv->format_name, "qcow") && strcmp(drv->format_name, "qcow2")) | |
589 | - error("Encryption not supported for this file format"); | |
590 | - if (flags & BLOCK_FLAG_COMPAT6 && strcmp(drv->format_name, "vmdk")) | |
591 | - error("Alternative compatibility level not supported for this file format"); | |
592 | - if (flags & BLOCK_FLAG_ENCRYPT && flags & BLOCK_FLAG_COMPRESS) | |
593 | - error("Compression and encryption not supported at the same time"); | |
594 | - | |
595 | - ret = bdrv_create2(drv, out_filename, total_sectors, out_baseimg, NULL, flags); | |
598 | + | |
599 | + if (options) { | |
600 | + param = parse_option_parameters(options, drv->create_options, param); | |
601 | + if (param == NULL) { | |
602 | + error("Invalid options for file format '%s'.", out_fmt); | |
603 | + } | |
604 | + } else { | |
605 | + param = parse_option_parameters("", drv->create_options, param); | |
606 | + } | |
607 | + | |
608 | + set_option_parameter_int(param, BLOCK_OPT_SIZE, total_sectors * 512); | |
609 | + add_old_style_options(out_fmt, param, flags, out_baseimg, NULL); | |
610 | + | |
611 | + /* Check if compression is supported */ | |
612 | + if (flags & BLOCK_FLAG_COMPRESS) { | |
613 | + QEMUOptionParameter *encryption = | |
614 | + get_option_parameter(param, BLOCK_OPT_ENCRYPT); | |
615 | + | |
616 | + if (!drv->bdrv_write_compressed) { | |
617 | + error("Compression not supported for this file format"); | |
618 | + } | |
619 | + | |
620 | + if (encryption && encryption->value.n) { | |
621 | + error("Compression and encryption not supported at the same time"); | |
622 | + } | |
623 | + } | |
624 | + | |
625 | + /* Create the new image */ | |
626 | + ret = bdrv_create(drv, out_filename, param); | |
627 | + free_option_parameters(param); | |
628 | + | |
596 | 629 | if (ret < 0) { |
597 | 630 | if (ret == -ENOTSUP) { |
598 | 631 | error("Formatting not supported for file format '%s'", out_fmt); | ... | ... |