xref: /openbmc/qemu/qemu-img.c (revision 54aa3de72ea2aaa2e903e7e879a4f3dda515a00e)
1  /*
2   * QEMU disk image utility
3   *
4   * Copyright (c) 2003-2008 Fabrice Bellard
5   *
6   * Permission is hereby granted, free of charge, to any person obtaining a copy
7   * of this software and associated documentation files (the "Software"), to deal
8   * in the Software without restriction, including without limitation the rights
9   * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10   * copies of the Software, and to permit persons to whom the Software is
11   * furnished to do so, subject to the following conditions:
12   *
13   * The above copyright notice and this permission notice shall be included in
14   * all copies or substantial portions of the Software.
15   *
16   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19   * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22   * THE SOFTWARE.
23   */
24  
25  #include "qemu/osdep.h"
26  #include <getopt.h>
27  
28  #include "qemu-common.h"
29  #include "qemu-version.h"
30  #include "qapi/error.h"
31  #include "qapi/qapi-commands-block-core.h"
32  #include "qapi/qapi-visit-block-core.h"
33  #include "qapi/qobject-output-visitor.h"
34  #include "qapi/qmp/qjson.h"
35  #include "qapi/qmp/qdict.h"
36  #include "qapi/qmp/qstring.h"
37  #include "qemu/cutils.h"
38  #include "qemu/config-file.h"
39  #include "qemu/option.h"
40  #include "qemu/error-report.h"
41  #include "qemu/log.h"
42  #include "qemu/main-loop.h"
43  #include "qemu/module.h"
44  #include "qemu/sockets.h"
45  #include "qemu/units.h"
46  #include "qom/object_interfaces.h"
47  #include "sysemu/block-backend.h"
48  #include "block/block_int.h"
49  #include "block/blockjob.h"
50  #include "block/qapi.h"
51  #include "crypto/init.h"
52  #include "trace/control.h"
53  #include "qemu/throttle.h"
54  #include "block/throttle-groups.h"
55  
56  #define QEMU_IMG_VERSION "qemu-img version " QEMU_FULL_VERSION \
57                            "\n" QEMU_COPYRIGHT "\n"
58  
59  typedef struct img_cmd_t {
60      const char *name;
61      int (*handler)(int argc, char **argv);
62  } img_cmd_t;
63  
64  enum {
65      OPTION_OUTPUT = 256,
66      OPTION_BACKING_CHAIN = 257,
67      OPTION_OBJECT = 258,
68      OPTION_IMAGE_OPTS = 259,
69      OPTION_PATTERN = 260,
70      OPTION_FLUSH_INTERVAL = 261,
71      OPTION_NO_DRAIN = 262,
72      OPTION_TARGET_IMAGE_OPTS = 263,
73      OPTION_SIZE = 264,
74      OPTION_PREALLOCATION = 265,
75      OPTION_SHRINK = 266,
76      OPTION_SALVAGE = 267,
77      OPTION_TARGET_IS_ZERO = 268,
78      OPTION_ADD = 269,
79      OPTION_REMOVE = 270,
80      OPTION_CLEAR = 271,
81      OPTION_ENABLE = 272,
82      OPTION_DISABLE = 273,
83      OPTION_MERGE = 274,
84      OPTION_BITMAPS = 275,
85      OPTION_FORCE = 276,
86  };
87  
88  typedef enum OutputFormat {
89      OFORMAT_JSON,
90      OFORMAT_HUMAN,
91  } OutputFormat;
92  
93  /* Default to cache=writeback as data integrity is not important for qemu-img */
94  #define BDRV_DEFAULT_CACHE "writeback"
95  
96  static void format_print(void *opaque, const char *name)
97  {
98      printf(" %s", name);
99  }
100  
101  static void QEMU_NORETURN GCC_FMT_ATTR(1, 2) error_exit(const char *fmt, ...)
102  {
103      va_list ap;
104  
105      va_start(ap, fmt);
106      error_vreport(fmt, ap);
107      va_end(ap);
108  
109      error_printf("Try 'qemu-img --help' for more information\n");
110      exit(EXIT_FAILURE);
111  }
112  
113  static void QEMU_NORETURN missing_argument(const char *option)
114  {
115      error_exit("missing argument for option '%s'", option);
116  }
117  
118  static void QEMU_NORETURN unrecognized_option(const char *option)
119  {
120      error_exit("unrecognized option '%s'", option);
121  }
122  
123  /* Please keep in synch with docs/tools/qemu-img.rst */
124  static void QEMU_NORETURN help(void)
125  {
126      const char *help_msg =
127             QEMU_IMG_VERSION
128             "usage: qemu-img [standard options] command [command options]\n"
129             "QEMU disk image utility\n"
130             "\n"
131             "    '-h', '--help'       display this help and exit\n"
132             "    '-V', '--version'    output version information and exit\n"
133             "    '-T', '--trace'      [[enable=]<pattern>][,events=<file>][,file=<file>]\n"
134             "                         specify tracing options\n"
135             "\n"
136             "Command syntax:\n"
137  #define DEF(option, callback, arg_string)        \
138             "  " arg_string "\n"
139  #include "qemu-img-cmds.h"
140  #undef DEF
141             "\n"
142             "Command parameters:\n"
143             "  'filename' is a disk image filename\n"
144             "  'objectdef' is a QEMU user creatable object definition. See the qemu(1)\n"
145             "    manual page for a description of the object properties. The most common\n"
146             "    object type is a 'secret', which is used to supply passwords and/or\n"
147             "    encryption keys.\n"
148             "  'fmt' is the disk image format. It is guessed automatically in most cases\n"
149             "  'cache' is the cache mode used to write the output disk image, the valid\n"
150             "    options are: 'none', 'writeback' (default, except for convert), 'writethrough',\n"
151             "    'directsync' and 'unsafe' (default for convert)\n"
152             "  'src_cache' is the cache mode used to read input disk images, the valid\n"
153             "    options are the same as for the 'cache' option\n"
154             "  'size' is the disk image size in bytes. Optional suffixes\n"
155             "    'k' or 'K' (kilobyte, 1024), 'M' (megabyte, 1024k), 'G' (gigabyte, 1024M),\n"
156             "    'T' (terabyte, 1024G), 'P' (petabyte, 1024T) and 'E' (exabyte, 1024P)  are\n"
157             "    supported. 'b' is ignored.\n"
158             "  'output_filename' is the destination disk image filename\n"
159             "  'output_fmt' is the destination format\n"
160             "  'options' is a comma separated list of format specific options in a\n"
161             "    name=value format. Use -o ? for an overview of the options supported by the\n"
162             "    used format\n"
163             "  'snapshot_param' is param used for internal snapshot, format\n"
164             "    is 'snapshot.id=[ID],snapshot.name=[NAME]', or\n"
165             "    '[ID_OR_NAME]'\n"
166             "  '-c' indicates that target image must be compressed (qcow format only)\n"
167             "  '-u' allows unsafe backing chains. For rebasing, it is assumed that old and\n"
168             "       new backing file match exactly. The image doesn't need a working\n"
169             "       backing file before rebasing in this case (useful for renaming the\n"
170             "       backing file). For image creation, allow creating without attempting\n"
171             "       to open the backing file.\n"
172             "  '-h' with or without a command shows this help and lists the supported formats\n"
173             "  '-p' show progress of command (only certain commands)\n"
174             "  '-q' use Quiet mode - do not print any output (except errors)\n"
175             "  '-S' indicates the consecutive number of bytes (defaults to 4k) that must\n"
176             "       contain only zeros for qemu-img to create a sparse image during\n"
177             "       conversion. If the number of bytes is 0, the source will not be scanned for\n"
178             "       unallocated or zero sectors, and the destination image will always be\n"
179             "       fully allocated\n"
180             "  '--output' takes the format in which the output must be done (human or json)\n"
181             "  '-n' skips the target volume creation (useful if the volume is created\n"
182             "       prior to running qemu-img)\n"
183             "\n"
184             "Parameters to bitmap subcommand:\n"
185             "  'bitmap' is the name of the bitmap to manipulate, through one or more\n"
186             "       actions from '--add', '--remove', '--clear', '--enable', '--disable',\n"
187             "       or '--merge source'\n"
188             "  '-g granularity' sets the granularity for '--add' actions\n"
189             "  '-b source' and '-F src_fmt' tell '--merge' actions to find the source\n"
190             "       bitmaps from an alternative file\n"
191             "\n"
192             "Parameters to check subcommand:\n"
193             "  '-r' tries to repair any inconsistencies that are found during the check.\n"
194             "       '-r leaks' repairs only cluster leaks, whereas '-r all' fixes all\n"
195             "       kinds of errors, with a higher risk of choosing the wrong fix or\n"
196             "       hiding corruption that has already occurred.\n"
197             "\n"
198             "Parameters to convert subcommand:\n"
199             "  '--bitmaps' copies all top-level persistent bitmaps to destination\n"
200             "  '-m' specifies how many coroutines work in parallel during the convert\n"
201             "       process (defaults to 8)\n"
202             "  '-W' allow to write to the target out of order rather than sequential\n"
203             "\n"
204             "Parameters to snapshot subcommand:\n"
205             "  'snapshot' is the name of the snapshot to create, apply or delete\n"
206             "  '-a' applies a snapshot (revert disk to saved state)\n"
207             "  '-c' creates a snapshot\n"
208             "  '-d' deletes a snapshot\n"
209             "  '-l' lists all snapshots in the given image\n"
210             "\n"
211             "Parameters to compare subcommand:\n"
212             "  '-f' first image format\n"
213             "  '-F' second image format\n"
214             "  '-s' run in Strict mode - fail on different image size or sector allocation\n"
215             "\n"
216             "Parameters to dd subcommand:\n"
217             "  'bs=BYTES' read and write up to BYTES bytes at a time "
218             "(default: 512)\n"
219             "  'count=N' copy only N input blocks\n"
220             "  'if=FILE' read from FILE\n"
221             "  'of=FILE' write to FILE\n"
222             "  'skip=N' skip N bs-sized blocks at the start of input\n";
223  
224      printf("%s\nSupported formats:", help_msg);
225      bdrv_iterate_format(format_print, NULL, false);
226      printf("\n\n" QEMU_HELP_BOTTOM "\n");
227      exit(EXIT_SUCCESS);
228  }
229  
230  static QemuOptsList qemu_object_opts = {
231      .name = "object",
232      .implied_opt_name = "qom-type",
233      .head = QTAILQ_HEAD_INITIALIZER(qemu_object_opts.head),
234      .desc = {
235          { }
236      },
237  };
238  
239  static bool qemu_img_object_print_help(const char *type, QemuOpts *opts)
240  {
241      if (user_creatable_print_help(type, opts)) {
242          exit(0);
243      }
244      return true;
245  }
246  
247  /*
248   * Is @optarg safe for accumulate_options()?
249   * It is when multiple of them can be joined together separated by ','.
250   * To make that work, @optarg must not start with ',' (or else a
251   * separating ',' preceding it gets escaped), and it must not end with
252   * an odd number of ',' (or else a separating ',' following it gets
253   * escaped), or be empty (or else a separating ',' preceding it can
254   * escape a separating ',' following it).
255   *
256   */
257  static bool is_valid_option_list(const char *optarg)
258  {
259      size_t len = strlen(optarg);
260      size_t i;
261  
262      if (!optarg[0] || optarg[0] == ',') {
263          return false;
264      }
265  
266      for (i = len; i > 0 && optarg[i - 1] == ','; i--) {
267      }
268      if ((len - i) % 2) {
269          return false;
270      }
271  
272      return true;
273  }
274  
275  static int accumulate_options(char **options, char *optarg)
276  {
277      char *new_options;
278  
279      if (!is_valid_option_list(optarg)) {
280          error_report("Invalid option list: %s", optarg);
281          return -1;
282      }
283  
284      if (!*options) {
285          *options = g_strdup(optarg);
286      } else {
287          new_options = g_strdup_printf("%s,%s", *options, optarg);
288          g_free(*options);
289          *options = new_options;
290      }
291      return 0;
292  }
293  
294  static QemuOptsList qemu_source_opts = {
295      .name = "source",
296      .implied_opt_name = "file",
297      .head = QTAILQ_HEAD_INITIALIZER(qemu_source_opts.head),
298      .desc = {
299          { }
300      },
301  };
302  
303  static int GCC_FMT_ATTR(2, 3) qprintf(bool quiet, const char *fmt, ...)
304  {
305      int ret = 0;
306      if (!quiet) {
307          va_list args;
308          va_start(args, fmt);
309          ret = vprintf(fmt, args);
310          va_end(args);
311      }
312      return ret;
313  }
314  
315  
316  static int print_block_option_help(const char *filename, const char *fmt)
317  {
318      BlockDriver *drv, *proto_drv;
319      QemuOptsList *create_opts = NULL;
320      Error *local_err = NULL;
321  
322      /* Find driver and parse its options */
323      drv = bdrv_find_format(fmt);
324      if (!drv) {
325          error_report("Unknown file format '%s'", fmt);
326          return 1;
327      }
328  
329      if (!drv->create_opts) {
330          error_report("Format driver '%s' does not support image creation", fmt);
331          return 1;
332      }
333  
334      create_opts = qemu_opts_append(create_opts, drv->create_opts);
335      if (filename) {
336          proto_drv = bdrv_find_protocol(filename, true, &local_err);
337          if (!proto_drv) {
338              error_report_err(local_err);
339              qemu_opts_free(create_opts);
340              return 1;
341          }
342          if (!proto_drv->create_opts) {
343              error_report("Protocol driver '%s' does not support image creation",
344                           proto_drv->format_name);
345              qemu_opts_free(create_opts);
346              return 1;
347          }
348          create_opts = qemu_opts_append(create_opts, proto_drv->create_opts);
349      }
350  
351      if (filename) {
352          printf("Supported options:\n");
353      } else {
354          printf("Supported %s options:\n", fmt);
355      }
356      qemu_opts_print_help(create_opts, false);
357      qemu_opts_free(create_opts);
358  
359      if (!filename) {
360          printf("\n"
361                 "The protocol level may support further options.\n"
362                 "Specify the target filename to include those options.\n");
363      }
364  
365      return 0;
366  }
367  
368  
369  static BlockBackend *img_open_opts(const char *optstr,
370                                     QemuOpts *opts, int flags, bool writethrough,
371                                     bool quiet, bool force_share)
372  {
373      QDict *options;
374      Error *local_err = NULL;
375      BlockBackend *blk;
376      options = qemu_opts_to_qdict(opts, NULL);
377      if (force_share) {
378          if (qdict_haskey(options, BDRV_OPT_FORCE_SHARE)
379              && strcmp(qdict_get_str(options, BDRV_OPT_FORCE_SHARE), "on")) {
380              error_report("--force-share/-U conflicts with image options");
381              qobject_unref(options);
382              return NULL;
383          }
384          qdict_put_str(options, BDRV_OPT_FORCE_SHARE, "on");
385      }
386      blk = blk_new_open(NULL, NULL, options, flags, &local_err);
387      if (!blk) {
388          error_reportf_err(local_err, "Could not open '%s': ", optstr);
389          return NULL;
390      }
391      blk_set_enable_write_cache(blk, !writethrough);
392  
393      return blk;
394  }
395  
396  static BlockBackend *img_open_file(const char *filename,
397                                     QDict *options,
398                                     const char *fmt, int flags,
399                                     bool writethrough, bool quiet,
400                                     bool force_share)
401  {
402      BlockBackend *blk;
403      Error *local_err = NULL;
404  
405      if (!options) {
406          options = qdict_new();
407      }
408      if (fmt) {
409          qdict_put_str(options, "driver", fmt);
410      }
411  
412      if (force_share) {
413          qdict_put_bool(options, BDRV_OPT_FORCE_SHARE, true);
414      }
415      blk = blk_new_open(filename, NULL, options, flags, &local_err);
416      if (!blk) {
417          error_reportf_err(local_err, "Could not open '%s': ", filename);
418          return NULL;
419      }
420      blk_set_enable_write_cache(blk, !writethrough);
421  
422      return blk;
423  }
424  
425  
426  static int img_add_key_secrets(void *opaque,
427                                 const char *name, const char *value,
428                                 Error **errp)
429  {
430      QDict *options = opaque;
431  
432      if (g_str_has_suffix(name, "key-secret")) {
433          qdict_put_str(options, name, value);
434      }
435  
436      return 0;
437  }
438  
439  
440  static BlockBackend *img_open(bool image_opts,
441                                const char *filename,
442                                const char *fmt, int flags, bool writethrough,
443                                bool quiet, bool force_share)
444  {
445      BlockBackend *blk;
446      if (image_opts) {
447          QemuOpts *opts;
448          if (fmt) {
449              error_report("--image-opts and --format are mutually exclusive");
450              return NULL;
451          }
452          opts = qemu_opts_parse_noisily(qemu_find_opts("source"),
453                                         filename, true);
454          if (!opts) {
455              return NULL;
456          }
457          blk = img_open_opts(filename, opts, flags, writethrough, quiet,
458                              force_share);
459      } else {
460          blk = img_open_file(filename, NULL, fmt, flags, writethrough, quiet,
461                              force_share);
462      }
463      return blk;
464  }
465  
466  
467  static int add_old_style_options(const char *fmt, QemuOpts *opts,
468                                   const char *base_filename,
469                                   const char *base_fmt)
470  {
471      if (base_filename) {
472          if (!qemu_opt_set(opts, BLOCK_OPT_BACKING_FILE, base_filename,
473                            NULL)) {
474              error_report("Backing file not supported for file format '%s'",
475                           fmt);
476              return -1;
477          }
478      }
479      if (base_fmt) {
480          if (!qemu_opt_set(opts, BLOCK_OPT_BACKING_FMT, base_fmt, NULL)) {
481              error_report("Backing file format not supported for file "
482                           "format '%s'", fmt);
483              return -1;
484          }
485      }
486      return 0;
487  }
488  
489  static int64_t cvtnum_full(const char *name, const char *value, int64_t min,
490                             int64_t max)
491  {
492      int err;
493      uint64_t res;
494  
495      err = qemu_strtosz(value, NULL, &res);
496      if (err < 0 && err != -ERANGE) {
497          error_report("Invalid %s specified. You may use "
498                       "k, M, G, T, P or E suffixes for", name);
499          error_report("kilobytes, megabytes, gigabytes, terabytes, "
500                       "petabytes and exabytes.");
501          return err;
502      }
503      if (err == -ERANGE || res > max || res < min) {
504          error_report("Invalid %s specified. Must be between %" PRId64
505                       " and %" PRId64 ".", name, min, max);
506          return -ERANGE;
507      }
508      return res;
509  }
510  
511  static int64_t cvtnum(const char *name, const char *value)
512  {
513      return cvtnum_full(name, value, 0, INT64_MAX);
514  }
515  
516  static int img_create(int argc, char **argv)
517  {
518      int c;
519      uint64_t img_size = -1;
520      const char *fmt = "raw";
521      const char *base_fmt = NULL;
522      const char *filename;
523      const char *base_filename = NULL;
524      char *options = NULL;
525      Error *local_err = NULL;
526      bool quiet = false;
527      int flags = 0;
528  
529      for(;;) {
530          static const struct option long_options[] = {
531              {"help", no_argument, 0, 'h'},
532              {"object", required_argument, 0, OPTION_OBJECT},
533              {0, 0, 0, 0}
534          };
535          c = getopt_long(argc, argv, ":F:b:f:ho:qu",
536                          long_options, NULL);
537          if (c == -1) {
538              break;
539          }
540          switch(c) {
541          case ':':
542              missing_argument(argv[optind - 1]);
543              break;
544          case '?':
545              unrecognized_option(argv[optind - 1]);
546              break;
547          case 'h':
548              help();
549              break;
550          case 'F':
551              base_fmt = optarg;
552              break;
553          case 'b':
554              base_filename = optarg;
555              break;
556          case 'f':
557              fmt = optarg;
558              break;
559          case 'o':
560              if (accumulate_options(&options, optarg) < 0) {
561                  goto fail;
562              }
563              break;
564          case 'q':
565              quiet = true;
566              break;
567          case 'u':
568              flags |= BDRV_O_NO_BACKING;
569              break;
570          case OPTION_OBJECT: {
571              QemuOpts *opts;
572              opts = qemu_opts_parse_noisily(&qemu_object_opts,
573                                             optarg, true);
574              if (!opts) {
575                  goto fail;
576              }
577          }   break;
578          }
579      }
580  
581      /* Get the filename */
582      filename = (optind < argc) ? argv[optind] : NULL;
583      if (options && has_help_option(options)) {
584          g_free(options);
585          return print_block_option_help(filename, fmt);
586      }
587  
588      if (optind >= argc) {
589          error_exit("Expecting image file name");
590      }
591      optind++;
592  
593      if (qemu_opts_foreach(&qemu_object_opts,
594                            user_creatable_add_opts_foreach,
595                            qemu_img_object_print_help, &error_fatal)) {
596          goto fail;
597      }
598  
599      /* Get image size, if specified */
600      if (optind < argc) {
601          int64_t sval;
602  
603          sval = cvtnum("image size", argv[optind++]);
604          if (sval < 0) {
605              goto fail;
606          }
607          img_size = (uint64_t)sval;
608      }
609      if (optind != argc) {
610          error_exit("Unexpected argument: %s", argv[optind]);
611      }
612  
613      bdrv_img_create(filename, fmt, base_filename, base_fmt,
614                      options, img_size, flags, quiet, &local_err);
615      if (local_err) {
616          error_reportf_err(local_err, "%s: ", filename);
617          goto fail;
618      }
619  
620      g_free(options);
621      return 0;
622  
623  fail:
624      g_free(options);
625      return 1;
626  }
627  
628  static void dump_json_image_check(ImageCheck *check, bool quiet)
629  {
630      QString *str;
631      QObject *obj;
632      Visitor *v = qobject_output_visitor_new(&obj);
633  
634      visit_type_ImageCheck(v, NULL, &check, &error_abort);
635      visit_complete(v, &obj);
636      str = qobject_to_json_pretty(obj);
637      assert(str != NULL);
638      qprintf(quiet, "%s\n", qstring_get_str(str));
639      qobject_unref(obj);
640      visit_free(v);
641      qobject_unref(str);
642  }
643  
644  static void dump_human_image_check(ImageCheck *check, bool quiet)
645  {
646      if (!(check->corruptions || check->leaks || check->check_errors)) {
647          qprintf(quiet, "No errors were found on the image.\n");
648      } else {
649          if (check->corruptions) {
650              qprintf(quiet, "\n%" PRId64 " errors were found on the image.\n"
651                      "Data may be corrupted, or further writes to the image "
652                      "may corrupt it.\n",
653                      check->corruptions);
654          }
655  
656          if (check->leaks) {
657              qprintf(quiet,
658                      "\n%" PRId64 " leaked clusters were found on the image.\n"
659                      "This means waste of disk space, but no harm to data.\n",
660                      check->leaks);
661          }
662  
663          if (check->check_errors) {
664              qprintf(quiet,
665                      "\n%" PRId64
666                      " internal errors have occurred during the check.\n",
667                      check->check_errors);
668          }
669      }
670  
671      if (check->total_clusters != 0 && check->allocated_clusters != 0) {
672          qprintf(quiet, "%" PRId64 "/%" PRId64 " = %0.2f%% allocated, "
673                  "%0.2f%% fragmented, %0.2f%% compressed clusters\n",
674                  check->allocated_clusters, check->total_clusters,
675                  check->allocated_clusters * 100.0 / check->total_clusters,
676                  check->fragmented_clusters * 100.0 / check->allocated_clusters,
677                  check->compressed_clusters * 100.0 /
678                  check->allocated_clusters);
679      }
680  
681      if (check->image_end_offset) {
682          qprintf(quiet,
683                  "Image end offset: %" PRId64 "\n", check->image_end_offset);
684      }
685  }
686  
687  static int collect_image_check(BlockDriverState *bs,
688                     ImageCheck *check,
689                     const char *filename,
690                     const char *fmt,
691                     int fix)
692  {
693      int ret;
694      BdrvCheckResult result;
695  
696      ret = bdrv_check(bs, &result, fix);
697      if (ret < 0) {
698          return ret;
699      }
700  
701      check->filename                 = g_strdup(filename);
702      check->format                   = g_strdup(bdrv_get_format_name(bs));
703      check->check_errors             = result.check_errors;
704      check->corruptions              = result.corruptions;
705      check->has_corruptions          = result.corruptions != 0;
706      check->leaks                    = result.leaks;
707      check->has_leaks                = result.leaks != 0;
708      check->corruptions_fixed        = result.corruptions_fixed;
709      check->has_corruptions_fixed    = result.corruptions_fixed != 0;
710      check->leaks_fixed              = result.leaks_fixed;
711      check->has_leaks_fixed          = result.leaks_fixed != 0;
712      check->image_end_offset         = result.image_end_offset;
713      check->has_image_end_offset     = result.image_end_offset != 0;
714      check->total_clusters           = result.bfi.total_clusters;
715      check->has_total_clusters       = result.bfi.total_clusters != 0;
716      check->allocated_clusters       = result.bfi.allocated_clusters;
717      check->has_allocated_clusters   = result.bfi.allocated_clusters != 0;
718      check->fragmented_clusters      = result.bfi.fragmented_clusters;
719      check->has_fragmented_clusters  = result.bfi.fragmented_clusters != 0;
720      check->compressed_clusters      = result.bfi.compressed_clusters;
721      check->has_compressed_clusters  = result.bfi.compressed_clusters != 0;
722  
723      return 0;
724  }
725  
726  /*
727   * Checks an image for consistency. Exit codes:
728   *
729   *  0 - Check completed, image is good
730   *  1 - Check not completed because of internal errors
731   *  2 - Check completed, image is corrupted
732   *  3 - Check completed, image has leaked clusters, but is good otherwise
733   * 63 - Checks are not supported by the image format
734   */
735  static int img_check(int argc, char **argv)
736  {
737      int c, ret;
738      OutputFormat output_format = OFORMAT_HUMAN;
739      const char *filename, *fmt, *output, *cache;
740      BlockBackend *blk;
741      BlockDriverState *bs;
742      int fix = 0;
743      int flags = BDRV_O_CHECK;
744      bool writethrough;
745      ImageCheck *check;
746      bool quiet = false;
747      bool image_opts = false;
748      bool force_share = false;
749  
750      fmt = NULL;
751      output = NULL;
752      cache = BDRV_DEFAULT_CACHE;
753  
754      for(;;) {
755          int option_index = 0;
756          static const struct option long_options[] = {
757              {"help", no_argument, 0, 'h'},
758              {"format", required_argument, 0, 'f'},
759              {"repair", required_argument, 0, 'r'},
760              {"output", required_argument, 0, OPTION_OUTPUT},
761              {"object", required_argument, 0, OPTION_OBJECT},
762              {"image-opts", no_argument, 0, OPTION_IMAGE_OPTS},
763              {"force-share", no_argument, 0, 'U'},
764              {0, 0, 0, 0}
765          };
766          c = getopt_long(argc, argv, ":hf:r:T:qU",
767                          long_options, &option_index);
768          if (c == -1) {
769              break;
770          }
771          switch(c) {
772          case ':':
773              missing_argument(argv[optind - 1]);
774              break;
775          case '?':
776              unrecognized_option(argv[optind - 1]);
777              break;
778          case 'h':
779              help();
780              break;
781          case 'f':
782              fmt = optarg;
783              break;
784          case 'r':
785              flags |= BDRV_O_RDWR;
786  
787              if (!strcmp(optarg, "leaks")) {
788                  fix = BDRV_FIX_LEAKS;
789              } else if (!strcmp(optarg, "all")) {
790                  fix = BDRV_FIX_LEAKS | BDRV_FIX_ERRORS;
791              } else {
792                  error_exit("Unknown option value for -r "
793                             "(expecting 'leaks' or 'all'): %s", optarg);
794              }
795              break;
796          case OPTION_OUTPUT:
797              output = optarg;
798              break;
799          case 'T':
800              cache = optarg;
801              break;
802          case 'q':
803              quiet = true;
804              break;
805          case 'U':
806              force_share = true;
807              break;
808          case OPTION_OBJECT: {
809              QemuOpts *opts;
810              opts = qemu_opts_parse_noisily(&qemu_object_opts,
811                                             optarg, true);
812              if (!opts) {
813                  return 1;
814              }
815          }   break;
816          case OPTION_IMAGE_OPTS:
817              image_opts = true;
818              break;
819          }
820      }
821      if (optind != argc - 1) {
822          error_exit("Expecting one image file name");
823      }
824      filename = argv[optind++];
825  
826      if (output && !strcmp(output, "json")) {
827          output_format = OFORMAT_JSON;
828      } else if (output && !strcmp(output, "human")) {
829          output_format = OFORMAT_HUMAN;
830      } else if (output) {
831          error_report("--output must be used with human or json as argument.");
832          return 1;
833      }
834  
835      if (qemu_opts_foreach(&qemu_object_opts,
836                            user_creatable_add_opts_foreach,
837                            qemu_img_object_print_help, &error_fatal)) {
838          return 1;
839      }
840  
841      ret = bdrv_parse_cache_mode(cache, &flags, &writethrough);
842      if (ret < 0) {
843          error_report("Invalid source cache option: %s", cache);
844          return 1;
845      }
846  
847      blk = img_open(image_opts, filename, fmt, flags, writethrough, quiet,
848                     force_share);
849      if (!blk) {
850          return 1;
851      }
852      bs = blk_bs(blk);
853  
854      check = g_new0(ImageCheck, 1);
855      ret = collect_image_check(bs, check, filename, fmt, fix);
856  
857      if (ret == -ENOTSUP) {
858          error_report("This image format does not support checks");
859          ret = 63;
860          goto fail;
861      }
862  
863      if (check->corruptions_fixed || check->leaks_fixed) {
864          int corruptions_fixed, leaks_fixed;
865          bool has_leaks_fixed, has_corruptions_fixed;
866  
867          leaks_fixed         = check->leaks_fixed;
868          has_leaks_fixed     = check->has_leaks_fixed;
869          corruptions_fixed   = check->corruptions_fixed;
870          has_corruptions_fixed = check->has_corruptions_fixed;
871  
872          if (output_format == OFORMAT_HUMAN) {
873              qprintf(quiet,
874                      "The following inconsistencies were found and repaired:\n\n"
875                      "    %" PRId64 " leaked clusters\n"
876                      "    %" PRId64 " corruptions\n\n"
877                      "Double checking the fixed image now...\n",
878                      check->leaks_fixed,
879                      check->corruptions_fixed);
880          }
881  
882          qapi_free_ImageCheck(check);
883          check = g_new0(ImageCheck, 1);
884          ret = collect_image_check(bs, check, filename, fmt, 0);
885  
886          check->leaks_fixed          = leaks_fixed;
887          check->has_leaks_fixed      = has_leaks_fixed;
888          check->corruptions_fixed    = corruptions_fixed;
889          check->has_corruptions_fixed = has_corruptions_fixed;
890      }
891  
892      if (!ret) {
893          switch (output_format) {
894          case OFORMAT_HUMAN:
895              dump_human_image_check(check, quiet);
896              break;
897          case OFORMAT_JSON:
898              dump_json_image_check(check, quiet);
899              break;
900          }
901      }
902  
903      if (ret || check->check_errors) {
904          if (ret) {
905              error_report("Check failed: %s", strerror(-ret));
906          } else {
907              error_report("Check failed");
908          }
909          ret = 1;
910          goto fail;
911      }
912  
913      if (check->corruptions) {
914          ret = 2;
915      } else if (check->leaks) {
916          ret = 3;
917      } else {
918          ret = 0;
919      }
920  
921  fail:
922      qapi_free_ImageCheck(check);
923      blk_unref(blk);
924      return ret;
925  }
926  
927  typedef struct CommonBlockJobCBInfo {
928      BlockDriverState *bs;
929      Error **errp;
930  } CommonBlockJobCBInfo;
931  
932  static void common_block_job_cb(void *opaque, int ret)
933  {
934      CommonBlockJobCBInfo *cbi = opaque;
935  
936      if (ret < 0) {
937          error_setg_errno(cbi->errp, -ret, "Block job failed");
938      }
939  }
940  
941  static void run_block_job(BlockJob *job, Error **errp)
942  {
943      AioContext *aio_context = blk_get_aio_context(job->blk);
944      int ret = 0;
945  
946      aio_context_acquire(aio_context);
947      job_ref(&job->job);
948      do {
949          float progress = 0.0f;
950          aio_poll(aio_context, true);
951          if (job->job.progress.total) {
952              progress = (float)job->job.progress.current /
953                         job->job.progress.total * 100.f;
954          }
955          qemu_progress_print(progress, 0);
956      } while (!job_is_ready(&job->job) && !job_is_completed(&job->job));
957  
958      if (!job_is_completed(&job->job)) {
959          ret = job_complete_sync(&job->job, errp);
960      } else {
961          ret = job->job.ret;
962      }
963      job_unref(&job->job);
964      aio_context_release(aio_context);
965  
966      /* publish completion progress only when success */
967      if (!ret) {
968          qemu_progress_print(100.f, 0);
969      }
970  }
971  
972  static int img_commit(int argc, char **argv)
973  {
974      int c, ret, flags;
975      const char *filename, *fmt, *cache, *base;
976      BlockBackend *blk;
977      BlockDriverState *bs, *base_bs;
978      BlockJob *job;
979      bool progress = false, quiet = false, drop = false;
980      bool writethrough;
981      Error *local_err = NULL;
982      CommonBlockJobCBInfo cbi;
983      bool image_opts = false;
984      AioContext *aio_context;
985      int64_t rate_limit = 0;
986  
987      fmt = NULL;
988      cache = BDRV_DEFAULT_CACHE;
989      base = NULL;
990      for(;;) {
991          static const struct option long_options[] = {
992              {"help", no_argument, 0, 'h'},
993              {"object", required_argument, 0, OPTION_OBJECT},
994              {"image-opts", no_argument, 0, OPTION_IMAGE_OPTS},
995              {0, 0, 0, 0}
996          };
997          c = getopt_long(argc, argv, ":f:ht:b:dpqr:",
998                          long_options, NULL);
999          if (c == -1) {
1000              break;
1001          }
1002          switch(c) {
1003          case ':':
1004              missing_argument(argv[optind - 1]);
1005              break;
1006          case '?':
1007              unrecognized_option(argv[optind - 1]);
1008              break;
1009          case 'h':
1010              help();
1011              break;
1012          case 'f':
1013              fmt = optarg;
1014              break;
1015          case 't':
1016              cache = optarg;
1017              break;
1018          case 'b':
1019              base = optarg;
1020              /* -b implies -d */
1021              drop = true;
1022              break;
1023          case 'd':
1024              drop = true;
1025              break;
1026          case 'p':
1027              progress = true;
1028              break;
1029          case 'q':
1030              quiet = true;
1031              break;
1032          case 'r':
1033              rate_limit = cvtnum("rate limit", optarg);
1034              if (rate_limit < 0) {
1035                  return 1;
1036              }
1037              break;
1038          case OPTION_OBJECT: {
1039              QemuOpts *opts;
1040              opts = qemu_opts_parse_noisily(&qemu_object_opts,
1041                                             optarg, true);
1042              if (!opts) {
1043                  return 1;
1044              }
1045          }   break;
1046          case OPTION_IMAGE_OPTS:
1047              image_opts = true;
1048              break;
1049          }
1050      }
1051  
1052      /* Progress is not shown in Quiet mode */
1053      if (quiet) {
1054          progress = false;
1055      }
1056  
1057      if (optind != argc - 1) {
1058          error_exit("Expecting one image file name");
1059      }
1060      filename = argv[optind++];
1061  
1062      if (qemu_opts_foreach(&qemu_object_opts,
1063                            user_creatable_add_opts_foreach,
1064                            qemu_img_object_print_help, &error_fatal)) {
1065          return 1;
1066      }
1067  
1068      flags = BDRV_O_RDWR | BDRV_O_UNMAP;
1069      ret = bdrv_parse_cache_mode(cache, &flags, &writethrough);
1070      if (ret < 0) {
1071          error_report("Invalid cache option: %s", cache);
1072          return 1;
1073      }
1074  
1075      blk = img_open(image_opts, filename, fmt, flags, writethrough, quiet,
1076                     false);
1077      if (!blk) {
1078          return 1;
1079      }
1080      bs = blk_bs(blk);
1081  
1082      qemu_progress_init(progress, 1.f);
1083      qemu_progress_print(0.f, 100);
1084  
1085      if (base) {
1086          base_bs = bdrv_find_backing_image(bs, base);
1087          if (!base_bs) {
1088              error_setg(&local_err,
1089                         "Did not find '%s' in the backing chain of '%s'",
1090                         base, filename);
1091              goto done;
1092          }
1093      } else {
1094          /* This is different from QMP, which by default uses the deepest file in
1095           * the backing chain (i.e., the very base); however, the traditional
1096           * behavior of qemu-img commit is using the immediate backing file. */
1097          base_bs = bdrv_backing_chain_next(bs);
1098          if (!base_bs) {
1099              error_setg(&local_err, "Image does not have a backing file");
1100              goto done;
1101          }
1102      }
1103  
1104      cbi = (CommonBlockJobCBInfo){
1105          .errp = &local_err,
1106          .bs   = bs,
1107      };
1108  
1109      aio_context = bdrv_get_aio_context(bs);
1110      aio_context_acquire(aio_context);
1111      commit_active_start("commit", bs, base_bs, JOB_DEFAULT, rate_limit,
1112                          BLOCKDEV_ON_ERROR_REPORT, NULL, common_block_job_cb,
1113                          &cbi, false, &local_err);
1114      aio_context_release(aio_context);
1115      if (local_err) {
1116          goto done;
1117      }
1118  
1119      /* When the block job completes, the BlockBackend reference will point to
1120       * the old backing file. In order to avoid that the top image is already
1121       * deleted, so we can still empty it afterwards, increment the reference
1122       * counter here preemptively. */
1123      if (!drop) {
1124          bdrv_ref(bs);
1125      }
1126  
1127      job = block_job_get("commit");
1128      assert(job);
1129      run_block_job(job, &local_err);
1130      if (local_err) {
1131          goto unref_backing;
1132      }
1133  
1134      if (!drop) {
1135          BlockBackend *old_backing_blk;
1136  
1137          old_backing_blk = blk_new_with_bs(bs, BLK_PERM_WRITE, BLK_PERM_ALL,
1138                                            &local_err);
1139          if (!old_backing_blk) {
1140              goto unref_backing;
1141          }
1142          ret = blk_make_empty(old_backing_blk, &local_err);
1143          blk_unref(old_backing_blk);
1144          if (ret == -ENOTSUP) {
1145              error_free(local_err);
1146              local_err = NULL;
1147          } else if (ret < 0) {
1148              goto unref_backing;
1149          }
1150      }
1151  
1152  unref_backing:
1153      if (!drop) {
1154          bdrv_unref(bs);
1155      }
1156  
1157  done:
1158      qemu_progress_end();
1159  
1160      blk_unref(blk);
1161  
1162      if (local_err) {
1163          error_report_err(local_err);
1164          return 1;
1165      }
1166  
1167      qprintf(quiet, "Image committed.\n");
1168      return 0;
1169  }
1170  
1171  /*
1172   * Returns -1 if 'buf' contains only zeroes, otherwise the byte index
1173   * of the first sector boundary within buf where the sector contains a
1174   * non-zero byte.  This function is robust to a buffer that is not
1175   * sector-aligned.
1176   */
1177  static int64_t find_nonzero(const uint8_t *buf, int64_t n)
1178  {
1179      int64_t i;
1180      int64_t end = QEMU_ALIGN_DOWN(n, BDRV_SECTOR_SIZE);
1181  
1182      for (i = 0; i < end; i += BDRV_SECTOR_SIZE) {
1183          if (!buffer_is_zero(buf + i, BDRV_SECTOR_SIZE)) {
1184              return i;
1185          }
1186      }
1187      if (i < n && !buffer_is_zero(buf + i, n - end)) {
1188          return i;
1189      }
1190      return -1;
1191  }
1192  
1193  /*
1194   * Returns true iff the first sector pointed to by 'buf' contains at least
1195   * a non-NUL byte.
1196   *
1197   * 'pnum' is set to the number of sectors (including and immediately following
1198   * the first one) that are known to be in the same allocated/unallocated state.
1199   * The function will try to align the end offset to alignment boundaries so
1200   * that the request will at least end aligned and consecutive requests will
1201   * also start at an aligned offset.
1202   */
1203  static int is_allocated_sectors(const uint8_t *buf, int n, int *pnum,
1204                                  int64_t sector_num, int alignment)
1205  {
1206      bool is_zero;
1207      int i, tail;
1208  
1209      if (n <= 0) {
1210          *pnum = 0;
1211          return 0;
1212      }
1213      is_zero = buffer_is_zero(buf, BDRV_SECTOR_SIZE);
1214      for(i = 1; i < n; i++) {
1215          buf += BDRV_SECTOR_SIZE;
1216          if (is_zero != buffer_is_zero(buf, BDRV_SECTOR_SIZE)) {
1217              break;
1218          }
1219      }
1220  
1221      tail = (sector_num + i) & (alignment - 1);
1222      if (tail) {
1223          if (is_zero && i <= tail) {
1224              /* treat unallocated areas which only consist
1225               * of a small tail as allocated. */
1226              is_zero = false;
1227          }
1228          if (!is_zero) {
1229              /* align up end offset of allocated areas. */
1230              i += alignment - tail;
1231              i = MIN(i, n);
1232          } else {
1233              /* align down end offset of zero areas. */
1234              i -= tail;
1235          }
1236      }
1237      *pnum = i;
1238      return !is_zero;
1239  }
1240  
1241  /*
1242   * Like is_allocated_sectors, but if the buffer starts with a used sector,
1243   * up to 'min' consecutive sectors containing zeros are ignored. This avoids
1244   * breaking up write requests for only small sparse areas.
1245   */
1246  static int is_allocated_sectors_min(const uint8_t *buf, int n, int *pnum,
1247      int min, int64_t sector_num, int alignment)
1248  {
1249      int ret;
1250      int num_checked, num_used;
1251  
1252      if (n < min) {
1253          min = n;
1254      }
1255  
1256      ret = is_allocated_sectors(buf, n, pnum, sector_num, alignment);
1257      if (!ret) {
1258          return ret;
1259      }
1260  
1261      num_used = *pnum;
1262      buf += BDRV_SECTOR_SIZE * *pnum;
1263      n -= *pnum;
1264      sector_num += *pnum;
1265      num_checked = num_used;
1266  
1267      while (n > 0) {
1268          ret = is_allocated_sectors(buf, n, pnum, sector_num, alignment);
1269  
1270          buf += BDRV_SECTOR_SIZE * *pnum;
1271          n -= *pnum;
1272          sector_num += *pnum;
1273          num_checked += *pnum;
1274          if (ret) {
1275              num_used = num_checked;
1276          } else if (*pnum >= min) {
1277              break;
1278          }
1279      }
1280  
1281      *pnum = num_used;
1282      return 1;
1283  }
1284  
1285  /*
1286   * Compares two buffers sector by sector. Returns 0 if the first
1287   * sector of each buffer matches, non-zero otherwise.
1288   *
1289   * pnum is set to the sector-aligned size of the buffer prefix that
1290   * has the same matching status as the first sector.
1291   */
1292  static int compare_buffers(const uint8_t *buf1, const uint8_t *buf2,
1293                             int64_t bytes, int64_t *pnum)
1294  {
1295      bool res;
1296      int64_t i = MIN(bytes, BDRV_SECTOR_SIZE);
1297  
1298      assert(bytes > 0);
1299  
1300      res = !!memcmp(buf1, buf2, i);
1301      while (i < bytes) {
1302          int64_t len = MIN(bytes - i, BDRV_SECTOR_SIZE);
1303  
1304          if (!!memcmp(buf1 + i, buf2 + i, len) != res) {
1305              break;
1306          }
1307          i += len;
1308      }
1309  
1310      *pnum = i;
1311      return res;
1312  }
1313  
1314  #define IO_BUF_SIZE (2 * MiB)
1315  
1316  /*
1317   * Check if passed sectors are empty (not allocated or contain only 0 bytes)
1318   *
1319   * Intended for use by 'qemu-img compare': Returns 0 in case sectors are
1320   * filled with 0, 1 if sectors contain non-zero data (this is a comparison
1321   * failure), and 4 on error (the exit status for read errors), after emitting
1322   * an error message.
1323   *
1324   * @param blk:  BlockBackend for the image
1325   * @param offset: Starting offset to check
1326   * @param bytes: Number of bytes to check
1327   * @param filename: Name of disk file we are checking (logging purpose)
1328   * @param buffer: Allocated buffer for storing read data
1329   * @param quiet: Flag for quiet mode
1330   */
1331  static int check_empty_sectors(BlockBackend *blk, int64_t offset,
1332                                 int64_t bytes, const char *filename,
1333                                 uint8_t *buffer, bool quiet)
1334  {
1335      int ret = 0;
1336      int64_t idx;
1337  
1338      ret = blk_pread(blk, offset, buffer, bytes);
1339      if (ret < 0) {
1340          error_report("Error while reading offset %" PRId64 " of %s: %s",
1341                       offset, filename, strerror(-ret));
1342          return 4;
1343      }
1344      idx = find_nonzero(buffer, bytes);
1345      if (idx >= 0) {
1346          qprintf(quiet, "Content mismatch at offset %" PRId64 "!\n",
1347                  offset + idx);
1348          return 1;
1349      }
1350  
1351      return 0;
1352  }
1353  
1354  /*
1355   * Compares two images. Exit codes:
1356   *
1357   * 0 - Images are identical
1358   * 1 - Images differ
1359   * >1 - Error occurred
1360   */
1361  static int img_compare(int argc, char **argv)
1362  {
1363      const char *fmt1 = NULL, *fmt2 = NULL, *cache, *filename1, *filename2;
1364      BlockBackend *blk1, *blk2;
1365      BlockDriverState *bs1, *bs2;
1366      int64_t total_size1, total_size2;
1367      uint8_t *buf1 = NULL, *buf2 = NULL;
1368      int64_t pnum1, pnum2;
1369      int allocated1, allocated2;
1370      int ret = 0; /* return value - 0 Ident, 1 Different, >1 Error */
1371      bool progress = false, quiet = false, strict = false;
1372      int flags;
1373      bool writethrough;
1374      int64_t total_size;
1375      int64_t offset = 0;
1376      int64_t chunk;
1377      int c;
1378      uint64_t progress_base;
1379      bool image_opts = false;
1380      bool force_share = false;
1381  
1382      cache = BDRV_DEFAULT_CACHE;
1383      for (;;) {
1384          static const struct option long_options[] = {
1385              {"help", no_argument, 0, 'h'},
1386              {"object", required_argument, 0, OPTION_OBJECT},
1387              {"image-opts", no_argument, 0, OPTION_IMAGE_OPTS},
1388              {"force-share", no_argument, 0, 'U'},
1389              {0, 0, 0, 0}
1390          };
1391          c = getopt_long(argc, argv, ":hf:F:T:pqsU",
1392                          long_options, NULL);
1393          if (c == -1) {
1394              break;
1395          }
1396          switch (c) {
1397          case ':':
1398              missing_argument(argv[optind - 1]);
1399              break;
1400          case '?':
1401              unrecognized_option(argv[optind - 1]);
1402              break;
1403          case 'h':
1404              help();
1405              break;
1406          case 'f':
1407              fmt1 = optarg;
1408              break;
1409          case 'F':
1410              fmt2 = optarg;
1411              break;
1412          case 'T':
1413              cache = optarg;
1414              break;
1415          case 'p':
1416              progress = true;
1417              break;
1418          case 'q':
1419              quiet = true;
1420              break;
1421          case 's':
1422              strict = true;
1423              break;
1424          case 'U':
1425              force_share = true;
1426              break;
1427          case OPTION_OBJECT: {
1428              QemuOpts *opts;
1429              opts = qemu_opts_parse_noisily(&qemu_object_opts,
1430                                             optarg, true);
1431              if (!opts) {
1432                  ret = 2;
1433                  goto out4;
1434              }
1435          }   break;
1436          case OPTION_IMAGE_OPTS:
1437              image_opts = true;
1438              break;
1439          }
1440      }
1441  
1442      /* Progress is not shown in Quiet mode */
1443      if (quiet) {
1444          progress = false;
1445      }
1446  
1447  
1448      if (optind != argc - 2) {
1449          error_exit("Expecting two image file names");
1450      }
1451      filename1 = argv[optind++];
1452      filename2 = argv[optind++];
1453  
1454      if (qemu_opts_foreach(&qemu_object_opts,
1455                            user_creatable_add_opts_foreach,
1456                            qemu_img_object_print_help, &error_fatal)) {
1457          ret = 2;
1458          goto out4;
1459      }
1460  
1461      /* Initialize before goto out */
1462      qemu_progress_init(progress, 2.0);
1463  
1464      flags = 0;
1465      ret = bdrv_parse_cache_mode(cache, &flags, &writethrough);
1466      if (ret < 0) {
1467          error_report("Invalid source cache option: %s", cache);
1468          ret = 2;
1469          goto out3;
1470      }
1471  
1472      blk1 = img_open(image_opts, filename1, fmt1, flags, writethrough, quiet,
1473                      force_share);
1474      if (!blk1) {
1475          ret = 2;
1476          goto out3;
1477      }
1478  
1479      blk2 = img_open(image_opts, filename2, fmt2, flags, writethrough, quiet,
1480                      force_share);
1481      if (!blk2) {
1482          ret = 2;
1483          goto out2;
1484      }
1485      bs1 = blk_bs(blk1);
1486      bs2 = blk_bs(blk2);
1487  
1488      buf1 = blk_blockalign(blk1, IO_BUF_SIZE);
1489      buf2 = blk_blockalign(blk2, IO_BUF_SIZE);
1490      total_size1 = blk_getlength(blk1);
1491      if (total_size1 < 0) {
1492          error_report("Can't get size of %s: %s",
1493                       filename1, strerror(-total_size1));
1494          ret = 4;
1495          goto out;
1496      }
1497      total_size2 = blk_getlength(blk2);
1498      if (total_size2 < 0) {
1499          error_report("Can't get size of %s: %s",
1500                       filename2, strerror(-total_size2));
1501          ret = 4;
1502          goto out;
1503      }
1504      total_size = MIN(total_size1, total_size2);
1505      progress_base = MAX(total_size1, total_size2);
1506  
1507      qemu_progress_print(0, 100);
1508  
1509      if (strict && total_size1 != total_size2) {
1510          ret = 1;
1511          qprintf(quiet, "Strict mode: Image size mismatch!\n");
1512          goto out;
1513      }
1514  
1515      while (offset < total_size) {
1516          int status1, status2;
1517  
1518          status1 = bdrv_block_status_above(bs1, NULL, offset,
1519                                            total_size1 - offset, &pnum1, NULL,
1520                                            NULL);
1521          if (status1 < 0) {
1522              ret = 3;
1523              error_report("Sector allocation test failed for %s", filename1);
1524              goto out;
1525          }
1526          allocated1 = status1 & BDRV_BLOCK_ALLOCATED;
1527  
1528          status2 = bdrv_block_status_above(bs2, NULL, offset,
1529                                            total_size2 - offset, &pnum2, NULL,
1530                                            NULL);
1531          if (status2 < 0) {
1532              ret = 3;
1533              error_report("Sector allocation test failed for %s", filename2);
1534              goto out;
1535          }
1536          allocated2 = status2 & BDRV_BLOCK_ALLOCATED;
1537  
1538          assert(pnum1 && pnum2);
1539          chunk = MIN(pnum1, pnum2);
1540  
1541          if (strict) {
1542              if (status1 != status2) {
1543                  ret = 1;
1544                  qprintf(quiet, "Strict mode: Offset %" PRId64
1545                          " block status mismatch!\n", offset);
1546                  goto out;
1547              }
1548          }
1549          if ((status1 & BDRV_BLOCK_ZERO) && (status2 & BDRV_BLOCK_ZERO)) {
1550              /* nothing to do */
1551          } else if (allocated1 == allocated2) {
1552              if (allocated1) {
1553                  int64_t pnum;
1554  
1555                  chunk = MIN(chunk, IO_BUF_SIZE);
1556                  ret = blk_pread(blk1, offset, buf1, chunk);
1557                  if (ret < 0) {
1558                      error_report("Error while reading offset %" PRId64
1559                                   " of %s: %s",
1560                                   offset, filename1, strerror(-ret));
1561                      ret = 4;
1562                      goto out;
1563                  }
1564                  ret = blk_pread(blk2, offset, buf2, chunk);
1565                  if (ret < 0) {
1566                      error_report("Error while reading offset %" PRId64
1567                                   " of %s: %s",
1568                                   offset, filename2, strerror(-ret));
1569                      ret = 4;
1570                      goto out;
1571                  }
1572                  ret = compare_buffers(buf1, buf2, chunk, &pnum);
1573                  if (ret || pnum != chunk) {
1574                      qprintf(quiet, "Content mismatch at offset %" PRId64 "!\n",
1575                              offset + (ret ? 0 : pnum));
1576                      ret = 1;
1577                      goto out;
1578                  }
1579              }
1580          } else {
1581              chunk = MIN(chunk, IO_BUF_SIZE);
1582              if (allocated1) {
1583                  ret = check_empty_sectors(blk1, offset, chunk,
1584                                            filename1, buf1, quiet);
1585              } else {
1586                  ret = check_empty_sectors(blk2, offset, chunk,
1587                                            filename2, buf1, quiet);
1588              }
1589              if (ret) {
1590                  goto out;
1591              }
1592          }
1593          offset += chunk;
1594          qemu_progress_print(((float) chunk / progress_base) * 100, 100);
1595      }
1596  
1597      if (total_size1 != total_size2) {
1598          BlockBackend *blk_over;
1599          const char *filename_over;
1600  
1601          qprintf(quiet, "Warning: Image size mismatch!\n");
1602          if (total_size1 > total_size2) {
1603              blk_over = blk1;
1604              filename_over = filename1;
1605          } else {
1606              blk_over = blk2;
1607              filename_over = filename2;
1608          }
1609  
1610          while (offset < progress_base) {
1611              ret = bdrv_block_status_above(blk_bs(blk_over), NULL, offset,
1612                                            progress_base - offset, &chunk,
1613                                            NULL, NULL);
1614              if (ret < 0) {
1615                  ret = 3;
1616                  error_report("Sector allocation test failed for %s",
1617                               filename_over);
1618                  goto out;
1619  
1620              }
1621              if (ret & BDRV_BLOCK_ALLOCATED && !(ret & BDRV_BLOCK_ZERO)) {
1622                  chunk = MIN(chunk, IO_BUF_SIZE);
1623                  ret = check_empty_sectors(blk_over, offset, chunk,
1624                                            filename_over, buf1, quiet);
1625                  if (ret) {
1626                      goto out;
1627                  }
1628              }
1629              offset += chunk;
1630              qemu_progress_print(((float) chunk / progress_base) * 100, 100);
1631          }
1632      }
1633  
1634      qprintf(quiet, "Images are identical.\n");
1635      ret = 0;
1636  
1637  out:
1638      qemu_vfree(buf1);
1639      qemu_vfree(buf2);
1640      blk_unref(blk2);
1641  out2:
1642      blk_unref(blk1);
1643  out3:
1644      qemu_progress_end();
1645  out4:
1646      return ret;
1647  }
1648  
1649  /* Convenience wrapper around qmp_block_dirty_bitmap_merge */
1650  static void do_dirty_bitmap_merge(const char *dst_node, const char *dst_name,
1651                                    const char *src_node, const char *src_name,
1652                                    Error **errp)
1653  {
1654      BlockDirtyBitmapMergeSource *merge_src;
1655      BlockDirtyBitmapMergeSourceList *list = NULL;
1656  
1657      merge_src = g_new0(BlockDirtyBitmapMergeSource, 1);
1658      merge_src->type = QTYPE_QDICT;
1659      merge_src->u.external.node = g_strdup(src_node);
1660      merge_src->u.external.name = g_strdup(src_name);
1661      QAPI_LIST_PREPEND(list, merge_src);
1662      qmp_block_dirty_bitmap_merge(dst_node, dst_name, list, errp);
1663      qapi_free_BlockDirtyBitmapMergeSourceList(list);
1664  }
1665  
1666  enum ImgConvertBlockStatus {
1667      BLK_DATA,
1668      BLK_ZERO,
1669      BLK_BACKING_FILE,
1670  };
1671  
1672  #define MAX_COROUTINES 16
1673  #define CONVERT_THROTTLE_GROUP "img_convert"
1674  
1675  typedef struct ImgConvertState {
1676      BlockBackend **src;
1677      int64_t *src_sectors;
1678      int *src_alignment;
1679      int src_num;
1680      int64_t total_sectors;
1681      int64_t allocated_sectors;
1682      int64_t allocated_done;
1683      int64_t sector_num;
1684      int64_t wr_offs;
1685      enum ImgConvertBlockStatus status;
1686      int64_t sector_next_status;
1687      BlockBackend *target;
1688      bool has_zero_init;
1689      bool compressed;
1690      bool target_is_new;
1691      bool target_has_backing;
1692      int64_t target_backing_sectors; /* negative if unknown */
1693      bool wr_in_order;
1694      bool copy_range;
1695      bool salvage;
1696      bool quiet;
1697      int min_sparse;
1698      int alignment;
1699      size_t cluster_sectors;
1700      size_t buf_sectors;
1701      long num_coroutines;
1702      int running_coroutines;
1703      Coroutine *co[MAX_COROUTINES];
1704      int64_t wait_sector_num[MAX_COROUTINES];
1705      CoMutex lock;
1706      int ret;
1707  } ImgConvertState;
1708  
1709  static void convert_select_part(ImgConvertState *s, int64_t sector_num,
1710                                  int *src_cur, int64_t *src_cur_offset)
1711  {
1712      *src_cur = 0;
1713      *src_cur_offset = 0;
1714      while (sector_num - *src_cur_offset >= s->src_sectors[*src_cur]) {
1715          *src_cur_offset += s->src_sectors[*src_cur];
1716          (*src_cur)++;
1717          assert(*src_cur < s->src_num);
1718      }
1719  }
1720  
1721  static int convert_iteration_sectors(ImgConvertState *s, int64_t sector_num)
1722  {
1723      int64_t src_cur_offset;
1724      int ret, n, src_cur;
1725      bool post_backing_zero = false;
1726  
1727      convert_select_part(s, sector_num, &src_cur, &src_cur_offset);
1728  
1729      assert(s->total_sectors > sector_num);
1730      n = MIN(s->total_sectors - sector_num, BDRV_REQUEST_MAX_SECTORS);
1731  
1732      if (s->target_backing_sectors >= 0) {
1733          if (sector_num >= s->target_backing_sectors) {
1734              post_backing_zero = true;
1735          } else if (sector_num + n > s->target_backing_sectors) {
1736              /* Split requests around target_backing_sectors (because
1737               * starting from there, zeros are handled differently) */
1738              n = s->target_backing_sectors - sector_num;
1739          }
1740      }
1741  
1742      if (s->sector_next_status <= sector_num) {
1743          uint64_t offset = (sector_num - src_cur_offset) * BDRV_SECTOR_SIZE;
1744          int64_t count;
1745          int tail;
1746          BlockDriverState *src_bs = blk_bs(s->src[src_cur]);
1747          BlockDriverState *base;
1748  
1749          if (s->target_has_backing) {
1750              base = bdrv_cow_bs(bdrv_skip_filters(src_bs));
1751          } else {
1752              base = NULL;
1753          }
1754  
1755          do {
1756              count = n * BDRV_SECTOR_SIZE;
1757  
1758              ret = bdrv_block_status_above(src_bs, base, offset, count, &count,
1759                                            NULL, NULL);
1760  
1761              if (ret < 0) {
1762                  if (s->salvage) {
1763                      if (n == 1) {
1764                          if (!s->quiet) {
1765                              warn_report("error while reading block status at "
1766                                          "offset %" PRIu64 ": %s", offset,
1767                                          strerror(-ret));
1768                          }
1769                          /* Just try to read the data, then */
1770                          ret = BDRV_BLOCK_DATA;
1771                          count = BDRV_SECTOR_SIZE;
1772                      } else {
1773                          /* Retry on a shorter range */
1774                          n = DIV_ROUND_UP(n, 4);
1775                      }
1776                  } else {
1777                      error_report("error while reading block status at offset "
1778                                   "%" PRIu64 ": %s", offset, strerror(-ret));
1779                      return ret;
1780                  }
1781              }
1782          } while (ret < 0);
1783  
1784          n = DIV_ROUND_UP(count, BDRV_SECTOR_SIZE);
1785  
1786          /*
1787           * Avoid that s->sector_next_status becomes unaligned to the source
1788           * request alignment and/or cluster size to avoid unnecessary read
1789           * cycles.
1790           */
1791          tail = (sector_num - src_cur_offset + n) % s->src_alignment[src_cur];
1792          if (n > tail) {
1793              n -= tail;
1794          }
1795  
1796          if (ret & BDRV_BLOCK_ZERO) {
1797              s->status = post_backing_zero ? BLK_BACKING_FILE : BLK_ZERO;
1798          } else if (ret & BDRV_BLOCK_DATA) {
1799              s->status = BLK_DATA;
1800          } else {
1801              s->status = s->target_has_backing ? BLK_BACKING_FILE : BLK_DATA;
1802          }
1803  
1804          s->sector_next_status = sector_num + n;
1805      }
1806  
1807      n = MIN(n, s->sector_next_status - sector_num);
1808      if (s->status == BLK_DATA) {
1809          n = MIN(n, s->buf_sectors);
1810      }
1811  
1812      /* We need to write complete clusters for compressed images, so if an
1813       * unallocated area is shorter than that, we must consider the whole
1814       * cluster allocated. */
1815      if (s->compressed) {
1816          if (n < s->cluster_sectors) {
1817              n = MIN(s->cluster_sectors, s->total_sectors - sector_num);
1818              s->status = BLK_DATA;
1819          } else {
1820              n = QEMU_ALIGN_DOWN(n, s->cluster_sectors);
1821          }
1822      }
1823  
1824      return n;
1825  }
1826  
1827  static int coroutine_fn convert_co_read(ImgConvertState *s, int64_t sector_num,
1828                                          int nb_sectors, uint8_t *buf)
1829  {
1830      uint64_t single_read_until = 0;
1831      int n, ret;
1832  
1833      assert(nb_sectors <= s->buf_sectors);
1834      while (nb_sectors > 0) {
1835          BlockBackend *blk;
1836          int src_cur;
1837          int64_t bs_sectors, src_cur_offset;
1838          uint64_t offset;
1839  
1840          /* In the case of compression with multiple source files, we can get a
1841           * nb_sectors that spreads into the next part. So we must be able to
1842           * read across multiple BDSes for one convert_read() call. */
1843          convert_select_part(s, sector_num, &src_cur, &src_cur_offset);
1844          blk = s->src[src_cur];
1845          bs_sectors = s->src_sectors[src_cur];
1846  
1847          offset = (sector_num - src_cur_offset) << BDRV_SECTOR_BITS;
1848  
1849          n = MIN(nb_sectors, bs_sectors - (sector_num - src_cur_offset));
1850          if (single_read_until > offset) {
1851              n = 1;
1852          }
1853  
1854          ret = blk_co_pread(blk, offset, n << BDRV_SECTOR_BITS, buf, 0);
1855          if (ret < 0) {
1856              if (s->salvage) {
1857                  if (n > 1) {
1858                      single_read_until = offset + (n << BDRV_SECTOR_BITS);
1859                      continue;
1860                  } else {
1861                      if (!s->quiet) {
1862                          warn_report("error while reading offset %" PRIu64
1863                                      ": %s", offset, strerror(-ret));
1864                      }
1865                      memset(buf, 0, BDRV_SECTOR_SIZE);
1866                  }
1867              } else {
1868                  return ret;
1869              }
1870          }
1871  
1872          sector_num += n;
1873          nb_sectors -= n;
1874          buf += n * BDRV_SECTOR_SIZE;
1875      }
1876  
1877      return 0;
1878  }
1879  
1880  
1881  static int coroutine_fn convert_co_write(ImgConvertState *s, int64_t sector_num,
1882                                           int nb_sectors, uint8_t *buf,
1883                                           enum ImgConvertBlockStatus status)
1884  {
1885      int ret;
1886  
1887      while (nb_sectors > 0) {
1888          int n = nb_sectors;
1889          BdrvRequestFlags flags = s->compressed ? BDRV_REQ_WRITE_COMPRESSED : 0;
1890  
1891          switch (status) {
1892          case BLK_BACKING_FILE:
1893              /* If we have a backing file, leave clusters unallocated that are
1894               * unallocated in the source image, so that the backing file is
1895               * visible at the respective offset. */
1896              assert(s->target_has_backing);
1897              break;
1898  
1899          case BLK_DATA:
1900              /* If we're told to keep the target fully allocated (-S 0) or there
1901               * is real non-zero data, we must write it. Otherwise we can treat
1902               * it as zero sectors.
1903               * Compressed clusters need to be written as a whole, so in that
1904               * case we can only save the write if the buffer is completely
1905               * zeroed. */
1906              if (!s->min_sparse ||
1907                  (!s->compressed &&
1908                   is_allocated_sectors_min(buf, n, &n, s->min_sparse,
1909                                            sector_num, s->alignment)) ||
1910                  (s->compressed &&
1911                   !buffer_is_zero(buf, n * BDRV_SECTOR_SIZE)))
1912              {
1913                  ret = blk_co_pwrite(s->target, sector_num << BDRV_SECTOR_BITS,
1914                                      n << BDRV_SECTOR_BITS, buf, flags);
1915                  if (ret < 0) {
1916                      return ret;
1917                  }
1918                  break;
1919              }
1920              /* fall-through */
1921  
1922          case BLK_ZERO:
1923              if (s->has_zero_init) {
1924                  assert(!s->target_has_backing);
1925                  break;
1926              }
1927              ret = blk_co_pwrite_zeroes(s->target,
1928                                         sector_num << BDRV_SECTOR_BITS,
1929                                         n << BDRV_SECTOR_BITS,
1930                                         BDRV_REQ_MAY_UNMAP);
1931              if (ret < 0) {
1932                  return ret;
1933              }
1934              break;
1935          }
1936  
1937          sector_num += n;
1938          nb_sectors -= n;
1939          buf += n * BDRV_SECTOR_SIZE;
1940      }
1941  
1942      return 0;
1943  }
1944  
1945  static int coroutine_fn convert_co_copy_range(ImgConvertState *s, int64_t sector_num,
1946                                                int nb_sectors)
1947  {
1948      int n, ret;
1949  
1950      while (nb_sectors > 0) {
1951          BlockBackend *blk;
1952          int src_cur;
1953          int64_t bs_sectors, src_cur_offset;
1954          int64_t offset;
1955  
1956          convert_select_part(s, sector_num, &src_cur, &src_cur_offset);
1957          offset = (sector_num - src_cur_offset) << BDRV_SECTOR_BITS;
1958          blk = s->src[src_cur];
1959          bs_sectors = s->src_sectors[src_cur];
1960  
1961          n = MIN(nb_sectors, bs_sectors - (sector_num - src_cur_offset));
1962  
1963          ret = blk_co_copy_range(blk, offset, s->target,
1964                                  sector_num << BDRV_SECTOR_BITS,
1965                                  n << BDRV_SECTOR_BITS, 0, 0);
1966          if (ret < 0) {
1967              return ret;
1968          }
1969  
1970          sector_num += n;
1971          nb_sectors -= n;
1972      }
1973      return 0;
1974  }
1975  
1976  static void coroutine_fn convert_co_do_copy(void *opaque)
1977  {
1978      ImgConvertState *s = opaque;
1979      uint8_t *buf = NULL;
1980      int ret, i;
1981      int index = -1;
1982  
1983      for (i = 0; i < s->num_coroutines; i++) {
1984          if (s->co[i] == qemu_coroutine_self()) {
1985              index = i;
1986              break;
1987          }
1988      }
1989      assert(index >= 0);
1990  
1991      s->running_coroutines++;
1992      buf = blk_blockalign(s->target, s->buf_sectors * BDRV_SECTOR_SIZE);
1993  
1994      while (1) {
1995          int n;
1996          int64_t sector_num;
1997          enum ImgConvertBlockStatus status;
1998          bool copy_range;
1999  
2000          qemu_co_mutex_lock(&s->lock);
2001          if (s->ret != -EINPROGRESS || s->sector_num >= s->total_sectors) {
2002              qemu_co_mutex_unlock(&s->lock);
2003              break;
2004          }
2005          n = convert_iteration_sectors(s, s->sector_num);
2006          if (n < 0) {
2007              qemu_co_mutex_unlock(&s->lock);
2008              s->ret = n;
2009              break;
2010          }
2011          /* save current sector and allocation status to local variables */
2012          sector_num = s->sector_num;
2013          status = s->status;
2014          if (!s->min_sparse && s->status == BLK_ZERO) {
2015              n = MIN(n, s->buf_sectors);
2016          }
2017          /* increment global sector counter so that other coroutines can
2018           * already continue reading beyond this request */
2019          s->sector_num += n;
2020          qemu_co_mutex_unlock(&s->lock);
2021  
2022          if (status == BLK_DATA || (!s->min_sparse && status == BLK_ZERO)) {
2023              s->allocated_done += n;
2024              qemu_progress_print(100.0 * s->allocated_done /
2025                                          s->allocated_sectors, 0);
2026          }
2027  
2028  retry:
2029          copy_range = s->copy_range && s->status == BLK_DATA;
2030          if (status == BLK_DATA && !copy_range) {
2031              ret = convert_co_read(s, sector_num, n, buf);
2032              if (ret < 0) {
2033                  error_report("error while reading at byte %lld: %s",
2034                               sector_num * BDRV_SECTOR_SIZE, strerror(-ret));
2035                  s->ret = ret;
2036              }
2037          } else if (!s->min_sparse && status == BLK_ZERO) {
2038              status = BLK_DATA;
2039              memset(buf, 0x00, n * BDRV_SECTOR_SIZE);
2040          }
2041  
2042          if (s->wr_in_order) {
2043              /* keep writes in order */
2044              while (s->wr_offs != sector_num && s->ret == -EINPROGRESS) {
2045                  s->wait_sector_num[index] = sector_num;
2046                  qemu_coroutine_yield();
2047              }
2048              s->wait_sector_num[index] = -1;
2049          }
2050  
2051          if (s->ret == -EINPROGRESS) {
2052              if (copy_range) {
2053                  ret = convert_co_copy_range(s, sector_num, n);
2054                  if (ret) {
2055                      s->copy_range = false;
2056                      goto retry;
2057                  }
2058              } else {
2059                  ret = convert_co_write(s, sector_num, n, buf, status);
2060              }
2061              if (ret < 0) {
2062                  error_report("error while writing at byte %lld: %s",
2063                               sector_num * BDRV_SECTOR_SIZE, strerror(-ret));
2064                  s->ret = ret;
2065              }
2066          }
2067  
2068          if (s->wr_in_order) {
2069              /* reenter the coroutine that might have waited
2070               * for this write to complete */
2071              s->wr_offs = sector_num + n;
2072              for (i = 0; i < s->num_coroutines; i++) {
2073                  if (s->co[i] && s->wait_sector_num[i] == s->wr_offs) {
2074                      /*
2075                       * A -> B -> A cannot occur because A has
2076                       * s->wait_sector_num[i] == -1 during A -> B.  Therefore
2077                       * B will never enter A during this time window.
2078                       */
2079                      qemu_coroutine_enter(s->co[i]);
2080                      break;
2081                  }
2082              }
2083          }
2084      }
2085  
2086      qemu_vfree(buf);
2087      s->co[index] = NULL;
2088      s->running_coroutines--;
2089      if (!s->running_coroutines && s->ret == -EINPROGRESS) {
2090          /* the convert job finished successfully */
2091          s->ret = 0;
2092      }
2093  }
2094  
2095  static int convert_do_copy(ImgConvertState *s)
2096  {
2097      int ret, i, n;
2098      int64_t sector_num = 0;
2099  
2100      /* Check whether we have zero initialisation or can get it efficiently */
2101      if (!s->has_zero_init && s->target_is_new && s->min_sparse &&
2102          !s->target_has_backing) {
2103          s->has_zero_init = bdrv_has_zero_init(blk_bs(s->target));
2104      }
2105  
2106      /* Allocate buffer for copied data. For compressed images, only one cluster
2107       * can be copied at a time. */
2108      if (s->compressed) {
2109          if (s->cluster_sectors <= 0 || s->cluster_sectors > s->buf_sectors) {
2110              error_report("invalid cluster size");
2111              return -EINVAL;
2112          }
2113          s->buf_sectors = s->cluster_sectors;
2114      }
2115  
2116      while (sector_num < s->total_sectors) {
2117          n = convert_iteration_sectors(s, sector_num);
2118          if (n < 0) {
2119              return n;
2120          }
2121          if (s->status == BLK_DATA || (!s->min_sparse && s->status == BLK_ZERO))
2122          {
2123              s->allocated_sectors += n;
2124          }
2125          sector_num += n;
2126      }
2127  
2128      /* Do the copy */
2129      s->sector_next_status = 0;
2130      s->ret = -EINPROGRESS;
2131  
2132      qemu_co_mutex_init(&s->lock);
2133      for (i = 0; i < s->num_coroutines; i++) {
2134          s->co[i] = qemu_coroutine_create(convert_co_do_copy, s);
2135          s->wait_sector_num[i] = -1;
2136          qemu_coroutine_enter(s->co[i]);
2137      }
2138  
2139      while (s->running_coroutines) {
2140          main_loop_wait(false);
2141      }
2142  
2143      if (s->compressed && !s->ret) {
2144          /* signal EOF to align */
2145          ret = blk_pwrite_compressed(s->target, 0, NULL, 0);
2146          if (ret < 0) {
2147              return ret;
2148          }
2149      }
2150  
2151      return s->ret;
2152  }
2153  
2154  static int convert_copy_bitmaps(BlockDriverState *src, BlockDriverState *dst)
2155  {
2156      BdrvDirtyBitmap *bm;
2157      Error *err = NULL;
2158  
2159      FOR_EACH_DIRTY_BITMAP(src, bm) {
2160          const char *name;
2161  
2162          if (!bdrv_dirty_bitmap_get_persistence(bm)) {
2163              continue;
2164          }
2165          name = bdrv_dirty_bitmap_name(bm);
2166          qmp_block_dirty_bitmap_add(dst->node_name, name,
2167                                     true, bdrv_dirty_bitmap_granularity(bm),
2168                                     true, true,
2169                                     true, !bdrv_dirty_bitmap_enabled(bm),
2170                                     &err);
2171          if (err) {
2172              error_reportf_err(err, "Failed to create bitmap %s: ", name);
2173              return -1;
2174          }
2175  
2176          do_dirty_bitmap_merge(dst->node_name, name, src->node_name, name,
2177                                &err);
2178          if (err) {
2179              error_reportf_err(err, "Failed to populate bitmap %s: ", name);
2180              return -1;
2181          }
2182      }
2183  
2184      return 0;
2185  }
2186  
2187  #define MAX_BUF_SECTORS 32768
2188  
2189  static void set_rate_limit(BlockBackend *blk, int64_t rate_limit)
2190  {
2191      ThrottleConfig cfg;
2192  
2193      throttle_config_init(&cfg);
2194      cfg.buckets[THROTTLE_BPS_WRITE].avg = rate_limit;
2195  
2196      blk_io_limits_enable(blk, CONVERT_THROTTLE_GROUP);
2197      blk_set_io_limits(blk, &cfg);
2198  }
2199  
2200  static int img_convert(int argc, char **argv)
2201  {
2202      int c, bs_i, flags, src_flags = 0;
2203      const char *fmt = NULL, *out_fmt = NULL, *cache = "unsafe",
2204                 *src_cache = BDRV_DEFAULT_CACHE, *out_baseimg = NULL,
2205                 *out_filename, *out_baseimg_param, *snapshot_name = NULL;
2206      BlockDriver *drv = NULL, *proto_drv = NULL;
2207      BlockDriverInfo bdi;
2208      BlockDriverState *out_bs;
2209      QemuOpts *opts = NULL, *sn_opts = NULL;
2210      QemuOptsList *create_opts = NULL;
2211      QDict *open_opts = NULL;
2212      char *options = NULL;
2213      Error *local_err = NULL;
2214      bool writethrough, src_writethrough, image_opts = false,
2215           skip_create = false, progress = false, tgt_image_opts = false;
2216      int64_t ret = -EINVAL;
2217      bool force_share = false;
2218      bool explict_min_sparse = false;
2219      bool bitmaps = false;
2220      int64_t rate_limit = 0;
2221  
2222      ImgConvertState s = (ImgConvertState) {
2223          /* Need at least 4k of zeros for sparse detection */
2224          .min_sparse         = 8,
2225          .copy_range         = false,
2226          .buf_sectors        = IO_BUF_SIZE / BDRV_SECTOR_SIZE,
2227          .wr_in_order        = true,
2228          .num_coroutines     = 8,
2229      };
2230  
2231      for(;;) {
2232          static const struct option long_options[] = {
2233              {"help", no_argument, 0, 'h'},
2234              {"object", required_argument, 0, OPTION_OBJECT},
2235              {"image-opts", no_argument, 0, OPTION_IMAGE_OPTS},
2236              {"force-share", no_argument, 0, 'U'},
2237              {"target-image-opts", no_argument, 0, OPTION_TARGET_IMAGE_OPTS},
2238              {"salvage", no_argument, 0, OPTION_SALVAGE},
2239              {"target-is-zero", no_argument, 0, OPTION_TARGET_IS_ZERO},
2240              {"bitmaps", no_argument, 0, OPTION_BITMAPS},
2241              {0, 0, 0, 0}
2242          };
2243          c = getopt_long(argc, argv, ":hf:O:B:Cco:l:S:pt:T:qnm:WUr:",
2244                          long_options, NULL);
2245          if (c == -1) {
2246              break;
2247          }
2248          switch(c) {
2249          case ':':
2250              missing_argument(argv[optind - 1]);
2251              break;
2252          case '?':
2253              unrecognized_option(argv[optind - 1]);
2254              break;
2255          case 'h':
2256              help();
2257              break;
2258          case 'f':
2259              fmt = optarg;
2260              break;
2261          case 'O':
2262              out_fmt = optarg;
2263              break;
2264          case 'B':
2265              out_baseimg = optarg;
2266              break;
2267          case 'C':
2268              s.copy_range = true;
2269              break;
2270          case 'c':
2271              s.compressed = true;
2272              break;
2273          case 'o':
2274              if (accumulate_options(&options, optarg) < 0) {
2275                  goto fail_getopt;
2276              }
2277              break;
2278          case 'l':
2279              if (strstart(optarg, SNAPSHOT_OPT_BASE, NULL)) {
2280                  sn_opts = qemu_opts_parse_noisily(&internal_snapshot_opts,
2281                                                    optarg, false);
2282                  if (!sn_opts) {
2283                      error_report("Failed in parsing snapshot param '%s'",
2284                                   optarg);
2285                      goto fail_getopt;
2286                  }
2287              } else {
2288                  snapshot_name = optarg;
2289              }
2290              break;
2291          case 'S':
2292          {
2293              int64_t sval;
2294  
2295              sval = cvtnum("buffer size for sparse output", optarg);
2296              if (sval < 0) {
2297                  goto fail_getopt;
2298              } else if (!QEMU_IS_ALIGNED(sval, BDRV_SECTOR_SIZE) ||
2299                  sval / BDRV_SECTOR_SIZE > MAX_BUF_SECTORS) {
2300                  error_report("Invalid buffer size for sparse output specified. "
2301                      "Valid sizes are multiples of %llu up to %llu. Select "
2302                      "0 to disable sparse detection (fully allocates output).",
2303                      BDRV_SECTOR_SIZE, MAX_BUF_SECTORS * BDRV_SECTOR_SIZE);
2304                  goto fail_getopt;
2305              }
2306  
2307              s.min_sparse = sval / BDRV_SECTOR_SIZE;
2308              explict_min_sparse = true;
2309              break;
2310          }
2311          case 'p':
2312              progress = true;
2313              break;
2314          case 't':
2315              cache = optarg;
2316              break;
2317          case 'T':
2318              src_cache = optarg;
2319              break;
2320          case 'q':
2321              s.quiet = true;
2322              break;
2323          case 'n':
2324              skip_create = true;
2325              break;
2326          case 'm':
2327              if (qemu_strtol(optarg, NULL, 0, &s.num_coroutines) ||
2328                  s.num_coroutines < 1 || s.num_coroutines > MAX_COROUTINES) {
2329                  error_report("Invalid number of coroutines. Allowed number of"
2330                               " coroutines is between 1 and %d", MAX_COROUTINES);
2331                  goto fail_getopt;
2332              }
2333              break;
2334          case 'W':
2335              s.wr_in_order = false;
2336              break;
2337          case 'U':
2338              force_share = true;
2339              break;
2340          case 'r':
2341              rate_limit = cvtnum("rate limit", optarg);
2342              if (rate_limit < 0) {
2343                  goto fail_getopt;
2344              }
2345              break;
2346          case OPTION_OBJECT: {
2347              QemuOpts *object_opts;
2348              object_opts = qemu_opts_parse_noisily(&qemu_object_opts,
2349                                                    optarg, true);
2350              if (!object_opts) {
2351                  goto fail_getopt;
2352              }
2353              break;
2354          }
2355          case OPTION_IMAGE_OPTS:
2356              image_opts = true;
2357              break;
2358          case OPTION_SALVAGE:
2359              s.salvage = true;
2360              break;
2361          case OPTION_TARGET_IMAGE_OPTS:
2362              tgt_image_opts = true;
2363              break;
2364          case OPTION_TARGET_IS_ZERO:
2365              /*
2366               * The user asserting that the target is blank has the
2367               * same effect as the target driver supporting zero
2368               * initialisation.
2369               */
2370              s.has_zero_init = true;
2371              break;
2372          case OPTION_BITMAPS:
2373              bitmaps = true;
2374              break;
2375          }
2376      }
2377  
2378      if (!out_fmt && !tgt_image_opts) {
2379          out_fmt = "raw";
2380      }
2381  
2382      if (qemu_opts_foreach(&qemu_object_opts,
2383                            user_creatable_add_opts_foreach,
2384                            qemu_img_object_print_help, &error_fatal)) {
2385          goto fail_getopt;
2386      }
2387  
2388      if (s.compressed && s.copy_range) {
2389          error_report("Cannot enable copy offloading when -c is used");
2390          goto fail_getopt;
2391      }
2392  
2393      if (explict_min_sparse && s.copy_range) {
2394          error_report("Cannot enable copy offloading when -S is used");
2395          goto fail_getopt;
2396      }
2397  
2398      if (s.copy_range && s.salvage) {
2399          error_report("Cannot use copy offloading in salvaging mode");
2400          goto fail_getopt;
2401      }
2402  
2403      if (tgt_image_opts && !skip_create) {
2404          error_report("--target-image-opts requires use of -n flag");
2405          goto fail_getopt;
2406      }
2407  
2408      if (skip_create && options) {
2409          error_report("-o has no effect when skipping image creation");
2410          goto fail_getopt;
2411      }
2412  
2413      if (s.has_zero_init && !skip_create) {
2414          error_report("--target-is-zero requires use of -n flag");
2415          goto fail_getopt;
2416      }
2417  
2418      s.src_num = argc - optind - 1;
2419      out_filename = s.src_num >= 1 ? argv[argc - 1] : NULL;
2420  
2421      if (options && has_help_option(options)) {
2422          if (out_fmt) {
2423              ret = print_block_option_help(out_filename, out_fmt);
2424              goto fail_getopt;
2425          } else {
2426              error_report("Option help requires a format be specified");
2427              goto fail_getopt;
2428          }
2429      }
2430  
2431      if (s.src_num < 1) {
2432          error_report("Must specify image file name");
2433          goto fail_getopt;
2434      }
2435  
2436      /* ret is still -EINVAL until here */
2437      ret = bdrv_parse_cache_mode(src_cache, &src_flags, &src_writethrough);
2438      if (ret < 0) {
2439          error_report("Invalid source cache option: %s", src_cache);
2440          goto fail_getopt;
2441      }
2442  
2443      /* Initialize before goto out */
2444      if (s.quiet) {
2445          progress = false;
2446      }
2447      qemu_progress_init(progress, 1.0);
2448      qemu_progress_print(0, 100);
2449  
2450      s.src = g_new0(BlockBackend *, s.src_num);
2451      s.src_sectors = g_new(int64_t, s.src_num);
2452      s.src_alignment = g_new(int, s.src_num);
2453  
2454      for (bs_i = 0; bs_i < s.src_num; bs_i++) {
2455          BlockDriverState *src_bs;
2456          s.src[bs_i] = img_open(image_opts, argv[optind + bs_i],
2457                                 fmt, src_flags, src_writethrough, s.quiet,
2458                                 force_share);
2459          if (!s.src[bs_i]) {
2460              ret = -1;
2461              goto out;
2462          }
2463          s.src_sectors[bs_i] = blk_nb_sectors(s.src[bs_i]);
2464          if (s.src_sectors[bs_i] < 0) {
2465              error_report("Could not get size of %s: %s",
2466                           argv[optind + bs_i], strerror(-s.src_sectors[bs_i]));
2467              ret = -1;
2468              goto out;
2469          }
2470          src_bs = blk_bs(s.src[bs_i]);
2471          s.src_alignment[bs_i] = DIV_ROUND_UP(src_bs->bl.request_alignment,
2472                                               BDRV_SECTOR_SIZE);
2473          if (!bdrv_get_info(src_bs, &bdi)) {
2474              s.src_alignment[bs_i] = MAX(s.src_alignment[bs_i],
2475                                          bdi.cluster_size / BDRV_SECTOR_SIZE);
2476          }
2477          s.total_sectors += s.src_sectors[bs_i];
2478      }
2479  
2480      if (sn_opts) {
2481          bdrv_snapshot_load_tmp(blk_bs(s.src[0]),
2482                                 qemu_opt_get(sn_opts, SNAPSHOT_OPT_ID),
2483                                 qemu_opt_get(sn_opts, SNAPSHOT_OPT_NAME),
2484                                 &local_err);
2485      } else if (snapshot_name != NULL) {
2486          if (s.src_num > 1) {
2487              error_report("No support for concatenating multiple snapshot");
2488              ret = -1;
2489              goto out;
2490          }
2491  
2492          bdrv_snapshot_load_tmp_by_id_or_name(blk_bs(s.src[0]), snapshot_name,
2493                                               &local_err);
2494      }
2495      if (local_err) {
2496          error_reportf_err(local_err, "Failed to load snapshot: ");
2497          ret = -1;
2498          goto out;
2499      }
2500  
2501      if (!skip_create) {
2502          /* Find driver and parse its options */
2503          drv = bdrv_find_format(out_fmt);
2504          if (!drv) {
2505              error_report("Unknown file format '%s'", out_fmt);
2506              ret = -1;
2507              goto out;
2508          }
2509  
2510          proto_drv = bdrv_find_protocol(out_filename, true, &local_err);
2511          if (!proto_drv) {
2512              error_report_err(local_err);
2513              ret = -1;
2514              goto out;
2515          }
2516  
2517          if (!drv->create_opts) {
2518              error_report("Format driver '%s' does not support image creation",
2519                           drv->format_name);
2520              ret = -1;
2521              goto out;
2522          }
2523  
2524          if (!proto_drv->create_opts) {
2525              error_report("Protocol driver '%s' does not support image creation",
2526                           proto_drv->format_name);
2527              ret = -1;
2528              goto out;
2529          }
2530  
2531          create_opts = qemu_opts_append(create_opts, drv->create_opts);
2532          create_opts = qemu_opts_append(create_opts, proto_drv->create_opts);
2533  
2534          opts = qemu_opts_create(create_opts, NULL, 0, &error_abort);
2535          if (options) {
2536              if (!qemu_opts_do_parse(opts, options, NULL, &local_err)) {
2537                  error_report_err(local_err);
2538                  ret = -1;
2539                  goto out;
2540              }
2541          }
2542  
2543          qemu_opt_set_number(opts, BLOCK_OPT_SIZE,
2544                              s.total_sectors * BDRV_SECTOR_SIZE, &error_abort);
2545          ret = add_old_style_options(out_fmt, opts, out_baseimg, NULL);
2546          if (ret < 0) {
2547              goto out;
2548          }
2549      }
2550  
2551      /* Get backing file name if -o backing_file was used */
2552      out_baseimg_param = qemu_opt_get(opts, BLOCK_OPT_BACKING_FILE);
2553      if (out_baseimg_param) {
2554          out_baseimg = out_baseimg_param;
2555      }
2556      s.target_has_backing = (bool) out_baseimg;
2557  
2558      if (s.has_zero_init && s.target_has_backing) {
2559          error_report("Cannot use --target-is-zero when the destination "
2560                       "image has a backing file");
2561          goto out;
2562      }
2563  
2564      if (s.src_num > 1 && out_baseimg) {
2565          error_report("Having a backing file for the target makes no sense when "
2566                       "concatenating multiple input images");
2567          ret = -1;
2568          goto out;
2569      }
2570  
2571      if (out_baseimg_param) {
2572          if (!qemu_opt_get(opts, BLOCK_OPT_BACKING_FMT)) {
2573              warn_report("Deprecated use of backing file without explicit "
2574                          "backing format");
2575          }
2576      }
2577  
2578      /* Check if compression is supported */
2579      if (s.compressed) {
2580          bool encryption =
2581              qemu_opt_get_bool(opts, BLOCK_OPT_ENCRYPT, false);
2582          const char *encryptfmt =
2583              qemu_opt_get(opts, BLOCK_OPT_ENCRYPT_FORMAT);
2584          const char *preallocation =
2585              qemu_opt_get(opts, BLOCK_OPT_PREALLOC);
2586  
2587          if (drv && !block_driver_can_compress(drv)) {
2588              error_report("Compression not supported for this file format");
2589              ret = -1;
2590              goto out;
2591          }
2592  
2593          if (encryption || encryptfmt) {
2594              error_report("Compression and encryption not supported at "
2595                           "the same time");
2596              ret = -1;
2597              goto out;
2598          }
2599  
2600          if (preallocation
2601              && strcmp(preallocation, "off"))
2602          {
2603              error_report("Compression and preallocation not supported at "
2604                           "the same time");
2605              ret = -1;
2606              goto out;
2607          }
2608      }
2609  
2610      /* Determine if bitmaps need copying */
2611      if (bitmaps) {
2612          if (s.src_num > 1) {
2613              error_report("Copying bitmaps only possible with single source");
2614              ret = -1;
2615              goto out;
2616          }
2617          if (!bdrv_supports_persistent_dirty_bitmap(blk_bs(s.src[0]))) {
2618              error_report("Source lacks bitmap support");
2619              ret = -1;
2620              goto out;
2621          }
2622      }
2623  
2624      /*
2625       * The later open call will need any decryption secrets, and
2626       * bdrv_create() will purge "opts", so extract them now before
2627       * they are lost.
2628       */
2629      if (!skip_create) {
2630          open_opts = qdict_new();
2631          qemu_opt_foreach(opts, img_add_key_secrets, open_opts, &error_abort);
2632  
2633          /* Create the new image */
2634          ret = bdrv_create(drv, out_filename, opts, &local_err);
2635          if (ret < 0) {
2636              error_reportf_err(local_err, "%s: error while converting %s: ",
2637                                out_filename, out_fmt);
2638              goto out;
2639          }
2640      }
2641  
2642      s.target_is_new = !skip_create;
2643  
2644      flags = s.min_sparse ? (BDRV_O_RDWR | BDRV_O_UNMAP) : BDRV_O_RDWR;
2645      ret = bdrv_parse_cache_mode(cache, &flags, &writethrough);
2646      if (ret < 0) {
2647          error_report("Invalid cache option: %s", cache);
2648          goto out;
2649      }
2650  
2651      if (skip_create) {
2652          s.target = img_open(tgt_image_opts, out_filename, out_fmt,
2653                              flags, writethrough, s.quiet, false);
2654      } else {
2655          /* TODO ultimately we should allow --target-image-opts
2656           * to be used even when -n is not given.
2657           * That has to wait for bdrv_create to be improved
2658           * to allow filenames in option syntax
2659           */
2660          s.target = img_open_file(out_filename, open_opts, out_fmt,
2661                                   flags, writethrough, s.quiet, false);
2662          open_opts = NULL; /* blk_new_open will have freed it */
2663      }
2664      if (!s.target) {
2665          ret = -1;
2666          goto out;
2667      }
2668      out_bs = blk_bs(s.target);
2669  
2670      if (bitmaps && !bdrv_supports_persistent_dirty_bitmap(out_bs)) {
2671          error_report("Format driver '%s' does not support bitmaps",
2672                       out_bs->drv->format_name);
2673          ret = -1;
2674          goto out;
2675      }
2676  
2677      if (s.compressed && !block_driver_can_compress(out_bs->drv)) {
2678          error_report("Compression not supported for this file format");
2679          ret = -1;
2680          goto out;
2681      }
2682  
2683      /* increase bufsectors from the default 4096 (2M) if opt_transfer
2684       * or discard_alignment of the out_bs is greater. Limit to
2685       * MAX_BUF_SECTORS as maximum which is currently 32768 (16MB). */
2686      s.buf_sectors = MIN(MAX_BUF_SECTORS,
2687                          MAX(s.buf_sectors,
2688                              MAX(out_bs->bl.opt_transfer >> BDRV_SECTOR_BITS,
2689                                  out_bs->bl.pdiscard_alignment >>
2690                                  BDRV_SECTOR_BITS)));
2691  
2692      /* try to align the write requests to the destination to avoid unnecessary
2693       * RMW cycles. */
2694      s.alignment = MAX(pow2floor(s.min_sparse),
2695                        DIV_ROUND_UP(out_bs->bl.request_alignment,
2696                                     BDRV_SECTOR_SIZE));
2697      assert(is_power_of_2(s.alignment));
2698  
2699      if (skip_create) {
2700          int64_t output_sectors = blk_nb_sectors(s.target);
2701          if (output_sectors < 0) {
2702              error_report("unable to get output image length: %s",
2703                           strerror(-output_sectors));
2704              ret = -1;
2705              goto out;
2706          } else if (output_sectors < s.total_sectors) {
2707              error_report("output file is smaller than input file");
2708              ret = -1;
2709              goto out;
2710          }
2711      }
2712  
2713      if (s.target_has_backing && s.target_is_new) {
2714          /* Errors are treated as "backing length unknown" (which means
2715           * s.target_backing_sectors has to be negative, which it will
2716           * be automatically).  The backing file length is used only
2717           * for optimizations, so such a case is not fatal. */
2718          s.target_backing_sectors =
2719              bdrv_nb_sectors(bdrv_backing_chain_next(out_bs));
2720      } else {
2721          s.target_backing_sectors = -1;
2722      }
2723  
2724      ret = bdrv_get_info(out_bs, &bdi);
2725      if (ret < 0) {
2726          if (s.compressed) {
2727              error_report("could not get block driver info");
2728              goto out;
2729          }
2730      } else {
2731          s.compressed = s.compressed || bdi.needs_compressed_writes;
2732          s.cluster_sectors = bdi.cluster_size / BDRV_SECTOR_SIZE;
2733      }
2734  
2735      if (rate_limit) {
2736          set_rate_limit(s.target, rate_limit);
2737      }
2738  
2739      ret = convert_do_copy(&s);
2740  
2741      /* Now copy the bitmaps */
2742      if (bitmaps && ret == 0) {
2743          ret = convert_copy_bitmaps(blk_bs(s.src[0]), out_bs);
2744      }
2745  
2746  out:
2747      if (!ret) {
2748          qemu_progress_print(100, 0);
2749      }
2750      qemu_progress_end();
2751      qemu_opts_del(opts);
2752      qemu_opts_free(create_opts);
2753      qobject_unref(open_opts);
2754      blk_unref(s.target);
2755      if (s.src) {
2756          for (bs_i = 0; bs_i < s.src_num; bs_i++) {
2757              blk_unref(s.src[bs_i]);
2758          }
2759          g_free(s.src);
2760      }
2761      g_free(s.src_sectors);
2762      g_free(s.src_alignment);
2763  fail_getopt:
2764      qemu_opts_del(sn_opts);
2765      g_free(options);
2766  
2767      return !!ret;
2768  }
2769  
2770  
2771  static void dump_snapshots(BlockDriverState *bs)
2772  {
2773      QEMUSnapshotInfo *sn_tab, *sn;
2774      int nb_sns, i;
2775  
2776      nb_sns = bdrv_snapshot_list(bs, &sn_tab);
2777      if (nb_sns <= 0)
2778          return;
2779      printf("Snapshot list:\n");
2780      bdrv_snapshot_dump(NULL);
2781      printf("\n");
2782      for(i = 0; i < nb_sns; i++) {
2783          sn = &sn_tab[i];
2784          bdrv_snapshot_dump(sn);
2785          printf("\n");
2786      }
2787      g_free(sn_tab);
2788  }
2789  
2790  static void dump_json_image_info_list(ImageInfoList *list)
2791  {
2792      QString *str;
2793      QObject *obj;
2794      Visitor *v = qobject_output_visitor_new(&obj);
2795  
2796      visit_type_ImageInfoList(v, NULL, &list, &error_abort);
2797      visit_complete(v, &obj);
2798      str = qobject_to_json_pretty(obj);
2799      assert(str != NULL);
2800      printf("%s\n", qstring_get_str(str));
2801      qobject_unref(obj);
2802      visit_free(v);
2803      qobject_unref(str);
2804  }
2805  
2806  static void dump_json_image_info(ImageInfo *info)
2807  {
2808      QString *str;
2809      QObject *obj;
2810      Visitor *v = qobject_output_visitor_new(&obj);
2811  
2812      visit_type_ImageInfo(v, NULL, &info, &error_abort);
2813      visit_complete(v, &obj);
2814      str = qobject_to_json_pretty(obj);
2815      assert(str != NULL);
2816      printf("%s\n", qstring_get_str(str));
2817      qobject_unref(obj);
2818      visit_free(v);
2819      qobject_unref(str);
2820  }
2821  
2822  static void dump_human_image_info_list(ImageInfoList *list)
2823  {
2824      ImageInfoList *elem;
2825      bool delim = false;
2826  
2827      for (elem = list; elem; elem = elem->next) {
2828          if (delim) {
2829              printf("\n");
2830          }
2831          delim = true;
2832  
2833          bdrv_image_info_dump(elem->value);
2834      }
2835  }
2836  
2837  static gboolean str_equal_func(gconstpointer a, gconstpointer b)
2838  {
2839      return strcmp(a, b) == 0;
2840  }
2841  
2842  /**
2843   * Open an image file chain and return an ImageInfoList
2844   *
2845   * @filename: topmost image filename
2846   * @fmt: topmost image format (may be NULL to autodetect)
2847   * @chain: true  - enumerate entire backing file chain
2848   *         false - only topmost image file
2849   *
2850   * Returns a list of ImageInfo objects or NULL if there was an error opening an
2851   * image file.  If there was an error a message will have been printed to
2852   * stderr.
2853   */
2854  static ImageInfoList *collect_image_info_list(bool image_opts,
2855                                                const char *filename,
2856                                                const char *fmt,
2857                                                bool chain, bool force_share)
2858  {
2859      ImageInfoList *head = NULL;
2860      ImageInfoList **last = &head;
2861      GHashTable *filenames;
2862      Error *err = NULL;
2863  
2864      filenames = g_hash_table_new_full(g_str_hash, str_equal_func, NULL, NULL);
2865  
2866      while (filename) {
2867          BlockBackend *blk;
2868          BlockDriverState *bs;
2869          ImageInfo *info;
2870          ImageInfoList *elem;
2871  
2872          if (g_hash_table_lookup_extended(filenames, filename, NULL, NULL)) {
2873              error_report("Backing file '%s' creates an infinite loop.",
2874                           filename);
2875              goto err;
2876          }
2877          g_hash_table_insert(filenames, (gpointer)filename, NULL);
2878  
2879          blk = img_open(image_opts, filename, fmt,
2880                         BDRV_O_NO_BACKING | BDRV_O_NO_IO, false, false,
2881                         force_share);
2882          if (!blk) {
2883              goto err;
2884          }
2885          bs = blk_bs(blk);
2886  
2887          bdrv_query_image_info(bs, &info, &err);
2888          if (err) {
2889              error_report_err(err);
2890              blk_unref(blk);
2891              goto err;
2892          }
2893  
2894          elem = g_new0(ImageInfoList, 1);
2895          elem->value = info;
2896          *last = elem;
2897          last = &elem->next;
2898  
2899          blk_unref(blk);
2900  
2901          /* Clear parameters that only apply to the topmost image */
2902          filename = fmt = NULL;
2903          image_opts = false;
2904  
2905          if (chain) {
2906              if (info->has_full_backing_filename) {
2907                  filename = info->full_backing_filename;
2908              } else if (info->has_backing_filename) {
2909                  error_report("Could not determine absolute backing filename,"
2910                               " but backing filename '%s' present",
2911                               info->backing_filename);
2912                  goto err;
2913              }
2914              if (info->has_backing_filename_format) {
2915                  fmt = info->backing_filename_format;
2916              }
2917          }
2918      }
2919      g_hash_table_destroy(filenames);
2920      return head;
2921  
2922  err:
2923      qapi_free_ImageInfoList(head);
2924      g_hash_table_destroy(filenames);
2925      return NULL;
2926  }
2927  
2928  static int img_info(int argc, char **argv)
2929  {
2930      int c;
2931      OutputFormat output_format = OFORMAT_HUMAN;
2932      bool chain = false;
2933      const char *filename, *fmt, *output;
2934      ImageInfoList *list;
2935      bool image_opts = false;
2936      bool force_share = false;
2937  
2938      fmt = NULL;
2939      output = NULL;
2940      for(;;) {
2941          int option_index = 0;
2942          static const struct option long_options[] = {
2943              {"help", no_argument, 0, 'h'},
2944              {"format", required_argument, 0, 'f'},
2945              {"output", required_argument, 0, OPTION_OUTPUT},
2946              {"backing-chain", no_argument, 0, OPTION_BACKING_CHAIN},
2947              {"object", required_argument, 0, OPTION_OBJECT},
2948              {"image-opts", no_argument, 0, OPTION_IMAGE_OPTS},
2949              {"force-share", no_argument, 0, 'U'},
2950              {0, 0, 0, 0}
2951          };
2952          c = getopt_long(argc, argv, ":f:hU",
2953                          long_options, &option_index);
2954          if (c == -1) {
2955              break;
2956          }
2957          switch(c) {
2958          case ':':
2959              missing_argument(argv[optind - 1]);
2960              break;
2961          case '?':
2962              unrecognized_option(argv[optind - 1]);
2963              break;
2964          case 'h':
2965              help();
2966              break;
2967          case 'f':
2968              fmt = optarg;
2969              break;
2970          case 'U':
2971              force_share = true;
2972              break;
2973          case OPTION_OUTPUT:
2974              output = optarg;
2975              break;
2976          case OPTION_BACKING_CHAIN:
2977              chain = true;
2978              break;
2979          case OPTION_OBJECT: {
2980              QemuOpts *opts;
2981              opts = qemu_opts_parse_noisily(&qemu_object_opts,
2982                                             optarg, true);
2983              if (!opts) {
2984                  return 1;
2985              }
2986          }   break;
2987          case OPTION_IMAGE_OPTS:
2988              image_opts = true;
2989              break;
2990          }
2991      }
2992      if (optind != argc - 1) {
2993          error_exit("Expecting one image file name");
2994      }
2995      filename = argv[optind++];
2996  
2997      if (output && !strcmp(output, "json")) {
2998          output_format = OFORMAT_JSON;
2999      } else if (output && !strcmp(output, "human")) {
3000          output_format = OFORMAT_HUMAN;
3001      } else if (output) {
3002          error_report("--output must be used with human or json as argument.");
3003          return 1;
3004      }
3005  
3006      if (qemu_opts_foreach(&qemu_object_opts,
3007                            user_creatable_add_opts_foreach,
3008                            qemu_img_object_print_help, &error_fatal)) {
3009          return 1;
3010      }
3011  
3012      list = collect_image_info_list(image_opts, filename, fmt, chain,
3013                                     force_share);
3014      if (!list) {
3015          return 1;
3016      }
3017  
3018      switch (output_format) {
3019      case OFORMAT_HUMAN:
3020          dump_human_image_info_list(list);
3021          break;
3022      case OFORMAT_JSON:
3023          if (chain) {
3024              dump_json_image_info_list(list);
3025          } else {
3026              dump_json_image_info(list->value);
3027          }
3028          break;
3029      }
3030  
3031      qapi_free_ImageInfoList(list);
3032      return 0;
3033  }
3034  
3035  static int dump_map_entry(OutputFormat output_format, MapEntry *e,
3036                            MapEntry *next)
3037  {
3038      switch (output_format) {
3039      case OFORMAT_HUMAN:
3040          if (e->data && !e->has_offset) {
3041              error_report("File contains external, encrypted or compressed clusters.");
3042              return -1;
3043          }
3044          if (e->data && !e->zero) {
3045              printf("%#-16"PRIx64"%#-16"PRIx64"%#-16"PRIx64"%s\n",
3046                     e->start, e->length,
3047                     e->has_offset ? e->offset : 0,
3048                     e->has_filename ? e->filename : "");
3049          }
3050          /* This format ignores the distinction between 0, ZERO and ZERO|DATA.
3051           * Modify the flags here to allow more coalescing.
3052           */
3053          if (next && (!next->data || next->zero)) {
3054              next->data = false;
3055              next->zero = true;
3056          }
3057          break;
3058      case OFORMAT_JSON:
3059          printf("{ \"start\": %"PRId64", \"length\": %"PRId64","
3060                 " \"depth\": %"PRId64", \"zero\": %s, \"data\": %s",
3061                 e->start, e->length, e->depth,
3062                 e->zero ? "true" : "false",
3063                 e->data ? "true" : "false");
3064          if (e->has_offset) {
3065              printf(", \"offset\": %"PRId64"", e->offset);
3066          }
3067          putchar('}');
3068  
3069          if (next) {
3070              puts(",");
3071          }
3072          break;
3073      }
3074      return 0;
3075  }
3076  
3077  static int get_block_status(BlockDriverState *bs, int64_t offset,
3078                              int64_t bytes, MapEntry *e)
3079  {
3080      int ret;
3081      int depth;
3082      BlockDriverState *file;
3083      bool has_offset;
3084      int64_t map;
3085      char *filename = NULL;
3086  
3087      /* As an optimization, we could cache the current range of unallocated
3088       * clusters in each file of the chain, and avoid querying the same
3089       * range repeatedly.
3090       */
3091  
3092      depth = 0;
3093      for (;;) {
3094          bs = bdrv_skip_filters(bs);
3095          ret = bdrv_block_status(bs, offset, bytes, &bytes, &map, &file);
3096          if (ret < 0) {
3097              return ret;
3098          }
3099          assert(bytes);
3100          if (ret & (BDRV_BLOCK_ZERO|BDRV_BLOCK_DATA)) {
3101              break;
3102          }
3103          bs = bdrv_cow_bs(bs);
3104          if (bs == NULL) {
3105              ret = 0;
3106              break;
3107          }
3108  
3109          depth++;
3110      }
3111  
3112      has_offset = !!(ret & BDRV_BLOCK_OFFSET_VALID);
3113  
3114      if (file && has_offset) {
3115          bdrv_refresh_filename(file);
3116          filename = file->filename;
3117      }
3118  
3119      *e = (MapEntry) {
3120          .start = offset,
3121          .length = bytes,
3122          .data = !!(ret & BDRV_BLOCK_DATA),
3123          .zero = !!(ret & BDRV_BLOCK_ZERO),
3124          .offset = map,
3125          .has_offset = has_offset,
3126          .depth = depth,
3127          .has_filename = filename,
3128          .filename = filename,
3129      };
3130  
3131      return 0;
3132  }
3133  
3134  static inline bool entry_mergeable(const MapEntry *curr, const MapEntry *next)
3135  {
3136      if (curr->length == 0) {
3137          return false;
3138      }
3139      if (curr->zero != next->zero ||
3140          curr->data != next->data ||
3141          curr->depth != next->depth ||
3142          curr->has_filename != next->has_filename ||
3143          curr->has_offset != next->has_offset) {
3144          return false;
3145      }
3146      if (curr->has_filename && strcmp(curr->filename, next->filename)) {
3147          return false;
3148      }
3149      if (curr->has_offset && curr->offset + curr->length != next->offset) {
3150          return false;
3151      }
3152      return true;
3153  }
3154  
3155  static int img_map(int argc, char **argv)
3156  {
3157      int c;
3158      OutputFormat output_format = OFORMAT_HUMAN;
3159      BlockBackend *blk;
3160      BlockDriverState *bs;
3161      const char *filename, *fmt, *output;
3162      int64_t length;
3163      MapEntry curr = { .length = 0 }, next;
3164      int ret = 0;
3165      bool image_opts = false;
3166      bool force_share = false;
3167      int64_t start_offset = 0;
3168      int64_t max_length = -1;
3169  
3170      fmt = NULL;
3171      output = NULL;
3172      for (;;) {
3173          int option_index = 0;
3174          static const struct option long_options[] = {
3175              {"help", no_argument, 0, 'h'},
3176              {"format", required_argument, 0, 'f'},
3177              {"output", required_argument, 0, OPTION_OUTPUT},
3178              {"object", required_argument, 0, OPTION_OBJECT},
3179              {"image-opts", no_argument, 0, OPTION_IMAGE_OPTS},
3180              {"force-share", no_argument, 0, 'U'},
3181              {"start-offset", required_argument, 0, 's'},
3182              {"max-length", required_argument, 0, 'l'},
3183              {0, 0, 0, 0}
3184          };
3185          c = getopt_long(argc, argv, ":f:s:l:hU",
3186                          long_options, &option_index);
3187          if (c == -1) {
3188              break;
3189          }
3190          switch (c) {
3191          case ':':
3192              missing_argument(argv[optind - 1]);
3193              break;
3194          case '?':
3195              unrecognized_option(argv[optind - 1]);
3196              break;
3197          case 'h':
3198              help();
3199              break;
3200          case 'f':
3201              fmt = optarg;
3202              break;
3203          case 'U':
3204              force_share = true;
3205              break;
3206          case OPTION_OUTPUT:
3207              output = optarg;
3208              break;
3209          case 's':
3210              start_offset = cvtnum("start offset", optarg);
3211              if (start_offset < 0) {
3212                  return 1;
3213              }
3214              break;
3215          case 'l':
3216              max_length = cvtnum("max length", optarg);
3217              if (max_length < 0) {
3218                  return 1;
3219              }
3220              break;
3221          case OPTION_OBJECT: {
3222              QemuOpts *opts;
3223              opts = qemu_opts_parse_noisily(&qemu_object_opts,
3224                                             optarg, true);
3225              if (!opts) {
3226                  return 1;
3227              }
3228          }   break;
3229          case OPTION_IMAGE_OPTS:
3230              image_opts = true;
3231              break;
3232          }
3233      }
3234      if (optind != argc - 1) {
3235          error_exit("Expecting one image file name");
3236      }
3237      filename = argv[optind];
3238  
3239      if (output && !strcmp(output, "json")) {
3240          output_format = OFORMAT_JSON;
3241      } else if (output && !strcmp(output, "human")) {
3242          output_format = OFORMAT_HUMAN;
3243      } else if (output) {
3244          error_report("--output must be used with human or json as argument.");
3245          return 1;
3246      }
3247  
3248      if (qemu_opts_foreach(&qemu_object_opts,
3249                            user_creatable_add_opts_foreach,
3250                            qemu_img_object_print_help, &error_fatal)) {
3251          return 1;
3252      }
3253  
3254      blk = img_open(image_opts, filename, fmt, 0, false, false, force_share);
3255      if (!blk) {
3256          return 1;
3257      }
3258      bs = blk_bs(blk);
3259  
3260      if (output_format == OFORMAT_HUMAN) {
3261          printf("%-16s%-16s%-16s%s\n", "Offset", "Length", "Mapped to", "File");
3262      } else if (output_format == OFORMAT_JSON) {
3263          putchar('[');
3264      }
3265  
3266      length = blk_getlength(blk);
3267      if (length < 0) {
3268          error_report("Failed to get size for '%s'", filename);
3269          return 1;
3270      }
3271      if (max_length != -1) {
3272          length = MIN(start_offset + max_length, length);
3273      }
3274  
3275      curr.start = start_offset;
3276      while (curr.start + curr.length < length) {
3277          int64_t offset = curr.start + curr.length;
3278          int64_t n = length - offset;
3279  
3280          ret = get_block_status(bs, offset, n, &next);
3281          if (ret < 0) {
3282              error_report("Could not read file metadata: %s", strerror(-ret));
3283              goto out;
3284          }
3285  
3286          if (entry_mergeable(&curr, &next)) {
3287              curr.length += next.length;
3288              continue;
3289          }
3290  
3291          if (curr.length > 0) {
3292              ret = dump_map_entry(output_format, &curr, &next);
3293              if (ret < 0) {
3294                  goto out;
3295              }
3296          }
3297          curr = next;
3298      }
3299  
3300      ret = dump_map_entry(output_format, &curr, NULL);
3301      if (output_format == OFORMAT_JSON) {
3302          puts("]");
3303      }
3304  
3305  out:
3306      blk_unref(blk);
3307      return ret < 0;
3308  }
3309  
3310  #define SNAPSHOT_LIST   1
3311  #define SNAPSHOT_CREATE 2
3312  #define SNAPSHOT_APPLY  3
3313  #define SNAPSHOT_DELETE 4
3314  
3315  static int img_snapshot(int argc, char **argv)
3316  {
3317      BlockBackend *blk;
3318      BlockDriverState *bs;
3319      QEMUSnapshotInfo sn;
3320      char *filename, *snapshot_name = NULL;
3321      int c, ret = 0, bdrv_oflags;
3322      int action = 0;
3323      qemu_timeval tv;
3324      bool quiet = false;
3325      Error *err = NULL;
3326      bool image_opts = false;
3327      bool force_share = false;
3328  
3329      bdrv_oflags = BDRV_O_RDWR;
3330      /* Parse commandline parameters */
3331      for(;;) {
3332          static const struct option long_options[] = {
3333              {"help", no_argument, 0, 'h'},
3334              {"object", required_argument, 0, OPTION_OBJECT},
3335              {"image-opts", no_argument, 0, OPTION_IMAGE_OPTS},
3336              {"force-share", no_argument, 0, 'U'},
3337              {0, 0, 0, 0}
3338          };
3339          c = getopt_long(argc, argv, ":la:c:d:hqU",
3340                          long_options, NULL);
3341          if (c == -1) {
3342              break;
3343          }
3344          switch(c) {
3345          case ':':
3346              missing_argument(argv[optind - 1]);
3347              break;
3348          case '?':
3349              unrecognized_option(argv[optind - 1]);
3350              break;
3351          case 'h':
3352              help();
3353              return 0;
3354          case 'l':
3355              if (action) {
3356                  error_exit("Cannot mix '-l', '-a', '-c', '-d'");
3357                  return 0;
3358              }
3359              action = SNAPSHOT_LIST;
3360              bdrv_oflags &= ~BDRV_O_RDWR; /* no need for RW */
3361              break;
3362          case 'a':
3363              if (action) {
3364                  error_exit("Cannot mix '-l', '-a', '-c', '-d'");
3365                  return 0;
3366              }
3367              action = SNAPSHOT_APPLY;
3368              snapshot_name = optarg;
3369              break;
3370          case 'c':
3371              if (action) {
3372                  error_exit("Cannot mix '-l', '-a', '-c', '-d'");
3373                  return 0;
3374              }
3375              action = SNAPSHOT_CREATE;
3376              snapshot_name = optarg;
3377              break;
3378          case 'd':
3379              if (action) {
3380                  error_exit("Cannot mix '-l', '-a', '-c', '-d'");
3381                  return 0;
3382              }
3383              action = SNAPSHOT_DELETE;
3384              snapshot_name = optarg;
3385              break;
3386          case 'q':
3387              quiet = true;
3388              break;
3389          case 'U':
3390              force_share = true;
3391              break;
3392          case OPTION_OBJECT: {
3393              QemuOpts *opts;
3394              opts = qemu_opts_parse_noisily(&qemu_object_opts,
3395                                             optarg, true);
3396              if (!opts) {
3397                  return 1;
3398              }
3399          }   break;
3400          case OPTION_IMAGE_OPTS:
3401              image_opts = true;
3402              break;
3403          }
3404      }
3405  
3406      if (optind != argc - 1) {
3407          error_exit("Expecting one image file name");
3408      }
3409      filename = argv[optind++];
3410  
3411      if (qemu_opts_foreach(&qemu_object_opts,
3412                            user_creatable_add_opts_foreach,
3413                            qemu_img_object_print_help, &error_fatal)) {
3414          return 1;
3415      }
3416  
3417      /* Open the image */
3418      blk = img_open(image_opts, filename, NULL, bdrv_oflags, false, quiet,
3419                     force_share);
3420      if (!blk) {
3421          return 1;
3422      }
3423      bs = blk_bs(blk);
3424  
3425      /* Perform the requested action */
3426      switch(action) {
3427      case SNAPSHOT_LIST:
3428          dump_snapshots(bs);
3429          break;
3430  
3431      case SNAPSHOT_CREATE:
3432          memset(&sn, 0, sizeof(sn));
3433          pstrcpy(sn.name, sizeof(sn.name), snapshot_name);
3434  
3435          qemu_gettimeofday(&tv);
3436          sn.date_sec = tv.tv_sec;
3437          sn.date_nsec = tv.tv_usec * 1000;
3438  
3439          ret = bdrv_snapshot_create(bs, &sn);
3440          if (ret) {
3441              error_report("Could not create snapshot '%s': %d (%s)",
3442                  snapshot_name, ret, strerror(-ret));
3443          }
3444          break;
3445  
3446      case SNAPSHOT_APPLY:
3447          ret = bdrv_snapshot_goto(bs, snapshot_name, &err);
3448          if (ret) {
3449              error_reportf_err(err, "Could not apply snapshot '%s': ",
3450                                snapshot_name);
3451          }
3452          break;
3453  
3454      case SNAPSHOT_DELETE:
3455          ret = bdrv_snapshot_find(bs, &sn, snapshot_name);
3456          if (ret < 0) {
3457              error_report("Could not delete snapshot '%s': snapshot not "
3458                           "found", snapshot_name);
3459              ret = 1;
3460          } else {
3461              ret = bdrv_snapshot_delete(bs, sn.id_str, sn.name, &err);
3462              if (ret < 0) {
3463                  error_reportf_err(err, "Could not delete snapshot '%s': ",
3464                                    snapshot_name);
3465                  ret = 1;
3466              }
3467          }
3468          break;
3469      }
3470  
3471      /* Cleanup */
3472      blk_unref(blk);
3473      if (ret) {
3474          return 1;
3475      }
3476      return 0;
3477  }
3478  
3479  static int img_rebase(int argc, char **argv)
3480  {
3481      BlockBackend *blk = NULL, *blk_old_backing = NULL, *blk_new_backing = NULL;
3482      uint8_t *buf_old = NULL;
3483      uint8_t *buf_new = NULL;
3484      BlockDriverState *bs = NULL, *prefix_chain_bs = NULL;
3485      BlockDriverState *unfiltered_bs;
3486      char *filename;
3487      const char *fmt, *cache, *src_cache, *out_basefmt, *out_baseimg;
3488      int c, flags, src_flags, ret;
3489      bool writethrough, src_writethrough;
3490      int unsafe = 0;
3491      bool force_share = false;
3492      int progress = 0;
3493      bool quiet = false;
3494      Error *local_err = NULL;
3495      bool image_opts = false;
3496  
3497      /* Parse commandline parameters */
3498      fmt = NULL;
3499      cache = BDRV_DEFAULT_CACHE;
3500      src_cache = BDRV_DEFAULT_CACHE;
3501      out_baseimg = NULL;
3502      out_basefmt = NULL;
3503      for(;;) {
3504          static const struct option long_options[] = {
3505              {"help", no_argument, 0, 'h'},
3506              {"object", required_argument, 0, OPTION_OBJECT},
3507              {"image-opts", no_argument, 0, OPTION_IMAGE_OPTS},
3508              {"force-share", no_argument, 0, 'U'},
3509              {0, 0, 0, 0}
3510          };
3511          c = getopt_long(argc, argv, ":hf:F:b:upt:T:qU",
3512                          long_options, NULL);
3513          if (c == -1) {
3514              break;
3515          }
3516          switch(c) {
3517          case ':':
3518              missing_argument(argv[optind - 1]);
3519              break;
3520          case '?':
3521              unrecognized_option(argv[optind - 1]);
3522              break;
3523          case 'h':
3524              help();
3525              return 0;
3526          case 'f':
3527              fmt = optarg;
3528              break;
3529          case 'F':
3530              out_basefmt = optarg;
3531              break;
3532          case 'b':
3533              out_baseimg = optarg;
3534              break;
3535          case 'u':
3536              unsafe = 1;
3537              break;
3538          case 'p':
3539              progress = 1;
3540              break;
3541          case 't':
3542              cache = optarg;
3543              break;
3544          case 'T':
3545              src_cache = optarg;
3546              break;
3547          case 'q':
3548              quiet = true;
3549              break;
3550          case OPTION_OBJECT: {
3551              QemuOpts *opts;
3552              opts = qemu_opts_parse_noisily(&qemu_object_opts,
3553                                             optarg, true);
3554              if (!opts) {
3555                  return 1;
3556              }
3557          }   break;
3558          case OPTION_IMAGE_OPTS:
3559              image_opts = true;
3560              break;
3561          case 'U':
3562              force_share = true;
3563              break;
3564          }
3565      }
3566  
3567      if (quiet) {
3568          progress = 0;
3569      }
3570  
3571      if (optind != argc - 1) {
3572          error_exit("Expecting one image file name");
3573      }
3574      if (!unsafe && !out_baseimg) {
3575          error_exit("Must specify backing file (-b) or use unsafe mode (-u)");
3576      }
3577      filename = argv[optind++];
3578  
3579      if (qemu_opts_foreach(&qemu_object_opts,
3580                            user_creatable_add_opts_foreach,
3581                            qemu_img_object_print_help, &error_fatal)) {
3582          return 1;
3583      }
3584  
3585      qemu_progress_init(progress, 2.0);
3586      qemu_progress_print(0, 100);
3587  
3588      flags = BDRV_O_RDWR | (unsafe ? BDRV_O_NO_BACKING : 0);
3589      ret = bdrv_parse_cache_mode(cache, &flags, &writethrough);
3590      if (ret < 0) {
3591          error_report("Invalid cache option: %s", cache);
3592          goto out;
3593      }
3594  
3595      src_flags = 0;
3596      ret = bdrv_parse_cache_mode(src_cache, &src_flags, &src_writethrough);
3597      if (ret < 0) {
3598          error_report("Invalid source cache option: %s", src_cache);
3599          goto out;
3600      }
3601  
3602      /* The source files are opened read-only, don't care about WCE */
3603      assert((src_flags & BDRV_O_RDWR) == 0);
3604      (void) src_writethrough;
3605  
3606      /*
3607       * Open the images.
3608       *
3609       * Ignore the old backing file for unsafe rebase in case we want to correct
3610       * the reference to a renamed or moved backing file.
3611       */
3612      blk = img_open(image_opts, filename, fmt, flags, writethrough, quiet,
3613                     false);
3614      if (!blk) {
3615          ret = -1;
3616          goto out;
3617      }
3618      bs = blk_bs(blk);
3619  
3620      unfiltered_bs = bdrv_skip_filters(bs);
3621  
3622      if (out_basefmt != NULL) {
3623          if (bdrv_find_format(out_basefmt) == NULL) {
3624              error_report("Invalid format name: '%s'", out_basefmt);
3625              ret = -1;
3626              goto out;
3627          }
3628      }
3629  
3630      /* For safe rebasing we need to compare old and new backing file */
3631      if (!unsafe) {
3632          QDict *options = NULL;
3633          BlockDriverState *base_bs = bdrv_cow_bs(unfiltered_bs);
3634  
3635          if (base_bs) {
3636              blk_old_backing = blk_new(qemu_get_aio_context(),
3637                                        BLK_PERM_CONSISTENT_READ,
3638                                        BLK_PERM_ALL);
3639              ret = blk_insert_bs(blk_old_backing, base_bs,
3640                                  &local_err);
3641              if (ret < 0) {
3642                  error_reportf_err(local_err,
3643                                    "Could not reuse old backing file '%s': ",
3644                                    base_bs->filename);
3645                  goto out;
3646              }
3647          } else {
3648              blk_old_backing = NULL;
3649          }
3650  
3651          if (out_baseimg[0]) {
3652              const char *overlay_filename;
3653              char *out_real_path;
3654  
3655              options = qdict_new();
3656              if (out_basefmt) {
3657                  qdict_put_str(options, "driver", out_basefmt);
3658              }
3659              if (force_share) {
3660                  qdict_put_bool(options, BDRV_OPT_FORCE_SHARE, true);
3661              }
3662  
3663              bdrv_refresh_filename(bs);
3664              overlay_filename = bs->exact_filename[0] ? bs->exact_filename
3665                                                       : bs->filename;
3666              out_real_path =
3667                  bdrv_get_full_backing_filename_from_filename(overlay_filename,
3668                                                               out_baseimg,
3669                                                               &local_err);
3670              if (local_err) {
3671                  qobject_unref(options);
3672                  error_reportf_err(local_err,
3673                                    "Could not resolve backing filename: ");
3674                  ret = -1;
3675                  goto out;
3676              }
3677  
3678              /*
3679               * Find out whether we rebase an image on top of a previous image
3680               * in its chain.
3681               */
3682              prefix_chain_bs = bdrv_find_backing_image(bs, out_real_path);
3683              if (prefix_chain_bs) {
3684                  qobject_unref(options);
3685                  g_free(out_real_path);
3686  
3687                  blk_new_backing = blk_new(qemu_get_aio_context(),
3688                                            BLK_PERM_CONSISTENT_READ,
3689                                            BLK_PERM_ALL);
3690                  ret = blk_insert_bs(blk_new_backing, prefix_chain_bs,
3691                                      &local_err);
3692                  if (ret < 0) {
3693                      error_reportf_err(local_err,
3694                                        "Could not reuse backing file '%s': ",
3695                                        out_baseimg);
3696                      goto out;
3697                  }
3698              } else {
3699                  blk_new_backing = blk_new_open(out_real_path, NULL,
3700                                                 options, src_flags, &local_err);
3701                  g_free(out_real_path);
3702                  if (!blk_new_backing) {
3703                      error_reportf_err(local_err,
3704                                        "Could not open new backing file '%s': ",
3705                                        out_baseimg);
3706                      ret = -1;
3707                      goto out;
3708                  }
3709              }
3710          }
3711      }
3712  
3713      /*
3714       * Check each unallocated cluster in the COW file. If it is unallocated,
3715       * accesses go to the backing file. We must therefore compare this cluster
3716       * in the old and new backing file, and if they differ we need to copy it
3717       * from the old backing file into the COW file.
3718       *
3719       * If qemu-img crashes during this step, no harm is done. The content of
3720       * the image is the same as the original one at any time.
3721       */
3722      if (!unsafe) {
3723          int64_t size;
3724          int64_t old_backing_size = 0;
3725          int64_t new_backing_size = 0;
3726          uint64_t offset;
3727          int64_t n;
3728          float local_progress = 0;
3729  
3730          buf_old = blk_blockalign(blk, IO_BUF_SIZE);
3731          buf_new = blk_blockalign(blk, IO_BUF_SIZE);
3732  
3733          size = blk_getlength(blk);
3734          if (size < 0) {
3735              error_report("Could not get size of '%s': %s",
3736                           filename, strerror(-size));
3737              ret = -1;
3738              goto out;
3739          }
3740          if (blk_old_backing) {
3741              old_backing_size = blk_getlength(blk_old_backing);
3742              if (old_backing_size < 0) {
3743                  char backing_name[PATH_MAX];
3744  
3745                  bdrv_get_backing_filename(bs, backing_name,
3746                                            sizeof(backing_name));
3747                  error_report("Could not get size of '%s': %s",
3748                               backing_name, strerror(-old_backing_size));
3749                  ret = -1;
3750                  goto out;
3751              }
3752          }
3753          if (blk_new_backing) {
3754              new_backing_size = blk_getlength(blk_new_backing);
3755              if (new_backing_size < 0) {
3756                  error_report("Could not get size of '%s': %s",
3757                               out_baseimg, strerror(-new_backing_size));
3758                  ret = -1;
3759                  goto out;
3760              }
3761          }
3762  
3763          if (size != 0) {
3764              local_progress = (float)100 / (size / MIN(size, IO_BUF_SIZE));
3765          }
3766  
3767          for (offset = 0; offset < size; offset += n) {
3768              bool buf_old_is_zero = false;
3769  
3770              /* How many bytes can we handle with the next read? */
3771              n = MIN(IO_BUF_SIZE, size - offset);
3772  
3773              /* If the cluster is allocated, we don't need to take action */
3774              ret = bdrv_is_allocated(unfiltered_bs, offset, n, &n);
3775              if (ret < 0) {
3776                  error_report("error while reading image metadata: %s",
3777                               strerror(-ret));
3778                  goto out;
3779              }
3780              if (ret) {
3781                  continue;
3782              }
3783  
3784              if (prefix_chain_bs) {
3785                  /*
3786                   * If cluster wasn't changed since prefix_chain, we don't need
3787                   * to take action
3788                   */
3789                  ret = bdrv_is_allocated_above(bdrv_cow_bs(unfiltered_bs),
3790                                                prefix_chain_bs, false,
3791                                                offset, n, &n);
3792                  if (ret < 0) {
3793                      error_report("error while reading image metadata: %s",
3794                                   strerror(-ret));
3795                      goto out;
3796                  }
3797                  if (!ret) {
3798                      continue;
3799                  }
3800              }
3801  
3802              /*
3803               * Read old and new backing file and take into consideration that
3804               * backing files may be smaller than the COW image.
3805               */
3806              if (offset >= old_backing_size) {
3807                  memset(buf_old, 0, n);
3808                  buf_old_is_zero = true;
3809              } else {
3810                  if (offset + n > old_backing_size) {
3811                      n = old_backing_size - offset;
3812                  }
3813  
3814                  ret = blk_pread(blk_old_backing, offset, buf_old, n);
3815                  if (ret < 0) {
3816                      error_report("error while reading from old backing file");
3817                      goto out;
3818                  }
3819              }
3820  
3821              if (offset >= new_backing_size || !blk_new_backing) {
3822                  memset(buf_new, 0, n);
3823              } else {
3824                  if (offset + n > new_backing_size) {
3825                      n = new_backing_size - offset;
3826                  }
3827  
3828                  ret = blk_pread(blk_new_backing, offset, buf_new, n);
3829                  if (ret < 0) {
3830                      error_report("error while reading from new backing file");
3831                      goto out;
3832                  }
3833              }
3834  
3835              /* If they differ, we need to write to the COW file */
3836              uint64_t written = 0;
3837  
3838              while (written < n) {
3839                  int64_t pnum;
3840  
3841                  if (compare_buffers(buf_old + written, buf_new + written,
3842                                      n - written, &pnum))
3843                  {
3844                      if (buf_old_is_zero) {
3845                          ret = blk_pwrite_zeroes(blk, offset + written, pnum, 0);
3846                      } else {
3847                          ret = blk_pwrite(blk, offset + written,
3848                                           buf_old + written, pnum, 0);
3849                      }
3850                      if (ret < 0) {
3851                          error_report("Error while writing to COW image: %s",
3852                              strerror(-ret));
3853                          goto out;
3854                      }
3855                  }
3856  
3857                  written += pnum;
3858              }
3859              qemu_progress_print(local_progress, 100);
3860          }
3861      }
3862  
3863      /*
3864       * Change the backing file. All clusters that are different from the old
3865       * backing file are overwritten in the COW file now, so the visible content
3866       * doesn't change when we switch the backing file.
3867       */
3868      if (out_baseimg && *out_baseimg) {
3869          ret = bdrv_change_backing_file(unfiltered_bs, out_baseimg, out_basefmt,
3870                                         true);
3871      } else {
3872          ret = bdrv_change_backing_file(unfiltered_bs, NULL, NULL, false);
3873      }
3874  
3875      if (ret == -ENOSPC) {
3876          error_report("Could not change the backing file to '%s': No "
3877                       "space left in the file header", out_baseimg);
3878      } else if (ret < 0) {
3879          error_report("Could not change the backing file to '%s': %s",
3880              out_baseimg, strerror(-ret));
3881      }
3882  
3883      qemu_progress_print(100, 0);
3884      /*
3885       * TODO At this point it is possible to check if any clusters that are
3886       * allocated in the COW file are the same in the backing file. If so, they
3887       * could be dropped from the COW file. Don't do this before switching the
3888       * backing file, in case of a crash this would lead to corruption.
3889       */
3890  out:
3891      qemu_progress_end();
3892      /* Cleanup */
3893      if (!unsafe) {
3894          blk_unref(blk_old_backing);
3895          blk_unref(blk_new_backing);
3896      }
3897      qemu_vfree(buf_old);
3898      qemu_vfree(buf_new);
3899  
3900      blk_unref(blk);
3901      if (ret) {
3902          return 1;
3903      }
3904      return 0;
3905  }
3906  
3907  static int img_resize(int argc, char **argv)
3908  {
3909      Error *err = NULL;
3910      int c, ret, relative;
3911      const char *filename, *fmt, *size;
3912      int64_t n, total_size, current_size;
3913      bool quiet = false;
3914      BlockBackend *blk = NULL;
3915      PreallocMode prealloc = PREALLOC_MODE_OFF;
3916      QemuOpts *param;
3917  
3918      static QemuOptsList resize_options = {
3919          .name = "resize_options",
3920          .head = QTAILQ_HEAD_INITIALIZER(resize_options.head),
3921          .desc = {
3922              {
3923                  .name = BLOCK_OPT_SIZE,
3924                  .type = QEMU_OPT_SIZE,
3925                  .help = "Virtual disk size"
3926              }, {
3927                  /* end of list */
3928              }
3929          },
3930      };
3931      bool image_opts = false;
3932      bool shrink = false;
3933  
3934      /* Remove size from argv manually so that negative numbers are not treated
3935       * as options by getopt. */
3936      if (argc < 3) {
3937          error_exit("Not enough arguments");
3938          return 1;
3939      }
3940  
3941      size = argv[--argc];
3942  
3943      /* Parse getopt arguments */
3944      fmt = NULL;
3945      for(;;) {
3946          static const struct option long_options[] = {
3947              {"help", no_argument, 0, 'h'},
3948              {"object", required_argument, 0, OPTION_OBJECT},
3949              {"image-opts", no_argument, 0, OPTION_IMAGE_OPTS},
3950              {"preallocation", required_argument, 0, OPTION_PREALLOCATION},
3951              {"shrink", no_argument, 0, OPTION_SHRINK},
3952              {0, 0, 0, 0}
3953          };
3954          c = getopt_long(argc, argv, ":f:hq",
3955                          long_options, NULL);
3956          if (c == -1) {
3957              break;
3958          }
3959          switch(c) {
3960          case ':':
3961              missing_argument(argv[optind - 1]);
3962              break;
3963          case '?':
3964              unrecognized_option(argv[optind - 1]);
3965              break;
3966          case 'h':
3967              help();
3968              break;
3969          case 'f':
3970              fmt = optarg;
3971              break;
3972          case 'q':
3973              quiet = true;
3974              break;
3975          case OPTION_OBJECT: {
3976              QemuOpts *opts;
3977              opts = qemu_opts_parse_noisily(&qemu_object_opts,
3978                                             optarg, true);
3979              if (!opts) {
3980                  return 1;
3981              }
3982          }   break;
3983          case OPTION_IMAGE_OPTS:
3984              image_opts = true;
3985              break;
3986          case OPTION_PREALLOCATION:
3987              prealloc = qapi_enum_parse(&PreallocMode_lookup, optarg,
3988                                         PREALLOC_MODE__MAX, NULL);
3989              if (prealloc == PREALLOC_MODE__MAX) {
3990                  error_report("Invalid preallocation mode '%s'", optarg);
3991                  return 1;
3992              }
3993              break;
3994          case OPTION_SHRINK:
3995              shrink = true;
3996              break;
3997          }
3998      }
3999      if (optind != argc - 1) {
4000          error_exit("Expecting image file name and size");
4001      }
4002      filename = argv[optind++];
4003  
4004      if (qemu_opts_foreach(&qemu_object_opts,
4005                            user_creatable_add_opts_foreach,
4006                            qemu_img_object_print_help, &error_fatal)) {
4007          return 1;
4008      }
4009  
4010      /* Choose grow, shrink, or absolute resize mode */
4011      switch (size[0]) {
4012      case '+':
4013          relative = 1;
4014          size++;
4015          break;
4016      case '-':
4017          relative = -1;
4018          size++;
4019          break;
4020      default:
4021          relative = 0;
4022          break;
4023      }
4024  
4025      /* Parse size */
4026      param = qemu_opts_create(&resize_options, NULL, 0, &error_abort);
4027      if (!qemu_opt_set(param, BLOCK_OPT_SIZE, size, &err)) {
4028          error_report_err(err);
4029          ret = -1;
4030          qemu_opts_del(param);
4031          goto out;
4032      }
4033      n = qemu_opt_get_size(param, BLOCK_OPT_SIZE, 0);
4034      qemu_opts_del(param);
4035  
4036      blk = img_open(image_opts, filename, fmt,
4037                     BDRV_O_RDWR | BDRV_O_RESIZE, false, quiet,
4038                     false);
4039      if (!blk) {
4040          ret = -1;
4041          goto out;
4042      }
4043  
4044      current_size = blk_getlength(blk);
4045      if (current_size < 0) {
4046          error_report("Failed to inquire current image length: %s",
4047                       strerror(-current_size));
4048          ret = -1;
4049          goto out;
4050      }
4051  
4052      if (relative) {
4053          total_size = current_size + n * relative;
4054      } else {
4055          total_size = n;
4056      }
4057      if (total_size <= 0) {
4058          error_report("New image size must be positive");
4059          ret = -1;
4060          goto out;
4061      }
4062  
4063      if (total_size <= current_size && prealloc != PREALLOC_MODE_OFF) {
4064          error_report("Preallocation can only be used for growing images");
4065          ret = -1;
4066          goto out;
4067      }
4068  
4069      if (total_size < current_size && !shrink) {
4070          error_report("Use the --shrink option to perform a shrink operation.");
4071          warn_report("Shrinking an image will delete all data beyond the "
4072                      "shrunken image's end. Before performing such an "
4073                      "operation, make sure there is no important data there.");
4074          ret = -1;
4075          goto out;
4076      }
4077  
4078      /*
4079       * The user expects the image to have the desired size after
4080       * resizing, so pass @exact=true.  It is of no use to report
4081       * success when the image has not actually been resized.
4082       */
4083      ret = blk_truncate(blk, total_size, true, prealloc, 0, &err);
4084      if (!ret) {
4085          qprintf(quiet, "Image resized.\n");
4086      } else {
4087          error_report_err(err);
4088      }
4089  out:
4090      blk_unref(blk);
4091      if (ret) {
4092          return 1;
4093      }
4094      return 0;
4095  }
4096  
4097  static void amend_status_cb(BlockDriverState *bs,
4098                              int64_t offset, int64_t total_work_size,
4099                              void *opaque)
4100  {
4101      qemu_progress_print(100.f * offset / total_work_size, 0);
4102  }
4103  
4104  static int print_amend_option_help(const char *format)
4105  {
4106      BlockDriver *drv;
4107  
4108      /* Find driver and parse its options */
4109      drv = bdrv_find_format(format);
4110      if (!drv) {
4111          error_report("Unknown file format '%s'", format);
4112          return 1;
4113      }
4114  
4115      if (!drv->bdrv_amend_options) {
4116          error_report("Format driver '%s' does not support option amendment",
4117                       format);
4118          return 1;
4119      }
4120  
4121      /* Every driver supporting amendment must have amend_opts */
4122      assert(drv->amend_opts);
4123  
4124      printf("Amend options for '%s':\n", format);
4125      qemu_opts_print_help(drv->amend_opts, false);
4126      return 0;
4127  }
4128  
4129  static int img_amend(int argc, char **argv)
4130  {
4131      Error *err = NULL;
4132      int c, ret = 0;
4133      char *options = NULL;
4134      QemuOptsList *amend_opts = NULL;
4135      QemuOpts *opts = NULL;
4136      const char *fmt = NULL, *filename, *cache;
4137      int flags;
4138      bool writethrough;
4139      bool quiet = false, progress = false;
4140      BlockBackend *blk = NULL;
4141      BlockDriverState *bs = NULL;
4142      bool image_opts = false;
4143      bool force = false;
4144  
4145      cache = BDRV_DEFAULT_CACHE;
4146      for (;;) {
4147          static const struct option long_options[] = {
4148              {"help", no_argument, 0, 'h'},
4149              {"object", required_argument, 0, OPTION_OBJECT},
4150              {"image-opts", no_argument, 0, OPTION_IMAGE_OPTS},
4151              {"force", no_argument, 0, OPTION_FORCE},
4152              {0, 0, 0, 0}
4153          };
4154          c = getopt_long(argc, argv, ":ho:f:t:pq",
4155                          long_options, NULL);
4156          if (c == -1) {
4157              break;
4158          }
4159  
4160          switch (c) {
4161          case ':':
4162              missing_argument(argv[optind - 1]);
4163              break;
4164          case '?':
4165              unrecognized_option(argv[optind - 1]);
4166              break;
4167          case 'h':
4168              help();
4169              break;
4170          case 'o':
4171              if (accumulate_options(&options, optarg) < 0) {
4172                  ret = -1;
4173                  goto out_no_progress;
4174              }
4175              break;
4176          case 'f':
4177              fmt = optarg;
4178              break;
4179          case 't':
4180              cache = optarg;
4181              break;
4182          case 'p':
4183              progress = true;
4184              break;
4185          case 'q':
4186              quiet = true;
4187              break;
4188          case OPTION_OBJECT:
4189              opts = qemu_opts_parse_noisily(&qemu_object_opts,
4190                                             optarg, true);
4191              if (!opts) {
4192                  ret = -1;
4193                  goto out_no_progress;
4194              }
4195              break;
4196          case OPTION_IMAGE_OPTS:
4197              image_opts = true;
4198              break;
4199          case OPTION_FORCE:
4200              force = true;
4201              break;
4202          }
4203      }
4204  
4205      if (!options) {
4206          error_exit("Must specify options (-o)");
4207      }
4208  
4209      if (qemu_opts_foreach(&qemu_object_opts,
4210                            user_creatable_add_opts_foreach,
4211                            qemu_img_object_print_help, &error_fatal)) {
4212          ret = -1;
4213          goto out_no_progress;
4214      }
4215  
4216      if (quiet) {
4217          progress = false;
4218      }
4219      qemu_progress_init(progress, 1.0);
4220  
4221      filename = (optind == argc - 1) ? argv[argc - 1] : NULL;
4222      if (fmt && has_help_option(options)) {
4223          /* If a format is explicitly specified (and possibly no filename is
4224           * given), print option help here */
4225          ret = print_amend_option_help(fmt);
4226          goto out;
4227      }
4228  
4229      if (optind != argc - 1) {
4230          error_report("Expecting one image file name");
4231          ret = -1;
4232          goto out;
4233      }
4234  
4235      flags = BDRV_O_RDWR;
4236      ret = bdrv_parse_cache_mode(cache, &flags, &writethrough);
4237      if (ret < 0) {
4238          error_report("Invalid cache option: %s", cache);
4239          goto out;
4240      }
4241  
4242      blk = img_open(image_opts, filename, fmt, flags, writethrough, quiet,
4243                     false);
4244      if (!blk) {
4245          ret = -1;
4246          goto out;
4247      }
4248      bs = blk_bs(blk);
4249  
4250      fmt = bs->drv->format_name;
4251  
4252      if (has_help_option(options)) {
4253          /* If the format was auto-detected, print option help here */
4254          ret = print_amend_option_help(fmt);
4255          goto out;
4256      }
4257  
4258      if (!bs->drv->bdrv_amend_options) {
4259          error_report("Format driver '%s' does not support option amendment",
4260                       fmt);
4261          ret = -1;
4262          goto out;
4263      }
4264  
4265      /* Every driver supporting amendment must have amend_opts */
4266      assert(bs->drv->amend_opts);
4267  
4268      amend_opts = qemu_opts_append(amend_opts, bs->drv->amend_opts);
4269      opts = qemu_opts_create(amend_opts, NULL, 0, &error_abort);
4270      if (!qemu_opts_do_parse(opts, options, NULL, &err)) {
4271          /* Try to parse options using the create options */
4272          amend_opts = qemu_opts_append(amend_opts, bs->drv->create_opts);
4273          qemu_opts_del(opts);
4274          opts = qemu_opts_create(amend_opts, NULL, 0, &error_abort);
4275          if (qemu_opts_do_parse(opts, options, NULL, NULL)) {
4276              error_append_hint(&err,
4277                                "This option is only supported for image creation\n");
4278          }
4279  
4280          error_report_err(err);
4281          ret = -1;
4282          goto out;
4283      }
4284  
4285      /* In case the driver does not call amend_status_cb() */
4286      qemu_progress_print(0.f, 0);
4287      ret = bdrv_amend_options(bs, opts, &amend_status_cb, NULL, force, &err);
4288      qemu_progress_print(100.f, 0);
4289      if (ret < 0) {
4290          error_report_err(err);
4291          goto out;
4292      }
4293  
4294  out:
4295      qemu_progress_end();
4296  
4297  out_no_progress:
4298      blk_unref(blk);
4299      qemu_opts_del(opts);
4300      qemu_opts_free(amend_opts);
4301      g_free(options);
4302  
4303      if (ret) {
4304          return 1;
4305      }
4306      return 0;
4307  }
4308  
4309  typedef struct BenchData {
4310      BlockBackend *blk;
4311      uint64_t image_size;
4312      bool write;
4313      int bufsize;
4314      int step;
4315      int nrreq;
4316      int n;
4317      int flush_interval;
4318      bool drain_on_flush;
4319      uint8_t *buf;
4320      QEMUIOVector *qiov;
4321  
4322      int in_flight;
4323      bool in_flush;
4324      uint64_t offset;
4325  } BenchData;
4326  
4327  static void bench_undrained_flush_cb(void *opaque, int ret)
4328  {
4329      if (ret < 0) {
4330          error_report("Failed flush request: %s", strerror(-ret));
4331          exit(EXIT_FAILURE);
4332      }
4333  }
4334  
4335  static void bench_cb(void *opaque, int ret)
4336  {
4337      BenchData *b = opaque;
4338      BlockAIOCB *acb;
4339  
4340      if (ret < 0) {
4341          error_report("Failed request: %s", strerror(-ret));
4342          exit(EXIT_FAILURE);
4343      }
4344  
4345      if (b->in_flush) {
4346          /* Just finished a flush with drained queue: Start next requests */
4347          assert(b->in_flight == 0);
4348          b->in_flush = false;
4349      } else if (b->in_flight > 0) {
4350          int remaining = b->n - b->in_flight;
4351  
4352          b->n--;
4353          b->in_flight--;
4354  
4355          /* Time for flush? Drain queue if requested, then flush */
4356          if (b->flush_interval && remaining % b->flush_interval == 0) {
4357              if (!b->in_flight || !b->drain_on_flush) {
4358                  BlockCompletionFunc *cb;
4359  
4360                  if (b->drain_on_flush) {
4361                      b->in_flush = true;
4362                      cb = bench_cb;
4363                  } else {
4364                      cb = bench_undrained_flush_cb;
4365                  }
4366  
4367                  acb = blk_aio_flush(b->blk, cb, b);
4368                  if (!acb) {
4369                      error_report("Failed to issue flush request");
4370                      exit(EXIT_FAILURE);
4371                  }
4372              }
4373              if (b->drain_on_flush) {
4374                  return;
4375              }
4376          }
4377      }
4378  
4379      while (b->n > b->in_flight && b->in_flight < b->nrreq) {
4380          int64_t offset = b->offset;
4381          /* blk_aio_* might look for completed I/Os and kick bench_cb
4382           * again, so make sure this operation is counted by in_flight
4383           * and b->offset is ready for the next submission.
4384           */
4385          b->in_flight++;
4386          b->offset += b->step;
4387          b->offset %= b->image_size;
4388          if (b->write) {
4389              acb = blk_aio_pwritev(b->blk, offset, b->qiov, 0, bench_cb, b);
4390          } else {
4391              acb = blk_aio_preadv(b->blk, offset, b->qiov, 0, bench_cb, b);
4392          }
4393          if (!acb) {
4394              error_report("Failed to issue request");
4395              exit(EXIT_FAILURE);
4396          }
4397      }
4398  }
4399  
4400  static int img_bench(int argc, char **argv)
4401  {
4402      int c, ret = 0;
4403      const char *fmt = NULL, *filename;
4404      bool quiet = false;
4405      bool image_opts = false;
4406      bool is_write = false;
4407      int count = 75000;
4408      int depth = 64;
4409      int64_t offset = 0;
4410      size_t bufsize = 4096;
4411      int pattern = 0;
4412      size_t step = 0;
4413      int flush_interval = 0;
4414      bool drain_on_flush = true;
4415      int64_t image_size;
4416      BlockBackend *blk = NULL;
4417      BenchData data = {};
4418      int flags = 0;
4419      bool writethrough = false;
4420      struct timeval t1, t2;
4421      int i;
4422      bool force_share = false;
4423      size_t buf_size;
4424  
4425      for (;;) {
4426          static const struct option long_options[] = {
4427              {"help", no_argument, 0, 'h'},
4428              {"flush-interval", required_argument, 0, OPTION_FLUSH_INTERVAL},
4429              {"image-opts", no_argument, 0, OPTION_IMAGE_OPTS},
4430              {"pattern", required_argument, 0, OPTION_PATTERN},
4431              {"no-drain", no_argument, 0, OPTION_NO_DRAIN},
4432              {"force-share", no_argument, 0, 'U'},
4433              {0, 0, 0, 0}
4434          };
4435          c = getopt_long(argc, argv, ":hc:d:f:ni:o:qs:S:t:wU", long_options,
4436                          NULL);
4437          if (c == -1) {
4438              break;
4439          }
4440  
4441          switch (c) {
4442          case ':':
4443              missing_argument(argv[optind - 1]);
4444              break;
4445          case '?':
4446              unrecognized_option(argv[optind - 1]);
4447              break;
4448          case 'h':
4449              help();
4450              break;
4451          case 'c':
4452          {
4453              unsigned long res;
4454  
4455              if (qemu_strtoul(optarg, NULL, 0, &res) < 0 || res > INT_MAX) {
4456                  error_report("Invalid request count specified");
4457                  return 1;
4458              }
4459              count = res;
4460              break;
4461          }
4462          case 'd':
4463          {
4464              unsigned long res;
4465  
4466              if (qemu_strtoul(optarg, NULL, 0, &res) < 0 || res > INT_MAX) {
4467                  error_report("Invalid queue depth specified");
4468                  return 1;
4469              }
4470              depth = res;
4471              break;
4472          }
4473          case 'f':
4474              fmt = optarg;
4475              break;
4476          case 'n':
4477              flags |= BDRV_O_NATIVE_AIO;
4478              break;
4479          case 'i':
4480              ret = bdrv_parse_aio(optarg, &flags);
4481              if (ret < 0) {
4482                  error_report("Invalid aio option: %s", optarg);
4483                  ret = -1;
4484                  goto out;
4485              }
4486              break;
4487          case 'o':
4488          {
4489              offset = cvtnum("offset", optarg);
4490              if (offset < 0) {
4491                  return 1;
4492              }
4493              break;
4494          }
4495              break;
4496          case 'q':
4497              quiet = true;
4498              break;
4499          case 's':
4500          {
4501              int64_t sval;
4502  
4503              sval = cvtnum_full("buffer size", optarg, 0, INT_MAX);
4504              if (sval < 0) {
4505                  return 1;
4506              }
4507  
4508              bufsize = sval;
4509              break;
4510          }
4511          case 'S':
4512          {
4513              int64_t sval;
4514  
4515              sval = cvtnum_full("step_size", optarg, 0, INT_MAX);
4516              if (sval < 0) {
4517                  return 1;
4518              }
4519  
4520              step = sval;
4521              break;
4522          }
4523          case 't':
4524              ret = bdrv_parse_cache_mode(optarg, &flags, &writethrough);
4525              if (ret < 0) {
4526                  error_report("Invalid cache mode");
4527                  ret = -1;
4528                  goto out;
4529              }
4530              break;
4531          case 'w':
4532              flags |= BDRV_O_RDWR;
4533              is_write = true;
4534              break;
4535          case 'U':
4536              force_share = true;
4537              break;
4538          case OPTION_PATTERN:
4539          {
4540              unsigned long res;
4541  
4542              if (qemu_strtoul(optarg, NULL, 0, &res) < 0 || res > 0xff) {
4543                  error_report("Invalid pattern byte specified");
4544                  return 1;
4545              }
4546              pattern = res;
4547              break;
4548          }
4549          case OPTION_FLUSH_INTERVAL:
4550          {
4551              unsigned long res;
4552  
4553              if (qemu_strtoul(optarg, NULL, 0, &res) < 0 || res > INT_MAX) {
4554                  error_report("Invalid flush interval specified");
4555                  return 1;
4556              }
4557              flush_interval = res;
4558              break;
4559          }
4560          case OPTION_NO_DRAIN:
4561              drain_on_flush = false;
4562              break;
4563          case OPTION_IMAGE_OPTS:
4564              image_opts = true;
4565              break;
4566          }
4567      }
4568  
4569      if (optind != argc - 1) {
4570          error_exit("Expecting one image file name");
4571      }
4572      filename = argv[argc - 1];
4573  
4574      if (!is_write && flush_interval) {
4575          error_report("--flush-interval is only available in write tests");
4576          ret = -1;
4577          goto out;
4578      }
4579      if (flush_interval && flush_interval < depth) {
4580          error_report("Flush interval can't be smaller than depth");
4581          ret = -1;
4582          goto out;
4583      }
4584  
4585      blk = img_open(image_opts, filename, fmt, flags, writethrough, quiet,
4586                     force_share);
4587      if (!blk) {
4588          ret = -1;
4589          goto out;
4590      }
4591  
4592      image_size = blk_getlength(blk);
4593      if (image_size < 0) {
4594          ret = image_size;
4595          goto out;
4596      }
4597  
4598      data = (BenchData) {
4599          .blk            = blk,
4600          .image_size     = image_size,
4601          .bufsize        = bufsize,
4602          .step           = step ?: bufsize,
4603          .nrreq          = depth,
4604          .n              = count,
4605          .offset         = offset,
4606          .write          = is_write,
4607          .flush_interval = flush_interval,
4608          .drain_on_flush = drain_on_flush,
4609      };
4610      printf("Sending %d %s requests, %d bytes each, %d in parallel "
4611             "(starting at offset %" PRId64 ", step size %d)\n",
4612             data.n, data.write ? "write" : "read", data.bufsize, data.nrreq,
4613             data.offset, data.step);
4614      if (flush_interval) {
4615          printf("Sending flush every %d requests\n", flush_interval);
4616      }
4617  
4618      buf_size = data.nrreq * data.bufsize;
4619      data.buf = blk_blockalign(blk, buf_size);
4620      memset(data.buf, pattern, data.nrreq * data.bufsize);
4621  
4622      blk_register_buf(blk, data.buf, buf_size);
4623  
4624      data.qiov = g_new(QEMUIOVector, data.nrreq);
4625      for (i = 0; i < data.nrreq; i++) {
4626          qemu_iovec_init(&data.qiov[i], 1);
4627          qemu_iovec_add(&data.qiov[i],
4628                         data.buf + i * data.bufsize, data.bufsize);
4629      }
4630  
4631      gettimeofday(&t1, NULL);
4632      bench_cb(&data, 0);
4633  
4634      while (data.n > 0) {
4635          main_loop_wait(false);
4636      }
4637      gettimeofday(&t2, NULL);
4638  
4639      printf("Run completed in %3.3f seconds.\n",
4640             (t2.tv_sec - t1.tv_sec)
4641             + ((double)(t2.tv_usec - t1.tv_usec) / 1000000));
4642  
4643  out:
4644      if (data.buf) {
4645          blk_unregister_buf(blk, data.buf);
4646      }
4647      qemu_vfree(data.buf);
4648      blk_unref(blk);
4649  
4650      if (ret) {
4651          return 1;
4652      }
4653      return 0;
4654  }
4655  
4656  enum ImgBitmapAct {
4657      BITMAP_ADD,
4658      BITMAP_REMOVE,
4659      BITMAP_CLEAR,
4660      BITMAP_ENABLE,
4661      BITMAP_DISABLE,
4662      BITMAP_MERGE,
4663  };
4664  typedef struct ImgBitmapAction {
4665      enum ImgBitmapAct act;
4666      const char *src; /* only used for merge */
4667      QSIMPLEQ_ENTRY(ImgBitmapAction) next;
4668  } ImgBitmapAction;
4669  
4670  static int img_bitmap(int argc, char **argv)
4671  {
4672      Error *err = NULL;
4673      int c, ret = 1;
4674      QemuOpts *opts = NULL;
4675      const char *fmt = NULL, *src_fmt = NULL, *src_filename = NULL;
4676      const char *filename, *bitmap;
4677      BlockBackend *blk = NULL, *src = NULL;
4678      BlockDriverState *bs = NULL, *src_bs = NULL;
4679      bool image_opts = false;
4680      int64_t granularity = 0;
4681      bool add = false, merge = false;
4682      QSIMPLEQ_HEAD(, ImgBitmapAction) actions;
4683      ImgBitmapAction *act, *act_next;
4684      const char *op;
4685  
4686      QSIMPLEQ_INIT(&actions);
4687  
4688      for (;;) {
4689          static const struct option long_options[] = {
4690              {"help", no_argument, 0, 'h'},
4691              {"object", required_argument, 0, OPTION_OBJECT},
4692              {"image-opts", no_argument, 0, OPTION_IMAGE_OPTS},
4693              {"add", no_argument, 0, OPTION_ADD},
4694              {"remove", no_argument, 0, OPTION_REMOVE},
4695              {"clear", no_argument, 0, OPTION_CLEAR},
4696              {"enable", no_argument, 0, OPTION_ENABLE},
4697              {"disable", no_argument, 0, OPTION_DISABLE},
4698              {"merge", required_argument, 0, OPTION_MERGE},
4699              {"granularity", required_argument, 0, 'g'},
4700              {"source-file", required_argument, 0, 'b'},
4701              {"source-format", required_argument, 0, 'F'},
4702              {0, 0, 0, 0}
4703          };
4704          c = getopt_long(argc, argv, ":b:f:F:g:h", long_options, NULL);
4705          if (c == -1) {
4706              break;
4707          }
4708  
4709          switch (c) {
4710          case ':':
4711              missing_argument(argv[optind - 1]);
4712              break;
4713          case '?':
4714              unrecognized_option(argv[optind - 1]);
4715              break;
4716          case 'h':
4717              help();
4718              break;
4719          case 'b':
4720              src_filename = optarg;
4721              break;
4722          case 'f':
4723              fmt = optarg;
4724              break;
4725          case 'F':
4726              src_fmt = optarg;
4727              break;
4728          case 'g':
4729              granularity = cvtnum("granularity", optarg);
4730              if (granularity < 0) {
4731                  return 1;
4732              }
4733              break;
4734          case OPTION_ADD:
4735              act = g_new0(ImgBitmapAction, 1);
4736              act->act = BITMAP_ADD;
4737              QSIMPLEQ_INSERT_TAIL(&actions, act, next);
4738              add = true;
4739              break;
4740          case OPTION_REMOVE:
4741              act = g_new0(ImgBitmapAction, 1);
4742              act->act = BITMAP_REMOVE;
4743              QSIMPLEQ_INSERT_TAIL(&actions, act, next);
4744              break;
4745          case OPTION_CLEAR:
4746              act = g_new0(ImgBitmapAction, 1);
4747              act->act = BITMAP_CLEAR;
4748              QSIMPLEQ_INSERT_TAIL(&actions, act, next);
4749              break;
4750          case OPTION_ENABLE:
4751              act = g_new0(ImgBitmapAction, 1);
4752              act->act = BITMAP_ENABLE;
4753              QSIMPLEQ_INSERT_TAIL(&actions, act, next);
4754              break;
4755          case OPTION_DISABLE:
4756              act = g_new0(ImgBitmapAction, 1);
4757              act->act = BITMAP_DISABLE;
4758              QSIMPLEQ_INSERT_TAIL(&actions, act, next);
4759              break;
4760          case OPTION_MERGE:
4761              act = g_new0(ImgBitmapAction, 1);
4762              act->act = BITMAP_MERGE;
4763              act->src = optarg;
4764              QSIMPLEQ_INSERT_TAIL(&actions, act, next);
4765              merge = true;
4766              break;
4767          case OPTION_OBJECT:
4768              opts = qemu_opts_parse_noisily(&qemu_object_opts, optarg, true);
4769              if (!opts) {
4770                  goto out;
4771              }
4772              break;
4773          case OPTION_IMAGE_OPTS:
4774              image_opts = true;
4775              break;
4776          }
4777      }
4778  
4779      if (qemu_opts_foreach(&qemu_object_opts,
4780                            user_creatable_add_opts_foreach,
4781                            qemu_img_object_print_help, &error_fatal)) {
4782          goto out;
4783      }
4784  
4785      if (QSIMPLEQ_EMPTY(&actions)) {
4786          error_report("Need at least one of --add, --remove, --clear, "
4787                       "--enable, --disable, or --merge");
4788          goto out;
4789      }
4790  
4791      if (granularity && !add) {
4792          error_report("granularity only supported with --add");
4793          goto out;
4794      }
4795      if (src_fmt && !src_filename) {
4796          error_report("-F only supported with -b");
4797          goto out;
4798      }
4799      if (src_filename && !merge) {
4800          error_report("Merge bitmap source file only supported with "
4801                       "--merge");
4802          goto out;
4803      }
4804  
4805      if (optind != argc - 2) {
4806          error_report("Expecting filename and bitmap name");
4807          goto out;
4808      }
4809  
4810      filename = argv[optind];
4811      bitmap = argv[optind + 1];
4812  
4813      /*
4814       * No need to open backing chains; we will be manipulating bitmaps
4815       * directly in this image without reference to image contents.
4816       */
4817      blk = img_open(image_opts, filename, fmt, BDRV_O_RDWR | BDRV_O_NO_BACKING,
4818                     false, false, false);
4819      if (!blk) {
4820          goto out;
4821      }
4822      bs = blk_bs(blk);
4823      if (src_filename) {
4824          src = img_open(false, src_filename, src_fmt, BDRV_O_NO_BACKING,
4825                         false, false, false);
4826          if (!src) {
4827              goto out;
4828          }
4829          src_bs = blk_bs(src);
4830      } else {
4831          src_bs = bs;
4832      }
4833  
4834      QSIMPLEQ_FOREACH_SAFE(act, &actions, next, act_next) {
4835          switch (act->act) {
4836          case BITMAP_ADD:
4837              qmp_block_dirty_bitmap_add(bs->node_name, bitmap,
4838                                         !!granularity, granularity, true, true,
4839                                         false, false, &err);
4840              op = "add";
4841              break;
4842          case BITMAP_REMOVE:
4843              qmp_block_dirty_bitmap_remove(bs->node_name, bitmap, &err);
4844              op = "remove";
4845              break;
4846          case BITMAP_CLEAR:
4847              qmp_block_dirty_bitmap_clear(bs->node_name, bitmap, &err);
4848              op = "clear";
4849              break;
4850          case BITMAP_ENABLE:
4851              qmp_block_dirty_bitmap_enable(bs->node_name, bitmap, &err);
4852              op = "enable";
4853              break;
4854          case BITMAP_DISABLE:
4855              qmp_block_dirty_bitmap_disable(bs->node_name, bitmap, &err);
4856              op = "disable";
4857              break;
4858          case BITMAP_MERGE:
4859              do_dirty_bitmap_merge(bs->node_name, bitmap, src_bs->node_name,
4860                                    act->src, &err);
4861              op = "merge";
4862              break;
4863          default:
4864              g_assert_not_reached();
4865          }
4866  
4867          if (err) {
4868              error_reportf_err(err, "Operation %s on bitmap %s failed: ",
4869                                op, bitmap);
4870              goto out;
4871          }
4872          g_free(act);
4873      }
4874  
4875      ret = 0;
4876  
4877   out:
4878      blk_unref(src);
4879      blk_unref(blk);
4880      qemu_opts_del(opts);
4881      return ret;
4882  }
4883  
4884  #define C_BS      01
4885  #define C_COUNT   02
4886  #define C_IF      04
4887  #define C_OF      010
4888  #define C_SKIP    020
4889  
4890  struct DdInfo {
4891      unsigned int flags;
4892      int64_t count;
4893  };
4894  
4895  struct DdIo {
4896      int bsz;    /* Block size */
4897      char *filename;
4898      uint8_t *buf;
4899      int64_t offset;
4900  };
4901  
4902  struct DdOpts {
4903      const char *name;
4904      int (*f)(const char *, struct DdIo *, struct DdIo *, struct DdInfo *);
4905      unsigned int flag;
4906  };
4907  
4908  static int img_dd_bs(const char *arg,
4909                       struct DdIo *in, struct DdIo *out,
4910                       struct DdInfo *dd)
4911  {
4912      int64_t res;
4913  
4914      res = cvtnum_full("bs", arg, 1, INT_MAX);
4915  
4916      if (res < 0) {
4917          return 1;
4918      }
4919      in->bsz = out->bsz = res;
4920  
4921      return 0;
4922  }
4923  
4924  static int img_dd_count(const char *arg,
4925                          struct DdIo *in, struct DdIo *out,
4926                          struct DdInfo *dd)
4927  {
4928      dd->count = cvtnum("count", arg);
4929  
4930      if (dd->count < 0) {
4931          return 1;
4932      }
4933  
4934      return 0;
4935  }
4936  
4937  static int img_dd_if(const char *arg,
4938                       struct DdIo *in, struct DdIo *out,
4939                       struct DdInfo *dd)
4940  {
4941      in->filename = g_strdup(arg);
4942  
4943      return 0;
4944  }
4945  
4946  static int img_dd_of(const char *arg,
4947                       struct DdIo *in, struct DdIo *out,
4948                       struct DdInfo *dd)
4949  {
4950      out->filename = g_strdup(arg);
4951  
4952      return 0;
4953  }
4954  
4955  static int img_dd_skip(const char *arg,
4956                         struct DdIo *in, struct DdIo *out,
4957                         struct DdInfo *dd)
4958  {
4959      in->offset = cvtnum("skip", arg);
4960  
4961      if (in->offset < 0) {
4962          return 1;
4963      }
4964  
4965      return 0;
4966  }
4967  
4968  static int img_dd(int argc, char **argv)
4969  {
4970      int ret = 0;
4971      char *arg = NULL;
4972      char *tmp;
4973      BlockDriver *drv = NULL, *proto_drv = NULL;
4974      BlockBackend *blk1 = NULL, *blk2 = NULL;
4975      QemuOpts *opts = NULL;
4976      QemuOptsList *create_opts = NULL;
4977      Error *local_err = NULL;
4978      bool image_opts = false;
4979      int c, i;
4980      const char *out_fmt = "raw";
4981      const char *fmt = NULL;
4982      int64_t size = 0;
4983      int64_t block_count = 0, out_pos, in_pos;
4984      bool force_share = false;
4985      struct DdInfo dd = {
4986          .flags = 0,
4987          .count = 0,
4988      };
4989      struct DdIo in = {
4990          .bsz = 512, /* Block size is by default 512 bytes */
4991          .filename = NULL,
4992          .buf = NULL,
4993          .offset = 0
4994      };
4995      struct DdIo out = {
4996          .bsz = 512,
4997          .filename = NULL,
4998          .buf = NULL,
4999          .offset = 0
5000      };
5001  
5002      const struct DdOpts options[] = {
5003          { "bs", img_dd_bs, C_BS },
5004          { "count", img_dd_count, C_COUNT },
5005          { "if", img_dd_if, C_IF },
5006          { "of", img_dd_of, C_OF },
5007          { "skip", img_dd_skip, C_SKIP },
5008          { NULL, NULL, 0 }
5009      };
5010      const struct option long_options[] = {
5011          { "help", no_argument, 0, 'h'},
5012          { "object", required_argument, 0, OPTION_OBJECT},
5013          { "image-opts", no_argument, 0, OPTION_IMAGE_OPTS},
5014          { "force-share", no_argument, 0, 'U'},
5015          { 0, 0, 0, 0 }
5016      };
5017  
5018      while ((c = getopt_long(argc, argv, ":hf:O:U", long_options, NULL))) {
5019          if (c == EOF) {
5020              break;
5021          }
5022          switch (c) {
5023          case 'O':
5024              out_fmt = optarg;
5025              break;
5026          case 'f':
5027              fmt = optarg;
5028              break;
5029          case ':':
5030              missing_argument(argv[optind - 1]);
5031              break;
5032          case '?':
5033              unrecognized_option(argv[optind - 1]);
5034              break;
5035          case 'h':
5036              help();
5037              break;
5038          case 'U':
5039              force_share = true;
5040              break;
5041          case OPTION_OBJECT:
5042              if (!qemu_opts_parse_noisily(&qemu_object_opts, optarg, true)) {
5043                  ret = -1;
5044                  goto out;
5045              }
5046              break;
5047          case OPTION_IMAGE_OPTS:
5048              image_opts = true;
5049              break;
5050          }
5051      }
5052  
5053      for (i = optind; i < argc; i++) {
5054          int j;
5055          arg = g_strdup(argv[i]);
5056  
5057          tmp = strchr(arg, '=');
5058          if (tmp == NULL) {
5059              error_report("unrecognized operand %s", arg);
5060              ret = -1;
5061              goto out;
5062          }
5063  
5064          *tmp++ = '\0';
5065  
5066          for (j = 0; options[j].name != NULL; j++) {
5067              if (!strcmp(arg, options[j].name)) {
5068                  break;
5069              }
5070          }
5071          if (options[j].name == NULL) {
5072              error_report("unrecognized operand %s", arg);
5073              ret = -1;
5074              goto out;
5075          }
5076  
5077          if (options[j].f(tmp, &in, &out, &dd) != 0) {
5078              ret = -1;
5079              goto out;
5080          }
5081          dd.flags |= options[j].flag;
5082          g_free(arg);
5083          arg = NULL;
5084      }
5085  
5086      if (!(dd.flags & C_IF && dd.flags & C_OF)) {
5087          error_report("Must specify both input and output files");
5088          ret = -1;
5089          goto out;
5090      }
5091  
5092      if (qemu_opts_foreach(&qemu_object_opts,
5093                            user_creatable_add_opts_foreach,
5094                            qemu_img_object_print_help, &error_fatal)) {
5095          ret = -1;
5096          goto out;
5097      }
5098  
5099      blk1 = img_open(image_opts, in.filename, fmt, 0, false, false,
5100                      force_share);
5101  
5102      if (!blk1) {
5103          ret = -1;
5104          goto out;
5105      }
5106  
5107      drv = bdrv_find_format(out_fmt);
5108      if (!drv) {
5109          error_report("Unknown file format");
5110          ret = -1;
5111          goto out;
5112      }
5113      proto_drv = bdrv_find_protocol(out.filename, true, &local_err);
5114  
5115      if (!proto_drv) {
5116          error_report_err(local_err);
5117          ret = -1;
5118          goto out;
5119      }
5120      if (!drv->create_opts) {
5121          error_report("Format driver '%s' does not support image creation",
5122                       drv->format_name);
5123          ret = -1;
5124          goto out;
5125      }
5126      if (!proto_drv->create_opts) {
5127          error_report("Protocol driver '%s' does not support image creation",
5128                       proto_drv->format_name);
5129          ret = -1;
5130          goto out;
5131      }
5132      create_opts = qemu_opts_append(create_opts, drv->create_opts);
5133      create_opts = qemu_opts_append(create_opts, proto_drv->create_opts);
5134  
5135      opts = qemu_opts_create(create_opts, NULL, 0, &error_abort);
5136  
5137      size = blk_getlength(blk1);
5138      if (size < 0) {
5139          error_report("Failed to get size for '%s'", in.filename);
5140          ret = -1;
5141          goto out;
5142      }
5143  
5144      if (dd.flags & C_COUNT && dd.count <= INT64_MAX / in.bsz &&
5145          dd.count * in.bsz < size) {
5146          size = dd.count * in.bsz;
5147      }
5148  
5149      /* Overflow means the specified offset is beyond input image's size */
5150      if (dd.flags & C_SKIP && (in.offset > INT64_MAX / in.bsz ||
5151                                size < in.bsz * in.offset)) {
5152          qemu_opt_set_number(opts, BLOCK_OPT_SIZE, 0, &error_abort);
5153      } else {
5154          qemu_opt_set_number(opts, BLOCK_OPT_SIZE,
5155                              size - in.bsz * in.offset, &error_abort);
5156      }
5157  
5158      ret = bdrv_create(drv, out.filename, opts, &local_err);
5159      if (ret < 0) {
5160          error_reportf_err(local_err,
5161                            "%s: error while creating output image: ",
5162                            out.filename);
5163          ret = -1;
5164          goto out;
5165      }
5166  
5167      /* TODO, we can't honour --image-opts for the target,
5168       * since it needs to be given in a format compatible
5169       * with the bdrv_create() call above which does not
5170       * support image-opts style.
5171       */
5172      blk2 = img_open_file(out.filename, NULL, out_fmt, BDRV_O_RDWR,
5173                           false, false, false);
5174  
5175      if (!blk2) {
5176          ret = -1;
5177          goto out;
5178      }
5179  
5180      if (dd.flags & C_SKIP && (in.offset > INT64_MAX / in.bsz ||
5181                                size < in.offset * in.bsz)) {
5182          /* We give a warning if the skip option is bigger than the input
5183           * size and create an empty output disk image (i.e. like dd(1)).
5184           */
5185          error_report("%s: cannot skip to specified offset", in.filename);
5186          in_pos = size;
5187      } else {
5188          in_pos = in.offset * in.bsz;
5189      }
5190  
5191      in.buf = g_new(uint8_t, in.bsz);
5192  
5193      for (out_pos = 0; in_pos < size; block_count++) {
5194          int in_ret, out_ret;
5195  
5196          if (in_pos + in.bsz > size) {
5197              in_ret = blk_pread(blk1, in_pos, in.buf, size - in_pos);
5198          } else {
5199              in_ret = blk_pread(blk1, in_pos, in.buf, in.bsz);
5200          }
5201          if (in_ret < 0) {
5202              error_report("error while reading from input image file: %s",
5203                           strerror(-in_ret));
5204              ret = -1;
5205              goto out;
5206          }
5207          in_pos += in_ret;
5208  
5209          out_ret = blk_pwrite(blk2, out_pos, in.buf, in_ret, 0);
5210  
5211          if (out_ret < 0) {
5212              error_report("error while writing to output image file: %s",
5213                           strerror(-out_ret));
5214              ret = -1;
5215              goto out;
5216          }
5217          out_pos += out_ret;
5218      }
5219  
5220  out:
5221      g_free(arg);
5222      qemu_opts_del(opts);
5223      qemu_opts_free(create_opts);
5224      blk_unref(blk1);
5225      blk_unref(blk2);
5226      g_free(in.filename);
5227      g_free(out.filename);
5228      g_free(in.buf);
5229      g_free(out.buf);
5230  
5231      if (ret) {
5232          return 1;
5233      }
5234      return 0;
5235  }
5236  
5237  static void dump_json_block_measure_info(BlockMeasureInfo *info)
5238  {
5239      QString *str;
5240      QObject *obj;
5241      Visitor *v = qobject_output_visitor_new(&obj);
5242  
5243      visit_type_BlockMeasureInfo(v, NULL, &info, &error_abort);
5244      visit_complete(v, &obj);
5245      str = qobject_to_json_pretty(obj);
5246      assert(str != NULL);
5247      printf("%s\n", qstring_get_str(str));
5248      qobject_unref(obj);
5249      visit_free(v);
5250      qobject_unref(str);
5251  }
5252  
5253  static int img_measure(int argc, char **argv)
5254  {
5255      static const struct option long_options[] = {
5256          {"help", no_argument, 0, 'h'},
5257          {"image-opts", no_argument, 0, OPTION_IMAGE_OPTS},
5258          {"object", required_argument, 0, OPTION_OBJECT},
5259          {"output", required_argument, 0, OPTION_OUTPUT},
5260          {"size", required_argument, 0, OPTION_SIZE},
5261          {"force-share", no_argument, 0, 'U'},
5262          {0, 0, 0, 0}
5263      };
5264      OutputFormat output_format = OFORMAT_HUMAN;
5265      BlockBackend *in_blk = NULL;
5266      BlockDriver *drv;
5267      const char *filename = NULL;
5268      const char *fmt = NULL;
5269      const char *out_fmt = "raw";
5270      char *options = NULL;
5271      char *snapshot_name = NULL;
5272      bool force_share = false;
5273      QemuOpts *opts = NULL;
5274      QemuOpts *object_opts = NULL;
5275      QemuOpts *sn_opts = NULL;
5276      QemuOptsList *create_opts = NULL;
5277      bool image_opts = false;
5278      uint64_t img_size = UINT64_MAX;
5279      BlockMeasureInfo *info = NULL;
5280      Error *local_err = NULL;
5281      int ret = 1;
5282      int c;
5283  
5284      while ((c = getopt_long(argc, argv, "hf:O:o:l:U",
5285                              long_options, NULL)) != -1) {
5286          switch (c) {
5287          case '?':
5288          case 'h':
5289              help();
5290              break;
5291          case 'f':
5292              fmt = optarg;
5293              break;
5294          case 'O':
5295              out_fmt = optarg;
5296              break;
5297          case 'o':
5298              if (accumulate_options(&options, optarg) < 0) {
5299                  goto out;
5300              }
5301              break;
5302          case 'l':
5303              if (strstart(optarg, SNAPSHOT_OPT_BASE, NULL)) {
5304                  sn_opts = qemu_opts_parse_noisily(&internal_snapshot_opts,
5305                                                    optarg, false);
5306                  if (!sn_opts) {
5307                      error_report("Failed in parsing snapshot param '%s'",
5308                                   optarg);
5309                      goto out;
5310                  }
5311              } else {
5312                  snapshot_name = optarg;
5313              }
5314              break;
5315          case 'U':
5316              force_share = true;
5317              break;
5318          case OPTION_OBJECT:
5319              object_opts = qemu_opts_parse_noisily(&qemu_object_opts,
5320                                                    optarg, true);
5321              if (!object_opts) {
5322                  goto out;
5323              }
5324              break;
5325          case OPTION_IMAGE_OPTS:
5326              image_opts = true;
5327              break;
5328          case OPTION_OUTPUT:
5329              if (!strcmp(optarg, "json")) {
5330                  output_format = OFORMAT_JSON;
5331              } else if (!strcmp(optarg, "human")) {
5332                  output_format = OFORMAT_HUMAN;
5333              } else {
5334                  error_report("--output must be used with human or json "
5335                               "as argument.");
5336                  goto out;
5337              }
5338              break;
5339          case OPTION_SIZE:
5340          {
5341              int64_t sval;
5342  
5343              sval = cvtnum("image size", optarg);
5344              if (sval < 0) {
5345                  goto out;
5346              }
5347              img_size = (uint64_t)sval;
5348          }
5349          break;
5350          }
5351      }
5352  
5353      if (qemu_opts_foreach(&qemu_object_opts,
5354                            user_creatable_add_opts_foreach,
5355                            qemu_img_object_print_help, &error_fatal)) {
5356          goto out;
5357      }
5358  
5359      if (argc - optind > 1) {
5360          error_report("At most one filename argument is allowed.");
5361          goto out;
5362      } else if (argc - optind == 1) {
5363          filename = argv[optind];
5364      }
5365  
5366      if (!filename && (image_opts || fmt || snapshot_name || sn_opts)) {
5367          error_report("--image-opts, -f, and -l require a filename argument.");
5368          goto out;
5369      }
5370      if (filename && img_size != UINT64_MAX) {
5371          error_report("--size N cannot be used together with a filename.");
5372          goto out;
5373      }
5374      if (!filename && img_size == UINT64_MAX) {
5375          error_report("Either --size N or one filename must be specified.");
5376          goto out;
5377      }
5378  
5379      if (filename) {
5380          in_blk = img_open(image_opts, filename, fmt, 0,
5381                            false, false, force_share);
5382          if (!in_blk) {
5383              goto out;
5384          }
5385  
5386          if (sn_opts) {
5387              bdrv_snapshot_load_tmp(blk_bs(in_blk),
5388                      qemu_opt_get(sn_opts, SNAPSHOT_OPT_ID),
5389                      qemu_opt_get(sn_opts, SNAPSHOT_OPT_NAME),
5390                      &local_err);
5391          } else if (snapshot_name != NULL) {
5392              bdrv_snapshot_load_tmp_by_id_or_name(blk_bs(in_blk),
5393                      snapshot_name, &local_err);
5394          }
5395          if (local_err) {
5396              error_reportf_err(local_err, "Failed to load snapshot: ");
5397              goto out;
5398          }
5399      }
5400  
5401      drv = bdrv_find_format(out_fmt);
5402      if (!drv) {
5403          error_report("Unknown file format '%s'", out_fmt);
5404          goto out;
5405      }
5406      if (!drv->create_opts) {
5407          error_report("Format driver '%s' does not support image creation",
5408                       drv->format_name);
5409          goto out;
5410      }
5411  
5412      create_opts = qemu_opts_append(create_opts, drv->create_opts);
5413      create_opts = qemu_opts_append(create_opts, bdrv_file.create_opts);
5414      opts = qemu_opts_create(create_opts, NULL, 0, &error_abort);
5415      if (options) {
5416          if (!qemu_opts_do_parse(opts, options, NULL, &local_err)) {
5417              error_report_err(local_err);
5418              error_report("Invalid options for file format '%s'", out_fmt);
5419              goto out;
5420          }
5421      }
5422      if (img_size != UINT64_MAX) {
5423          qemu_opt_set_number(opts, BLOCK_OPT_SIZE, img_size, &error_abort);
5424      }
5425  
5426      info = bdrv_measure(drv, opts, in_blk ? blk_bs(in_blk) : NULL, &local_err);
5427      if (local_err) {
5428          error_report_err(local_err);
5429          goto out;
5430      }
5431  
5432      if (output_format == OFORMAT_HUMAN) {
5433          printf("required size: %" PRIu64 "\n", info->required);
5434          printf("fully allocated size: %" PRIu64 "\n", info->fully_allocated);
5435          if (info->has_bitmaps) {
5436              printf("bitmaps size: %" PRIu64 "\n", info->bitmaps);
5437          }
5438      } else {
5439          dump_json_block_measure_info(info);
5440      }
5441  
5442      ret = 0;
5443  
5444  out:
5445      qapi_free_BlockMeasureInfo(info);
5446      qemu_opts_del(object_opts);
5447      qemu_opts_del(opts);
5448      qemu_opts_del(sn_opts);
5449      qemu_opts_free(create_opts);
5450      g_free(options);
5451      blk_unref(in_blk);
5452      return ret;
5453  }
5454  
5455  static const img_cmd_t img_cmds[] = {
5456  #define DEF(option, callback, arg_string)        \
5457      { option, callback },
5458  #include "qemu-img-cmds.h"
5459  #undef DEF
5460      { NULL, NULL, },
5461  };
5462  
5463  int main(int argc, char **argv)
5464  {
5465      const img_cmd_t *cmd;
5466      const char *cmdname;
5467      Error *local_error = NULL;
5468      int c;
5469      static const struct option long_options[] = {
5470          {"help", no_argument, 0, 'h'},
5471          {"version", no_argument, 0, 'V'},
5472          {"trace", required_argument, NULL, 'T'},
5473          {0, 0, 0, 0}
5474      };
5475  
5476  #ifdef CONFIG_POSIX
5477      signal(SIGPIPE, SIG_IGN);
5478  #endif
5479  
5480      socket_init();
5481      error_init(argv[0]);
5482      module_call_init(MODULE_INIT_TRACE);
5483      qemu_init_exec_dir(argv[0]);
5484  
5485      if (qemu_init_main_loop(&local_error)) {
5486          error_report_err(local_error);
5487          exit(EXIT_FAILURE);
5488      }
5489  
5490      qcrypto_init(&error_fatal);
5491  
5492      module_call_init(MODULE_INIT_QOM);
5493      bdrv_init();
5494      if (argc < 2) {
5495          error_exit("Not enough arguments");
5496      }
5497  
5498      qemu_add_opts(&qemu_object_opts);
5499      qemu_add_opts(&qemu_source_opts);
5500      qemu_add_opts(&qemu_trace_opts);
5501  
5502      while ((c = getopt_long(argc, argv, "+:hVT:", long_options, NULL)) != -1) {
5503          switch (c) {
5504          case ':':
5505              missing_argument(argv[optind - 1]);
5506              return 0;
5507          case '?':
5508              unrecognized_option(argv[optind - 1]);
5509              return 0;
5510          case 'h':
5511              help();
5512              return 0;
5513          case 'V':
5514              printf(QEMU_IMG_VERSION);
5515              return 0;
5516          case 'T':
5517              trace_opt_parse(optarg);
5518              break;
5519          }
5520      }
5521  
5522      cmdname = argv[optind];
5523  
5524      /* reset getopt_long scanning */
5525      argc -= optind;
5526      if (argc < 1) {
5527          return 0;
5528      }
5529      argv += optind;
5530      qemu_reset_optind();
5531  
5532      if (!trace_init_backends()) {
5533          exit(1);
5534      }
5535      trace_init_file();
5536      qemu_set_log(LOG_TRACE);
5537  
5538      /* find the command */
5539      for (cmd = img_cmds; cmd->name != NULL; cmd++) {
5540          if (!strcmp(cmdname, cmd->name)) {
5541              return cmd->handler(argc, argv);
5542          }
5543      }
5544  
5545      /* not found */
5546      error_exit("Command not found: %s", cmdname);
5547  }
5548