Commit efa84d43cc9f4e21d564e7415778166735890bc1

Authored by Kevin Wolf
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);
... ...