add a version number to ram_list
[qemu/kevin.git] / qemu-img.c
blob69cc02871b10649bdabaf78a5e2cfdbf66bf17dd
1 /*
2 * QEMU disk image utility
4 * Copyright (c) 2003-2008 Fabrice Bellard
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:
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
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.
24 #include "qapi-visit.h"
25 #include "qapi/qmp-output-visitor.h"
26 #include "qapi/qmp/qjson.h"
27 #include "qemu-common.h"
28 #include "qemu/option.h"
29 #include "qemu/error-report.h"
30 #include "qemu/osdep.h"
31 #include "sysemu/sysemu.h"
32 #include "block/block_int.h"
33 #include <getopt.h>
34 #include <stdio.h>
36 #ifdef _WIN32
37 #include <windows.h>
38 #endif
40 typedef struct img_cmd_t {
41 const char *name;
42 int (*handler)(int argc, char **argv);
43 } img_cmd_t;
45 /* Default to cache=writeback as data integrity is not important for qemu-tcg. */
46 #define BDRV_O_FLAGS BDRV_O_CACHE_WB
47 #define BDRV_DEFAULT_CACHE "writeback"
49 static void format_print(void *opaque, const char *name)
51 printf(" %s", name);
54 /* Please keep in synch with qemu-img.texi */
55 static void help(void)
57 const char *help_msg =
58 "qemu-img version " QEMU_VERSION ", Copyright (c) 2004-2008 Fabrice Bellard\n"
59 "usage: qemu-img command [command options]\n"
60 "QEMU disk image utility\n"
61 "\n"
62 "Command syntax:\n"
63 #define DEF(option, callback, arg_string) \
64 " " arg_string "\n"
65 #include "qemu-img-cmds.h"
66 #undef DEF
67 #undef GEN_DOCS
68 "\n"
69 "Command parameters:\n"
70 " 'filename' is a disk image filename\n"
71 " 'fmt' is the disk image format. It is guessed automatically in most cases\n"
72 " 'cache' is the cache mode used to write the output disk image, the valid\n"
73 " options are: 'none', 'writeback' (default, except for convert), 'writethrough',\n"
74 " 'directsync' and 'unsafe' (default for convert)\n"
75 " 'size' is the disk image size in bytes. Optional suffixes\n"
76 " 'k' or 'K' (kilobyte, 1024), 'M' (megabyte, 1024k), 'G' (gigabyte, 1024M)\n"
77 " and T (terabyte, 1024G) are supported. 'b' is ignored.\n"
78 " 'output_filename' is the destination disk image filename\n"
79 " 'output_fmt' is the destination format\n"
80 " 'options' is a comma separated list of format specific options in a\n"
81 " name=value format. Use -o ? for an overview of the options supported by the\n"
82 " used format\n"
83 " '-c' indicates that target image must be compressed (qcow format only)\n"
84 " '-u' enables unsafe rebasing. It is assumed that old and new backing file\n"
85 " match exactly. The image doesn't need a working backing file before\n"
86 " rebasing in this case (useful for renaming the backing file)\n"
87 " '-h' with or without a command shows this help and lists the supported formats\n"
88 " '-p' show progress of command (only certain commands)\n"
89 " '-S' indicates the consecutive number of bytes that must contain only zeros\n"
90 " for qemu-img to create a sparse image during conversion\n"
91 " '--output' takes the format in which the output must be done (human or json)\n"
92 "\n"
93 "Parameters to check subcommand:\n"
94 " '-r' tries to repair any inconsistencies that are found during the check.\n"
95 " '-r leaks' repairs only cluster leaks, whereas '-r all' fixes all\n"
96 " kinds of errors, with a higher risk of choosing the wrong fix or\n"
97 " hiding corruption that has already occurred.\n"
98 "\n"
99 "Parameters to snapshot subcommand:\n"
100 " 'snapshot' is the name of the snapshot to create, apply or delete\n"
101 " '-a' applies a snapshot (revert disk to saved state)\n"
102 " '-c' creates a snapshot\n"
103 " '-d' deletes a snapshot\n"
104 " '-l' lists all snapshots in the given image\n";
106 printf("%s\nSupported formats:", help_msg);
107 bdrv_iterate_format(format_print, NULL);
108 printf("\n");
109 exit(1);
112 #if defined(WIN32)
113 /* XXX: put correct support for win32 */
114 static int read_password(char *buf, int buf_size)
116 int c, i;
117 printf("Password: ");
118 fflush(stdout);
119 i = 0;
120 for(;;) {
121 c = getchar();
122 if (c == '\n')
123 break;
124 if (i < (buf_size - 1))
125 buf[i++] = c;
127 buf[i] = '\0';
128 return 0;
131 #else
133 #include <termios.h>
135 static struct termios oldtty;
137 static void term_exit(void)
139 tcsetattr (0, TCSANOW, &oldtty);
142 static void term_init(void)
144 struct termios tty;
146 tcgetattr (0, &tty);
147 oldtty = tty;
149 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
150 |INLCR|IGNCR|ICRNL|IXON);
151 tty.c_oflag |= OPOST;
152 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
153 tty.c_cflag &= ~(CSIZE|PARENB);
154 tty.c_cflag |= CS8;
155 tty.c_cc[VMIN] = 1;
156 tty.c_cc[VTIME] = 0;
158 tcsetattr (0, TCSANOW, &tty);
160 atexit(term_exit);
163 static int read_password(char *buf, int buf_size)
165 uint8_t ch;
166 int i, ret;
168 printf("password: ");
169 fflush(stdout);
170 term_init();
171 i = 0;
172 for(;;) {
173 ret = read(0, &ch, 1);
174 if (ret == -1) {
175 if (errno == EAGAIN || errno == EINTR) {
176 continue;
177 } else {
178 ret = -1;
179 break;
181 } else if (ret == 0) {
182 ret = -1;
183 break;
184 } else {
185 if (ch == '\r') {
186 ret = 0;
187 break;
189 if (i < (buf_size - 1))
190 buf[i++] = ch;
193 term_exit();
194 buf[i] = '\0';
195 printf("\n");
196 return ret;
198 #endif
200 static int print_block_option_help(const char *filename, const char *fmt)
202 BlockDriver *drv, *proto_drv;
203 QEMUOptionParameter *create_options = NULL;
205 /* Find driver and parse its options */
206 drv = bdrv_find_format(fmt);
207 if (!drv) {
208 error_report("Unknown file format '%s'", fmt);
209 return 1;
212 proto_drv = bdrv_find_protocol(filename);
213 if (!proto_drv) {
214 error_report("Unknown protocol '%s'", filename);
215 return 1;
218 create_options = append_option_parameters(create_options,
219 drv->create_options);
220 create_options = append_option_parameters(create_options,
221 proto_drv->create_options);
222 print_option_help(create_options);
223 free_option_parameters(create_options);
224 return 0;
227 static BlockDriverState *bdrv_new_open(const char *filename,
228 const char *fmt,
229 int flags,
230 bool require_io)
232 BlockDriverState *bs;
233 BlockDriver *drv;
234 char password[256];
235 int ret;
237 bs = bdrv_new("image");
239 if (fmt) {
240 drv = bdrv_find_format(fmt);
241 if (!drv) {
242 error_report("Unknown file format '%s'", fmt);
243 goto fail;
245 } else {
246 drv = NULL;
249 ret = bdrv_open(bs, filename, flags, drv);
250 if (ret < 0) {
251 error_report("Could not open '%s': %s", filename, strerror(-ret));
252 goto fail;
255 if (bdrv_is_encrypted(bs) && require_io) {
256 printf("Disk image '%s' is encrypted.\n", filename);
257 if (read_password(password, sizeof(password)) < 0) {
258 error_report("No password given");
259 goto fail;
261 if (bdrv_set_key(bs, password) < 0) {
262 error_report("invalid password");
263 goto fail;
266 return bs;
267 fail:
268 if (bs) {
269 bdrv_delete(bs);
271 return NULL;
274 static int add_old_style_options(const char *fmt, QEMUOptionParameter *list,
275 const char *base_filename,
276 const char *base_fmt)
278 if (base_filename) {
279 if (set_option_parameter(list, BLOCK_OPT_BACKING_FILE, base_filename)) {
280 error_report("Backing file not supported for file format '%s'",
281 fmt);
282 return -1;
285 if (base_fmt) {
286 if (set_option_parameter(list, BLOCK_OPT_BACKING_FMT, base_fmt)) {
287 error_report("Backing file format not supported for file "
288 "format '%s'", fmt);
289 return -1;
292 return 0;
295 static int img_create(int argc, char **argv)
297 int c;
298 uint64_t img_size = -1;
299 const char *fmt = "raw";
300 const char *base_fmt = NULL;
301 const char *filename;
302 const char *base_filename = NULL;
303 char *options = NULL;
304 Error *local_err = NULL;
306 for(;;) {
307 c = getopt(argc, argv, "F:b:f:he6o:");
308 if (c == -1) {
309 break;
311 switch(c) {
312 case '?':
313 case 'h':
314 help();
315 break;
316 case 'F':
317 base_fmt = optarg;
318 break;
319 case 'b':
320 base_filename = optarg;
321 break;
322 case 'f':
323 fmt = optarg;
324 break;
325 case 'e':
326 error_report("option -e is deprecated, please use \'-o "
327 "encryption\' instead!");
328 return 1;
329 case '6':
330 error_report("option -6 is deprecated, please use \'-o "
331 "compat6\' instead!");
332 return 1;
333 case 'o':
334 options = optarg;
335 break;
339 /* Get the filename */
340 if (optind >= argc) {
341 help();
343 filename = argv[optind++];
345 /* Get image size, if specified */
346 if (optind < argc) {
347 int64_t sval;
348 char *end;
349 sval = strtosz_suffix(argv[optind++], &end, STRTOSZ_DEFSUFFIX_B);
350 if (sval < 0 || *end) {
351 error_report("Invalid image size specified! You may use k, M, G or "
352 "T suffixes for ");
353 error_report("kilobytes, megabytes, gigabytes and terabytes.");
354 return 1;
356 img_size = (uint64_t)sval;
359 if (options && is_help_option(options)) {
360 return print_block_option_help(filename, fmt);
363 bdrv_img_create(filename, fmt, base_filename, base_fmt,
364 options, img_size, BDRV_O_FLAGS, &local_err);
365 if (error_is_set(&local_err)) {
366 error_report("%s", error_get_pretty(local_err));
367 error_free(local_err);
368 return 1;
371 return 0;
375 * Checks an image for consistency. Exit codes:
377 * 0 - Check completed, image is good
378 * 1 - Check not completed because of internal errors
379 * 2 - Check completed, image is corrupted
380 * 3 - Check completed, image has leaked clusters, but is good otherwise
382 static int img_check(int argc, char **argv)
384 int c, ret;
385 const char *filename, *fmt;
386 BlockDriverState *bs;
387 BdrvCheckResult result;
388 int fix = 0;
389 int flags = BDRV_O_FLAGS | BDRV_O_CHECK;
391 fmt = NULL;
392 for(;;) {
393 c = getopt(argc, argv, "f:hr:");
394 if (c == -1) {
395 break;
397 switch(c) {
398 case '?':
399 case 'h':
400 help();
401 break;
402 case 'f':
403 fmt = optarg;
404 break;
405 case 'r':
406 flags |= BDRV_O_RDWR;
408 if (!strcmp(optarg, "leaks")) {
409 fix = BDRV_FIX_LEAKS;
410 } else if (!strcmp(optarg, "all")) {
411 fix = BDRV_FIX_LEAKS | BDRV_FIX_ERRORS;
412 } else {
413 help();
415 break;
418 if (optind >= argc) {
419 help();
421 filename = argv[optind++];
423 bs = bdrv_new_open(filename, fmt, flags, true);
424 if (!bs) {
425 return 1;
427 ret = bdrv_check(bs, &result, fix);
429 if (ret == -ENOTSUP) {
430 error_report("This image format does not support checks");
431 bdrv_delete(bs);
432 return 1;
435 if (result.corruptions_fixed || result.leaks_fixed) {
436 printf("The following inconsistencies were found and repaired:\n\n"
437 " %d leaked clusters\n"
438 " %d corruptions\n\n"
439 "Double checking the fixed image now...\n",
440 result.leaks_fixed,
441 result.corruptions_fixed);
442 ret = bdrv_check(bs, &result, 0);
445 if (!(result.corruptions || result.leaks || result.check_errors)) {
446 printf("No errors were found on the image.\n");
447 } else {
448 if (result.corruptions) {
449 printf("\n%d errors were found on the image.\n"
450 "Data may be corrupted, or further writes to the image "
451 "may corrupt it.\n",
452 result.corruptions);
455 if (result.leaks) {
456 printf("\n%d leaked clusters were found on the image.\n"
457 "This means waste of disk space, but no harm to data.\n",
458 result.leaks);
461 if (result.check_errors) {
462 printf("\n%d internal errors have occurred during the check.\n",
463 result.check_errors);
467 if (result.bfi.total_clusters != 0 && result.bfi.allocated_clusters != 0) {
468 printf("%" PRId64 "/%" PRId64 "= %0.2f%% allocated, %0.2f%% fragmented\n",
469 result.bfi.allocated_clusters, result.bfi.total_clusters,
470 result.bfi.allocated_clusters * 100.0 / result.bfi.total_clusters,
471 result.bfi.fragmented_clusters * 100.0 / result.bfi.allocated_clusters);
474 bdrv_delete(bs);
476 if (ret < 0 || result.check_errors) {
477 printf("\nAn error has occurred during the check: %s\n"
478 "The check is not complete and may have missed error.\n",
479 strerror(-ret));
480 return 1;
483 if (result.corruptions) {
484 return 2;
485 } else if (result.leaks) {
486 return 3;
487 } else {
488 return 0;
492 static int img_commit(int argc, char **argv)
494 int c, ret, flags;
495 const char *filename, *fmt, *cache;
496 BlockDriverState *bs;
498 fmt = NULL;
499 cache = BDRV_DEFAULT_CACHE;
500 for(;;) {
501 c = getopt(argc, argv, "f:ht:");
502 if (c == -1) {
503 break;
505 switch(c) {
506 case '?':
507 case 'h':
508 help();
509 break;
510 case 'f':
511 fmt = optarg;
512 break;
513 case 't':
514 cache = optarg;
515 break;
518 if (optind >= argc) {
519 help();
521 filename = argv[optind++];
523 flags = BDRV_O_RDWR;
524 ret = bdrv_parse_cache_flags(cache, &flags);
525 if (ret < 0) {
526 error_report("Invalid cache option: %s", cache);
527 return -1;
530 bs = bdrv_new_open(filename, fmt, flags, true);
531 if (!bs) {
532 return 1;
534 ret = bdrv_commit(bs);
535 switch(ret) {
536 case 0:
537 printf("Image committed.\n");
538 break;
539 case -ENOENT:
540 error_report("No disk inserted");
541 break;
542 case -EACCES:
543 error_report("Image is read-only");
544 break;
545 case -ENOTSUP:
546 error_report("Image is already committed");
547 break;
548 default:
549 error_report("Error while committing image");
550 break;
553 bdrv_delete(bs);
554 if (ret) {
555 return 1;
557 return 0;
561 * Returns true iff the first sector pointed to by 'buf' contains at least
562 * a non-NUL byte.
564 * 'pnum' is set to the number of sectors (including and immediately following
565 * the first one) that are known to be in the same allocated/unallocated state.
567 static int is_allocated_sectors(const uint8_t *buf, int n, int *pnum)
569 bool is_zero;
570 int i;
572 if (n <= 0) {
573 *pnum = 0;
574 return 0;
576 is_zero = buffer_is_zero(buf, 512);
577 for(i = 1; i < n; i++) {
578 buf += 512;
579 if (is_zero != buffer_is_zero(buf, 512)) {
580 break;
583 *pnum = i;
584 return !is_zero;
588 * Like is_allocated_sectors, but if the buffer starts with a used sector,
589 * up to 'min' consecutive sectors containing zeros are ignored. This avoids
590 * breaking up write requests for only small sparse areas.
592 static int is_allocated_sectors_min(const uint8_t *buf, int n, int *pnum,
593 int min)
595 int ret;
596 int num_checked, num_used;
598 if (n < min) {
599 min = n;
602 ret = is_allocated_sectors(buf, n, pnum);
603 if (!ret) {
604 return ret;
607 num_used = *pnum;
608 buf += BDRV_SECTOR_SIZE * *pnum;
609 n -= *pnum;
610 num_checked = num_used;
612 while (n > 0) {
613 ret = is_allocated_sectors(buf, n, pnum);
615 buf += BDRV_SECTOR_SIZE * *pnum;
616 n -= *pnum;
617 num_checked += *pnum;
618 if (ret) {
619 num_used = num_checked;
620 } else if (*pnum >= min) {
621 break;
625 *pnum = num_used;
626 return 1;
630 * Compares two buffers sector by sector. Returns 0 if the first sector of both
631 * buffers matches, non-zero otherwise.
633 * pnum is set to the number of sectors (including and immediately following
634 * the first one) that are known to have the same comparison result
636 static int compare_sectors(const uint8_t *buf1, const uint8_t *buf2, int n,
637 int *pnum)
639 int res, i;
641 if (n <= 0) {
642 *pnum = 0;
643 return 0;
646 res = !!memcmp(buf1, buf2, 512);
647 for(i = 1; i < n; i++) {
648 buf1 += 512;
649 buf2 += 512;
651 if (!!memcmp(buf1, buf2, 512) != res) {
652 break;
656 *pnum = i;
657 return res;
660 #define IO_BUF_SIZE (2 * 1024 * 1024)
662 static int img_convert(int argc, char **argv)
664 int c, ret = 0, n, n1, bs_n, bs_i, compress, cluster_size, cluster_sectors;
665 int progress = 0, flags;
666 const char *fmt, *out_fmt, *cache, *out_baseimg, *out_filename;
667 BlockDriver *drv, *proto_drv;
668 BlockDriverState **bs = NULL, *out_bs = NULL;
669 int64_t total_sectors, nb_sectors, sector_num, bs_offset;
670 uint64_t bs_sectors;
671 uint8_t * buf = NULL;
672 const uint8_t *buf1;
673 BlockDriverInfo bdi;
674 QEMUOptionParameter *param = NULL, *create_options = NULL;
675 QEMUOptionParameter *out_baseimg_param;
676 char *options = NULL;
677 const char *snapshot_name = NULL;
678 float local_progress = 0;
679 int min_sparse = 8; /* Need at least 4k of zeros for sparse detection */
681 fmt = NULL;
682 out_fmt = "raw";
683 cache = "unsafe";
684 out_baseimg = NULL;
685 compress = 0;
686 for(;;) {
687 c = getopt(argc, argv, "f:O:B:s:hce6o:pS:t:");
688 if (c == -1) {
689 break;
691 switch(c) {
692 case '?':
693 case 'h':
694 help();
695 break;
696 case 'f':
697 fmt = optarg;
698 break;
699 case 'O':
700 out_fmt = optarg;
701 break;
702 case 'B':
703 out_baseimg = optarg;
704 break;
705 case 'c':
706 compress = 1;
707 break;
708 case 'e':
709 error_report("option -e is deprecated, please use \'-o "
710 "encryption\' instead!");
711 return 1;
712 case '6':
713 error_report("option -6 is deprecated, please use \'-o "
714 "compat6\' instead!");
715 return 1;
716 case 'o':
717 options = optarg;
718 break;
719 case 's':
720 snapshot_name = optarg;
721 break;
722 case 'S':
724 int64_t sval;
725 char *end;
726 sval = strtosz_suffix(optarg, &end, STRTOSZ_DEFSUFFIX_B);
727 if (sval < 0 || *end) {
728 error_report("Invalid minimum zero buffer size for sparse output specified");
729 return 1;
732 min_sparse = sval / BDRV_SECTOR_SIZE;
733 break;
735 case 'p':
736 progress = 1;
737 break;
738 case 't':
739 cache = optarg;
740 break;
744 bs_n = argc - optind - 1;
745 if (bs_n < 1) {
746 help();
749 out_filename = argv[argc - 1];
751 /* Initialize before goto out */
752 qemu_progress_init(progress, 2.0);
754 if (options && is_help_option(options)) {
755 ret = print_block_option_help(out_filename, out_fmt);
756 goto out;
759 if (bs_n > 1 && out_baseimg) {
760 error_report("-B makes no sense when concatenating multiple input "
761 "images");
762 ret = -1;
763 goto out;
766 qemu_progress_print(0, 100);
768 bs = g_malloc0(bs_n * sizeof(BlockDriverState *));
770 total_sectors = 0;
771 for (bs_i = 0; bs_i < bs_n; bs_i++) {
772 bs[bs_i] = bdrv_new_open(argv[optind + bs_i], fmt, BDRV_O_FLAGS, true);
773 if (!bs[bs_i]) {
774 error_report("Could not open '%s'", argv[optind + bs_i]);
775 ret = -1;
776 goto out;
778 bdrv_get_geometry(bs[bs_i], &bs_sectors);
779 total_sectors += bs_sectors;
782 if (snapshot_name != NULL) {
783 if (bs_n > 1) {
784 error_report("No support for concatenating multiple snapshot");
785 ret = -1;
786 goto out;
788 if (bdrv_snapshot_load_tmp(bs[0], snapshot_name) < 0) {
789 error_report("Failed to load snapshot");
790 ret = -1;
791 goto out;
795 /* Find driver and parse its options */
796 drv = bdrv_find_format(out_fmt);
797 if (!drv) {
798 error_report("Unknown file format '%s'", out_fmt);
799 ret = -1;
800 goto out;
803 proto_drv = bdrv_find_protocol(out_filename);
804 if (!proto_drv) {
805 error_report("Unknown protocol '%s'", out_filename);
806 ret = -1;
807 goto out;
810 create_options = append_option_parameters(create_options,
811 drv->create_options);
812 create_options = append_option_parameters(create_options,
813 proto_drv->create_options);
815 if (options) {
816 param = parse_option_parameters(options, create_options, param);
817 if (param == NULL) {
818 error_report("Invalid options for file format '%s'.", out_fmt);
819 ret = -1;
820 goto out;
822 } else {
823 param = parse_option_parameters("", create_options, param);
826 set_option_parameter_int(param, BLOCK_OPT_SIZE, total_sectors * 512);
827 ret = add_old_style_options(out_fmt, param, out_baseimg, NULL);
828 if (ret < 0) {
829 goto out;
832 /* Get backing file name if -o backing_file was used */
833 out_baseimg_param = get_option_parameter(param, BLOCK_OPT_BACKING_FILE);
834 if (out_baseimg_param) {
835 out_baseimg = out_baseimg_param->value.s;
838 /* Check if compression is supported */
839 if (compress) {
840 QEMUOptionParameter *encryption =
841 get_option_parameter(param, BLOCK_OPT_ENCRYPT);
842 QEMUOptionParameter *preallocation =
843 get_option_parameter(param, BLOCK_OPT_PREALLOC);
845 if (!drv->bdrv_write_compressed) {
846 error_report("Compression not supported for this file format");
847 ret = -1;
848 goto out;
851 if (encryption && encryption->value.n) {
852 error_report("Compression and encryption not supported at "
853 "the same time");
854 ret = -1;
855 goto out;
858 if (preallocation && preallocation->value.s
859 && strcmp(preallocation->value.s, "off"))
861 error_report("Compression and preallocation not supported at "
862 "the same time");
863 ret = -1;
864 goto out;
868 /* Create the new image */
869 ret = bdrv_create(drv, out_filename, param);
870 if (ret < 0) {
871 if (ret == -ENOTSUP) {
872 error_report("Formatting not supported for file format '%s'",
873 out_fmt);
874 } else if (ret == -EFBIG) {
875 error_report("The image size is too large for file format '%s'",
876 out_fmt);
877 } else {
878 error_report("%s: error while converting %s: %s",
879 out_filename, out_fmt, strerror(-ret));
881 goto out;
884 flags = BDRV_O_RDWR;
885 ret = bdrv_parse_cache_flags(cache, &flags);
886 if (ret < 0) {
887 error_report("Invalid cache option: %s", cache);
888 return -1;
891 out_bs = bdrv_new_open(out_filename, out_fmt, flags, true);
892 if (!out_bs) {
893 ret = -1;
894 goto out;
897 bs_i = 0;
898 bs_offset = 0;
899 bdrv_get_geometry(bs[0], &bs_sectors);
900 buf = qemu_blockalign(out_bs, IO_BUF_SIZE);
902 if (compress) {
903 ret = bdrv_get_info(out_bs, &bdi);
904 if (ret < 0) {
905 error_report("could not get block driver info");
906 goto out;
908 cluster_size = bdi.cluster_size;
909 if (cluster_size <= 0 || cluster_size > IO_BUF_SIZE) {
910 error_report("invalid cluster size");
911 ret = -1;
912 goto out;
914 cluster_sectors = cluster_size >> 9;
915 sector_num = 0;
917 nb_sectors = total_sectors;
918 if (nb_sectors != 0) {
919 local_progress = (float)100 /
920 (nb_sectors / MIN(nb_sectors, cluster_sectors));
923 for(;;) {
924 int64_t bs_num;
925 int remainder;
926 uint8_t *buf2;
928 nb_sectors = total_sectors - sector_num;
929 if (nb_sectors <= 0)
930 break;
931 if (nb_sectors >= cluster_sectors)
932 n = cluster_sectors;
933 else
934 n = nb_sectors;
936 bs_num = sector_num - bs_offset;
937 assert (bs_num >= 0);
938 remainder = n;
939 buf2 = buf;
940 while (remainder > 0) {
941 int nlow;
942 while (bs_num == bs_sectors) {
943 bs_i++;
944 assert (bs_i < bs_n);
945 bs_offset += bs_sectors;
946 bdrv_get_geometry(bs[bs_i], &bs_sectors);
947 bs_num = 0;
948 /* printf("changing part: sector_num=%" PRId64 ", "
949 "bs_i=%d, bs_offset=%" PRId64 ", bs_sectors=%" PRId64
950 "\n", sector_num, bs_i, bs_offset, bs_sectors); */
952 assert (bs_num < bs_sectors);
954 nlow = (remainder > bs_sectors - bs_num) ? bs_sectors - bs_num : remainder;
956 ret = bdrv_read(bs[bs_i], bs_num, buf2, nlow);
957 if (ret < 0) {
958 error_report("error while reading sector %" PRId64 ": %s",
959 bs_num, strerror(-ret));
960 goto out;
963 buf2 += nlow * 512;
964 bs_num += nlow;
966 remainder -= nlow;
968 assert (remainder == 0);
970 if (n < cluster_sectors) {
971 memset(buf + n * 512, 0, cluster_size - n * 512);
973 if (!buffer_is_zero(buf, cluster_size)) {
974 ret = bdrv_write_compressed(out_bs, sector_num, buf,
975 cluster_sectors);
976 if (ret != 0) {
977 error_report("error while compressing sector %" PRId64
978 ": %s", sector_num, strerror(-ret));
979 goto out;
982 sector_num += n;
983 qemu_progress_print(local_progress, 100);
985 /* signal EOF to align */
986 bdrv_write_compressed(out_bs, 0, NULL, 0);
987 } else {
988 int has_zero_init = bdrv_has_zero_init(out_bs);
990 sector_num = 0; // total number of sectors converted so far
991 nb_sectors = total_sectors - sector_num;
992 if (nb_sectors != 0) {
993 local_progress = (float)100 /
994 (nb_sectors / MIN(nb_sectors, IO_BUF_SIZE / 512));
997 for(;;) {
998 nb_sectors = total_sectors - sector_num;
999 if (nb_sectors <= 0) {
1000 break;
1002 if (nb_sectors >= (IO_BUF_SIZE / 512)) {
1003 n = (IO_BUF_SIZE / 512);
1004 } else {
1005 n = nb_sectors;
1008 while (sector_num - bs_offset >= bs_sectors) {
1009 bs_i ++;
1010 assert (bs_i < bs_n);
1011 bs_offset += bs_sectors;
1012 bdrv_get_geometry(bs[bs_i], &bs_sectors);
1013 /* printf("changing part: sector_num=%" PRId64 ", bs_i=%d, "
1014 "bs_offset=%" PRId64 ", bs_sectors=%" PRId64 "\n",
1015 sector_num, bs_i, bs_offset, bs_sectors); */
1018 if (n > bs_offset + bs_sectors - sector_num) {
1019 n = bs_offset + bs_sectors - sector_num;
1022 if (has_zero_init) {
1023 /* If the output image is being created as a copy on write image,
1024 assume that sectors which are unallocated in the input image
1025 are present in both the output's and input's base images (no
1026 need to copy them). */
1027 if (out_baseimg) {
1028 if (!bdrv_is_allocated(bs[bs_i], sector_num - bs_offset,
1029 n, &n1)) {
1030 sector_num += n1;
1031 continue;
1033 /* The next 'n1' sectors are allocated in the input image. Copy
1034 only those as they may be followed by unallocated sectors. */
1035 n = n1;
1037 } else {
1038 n1 = n;
1041 ret = bdrv_read(bs[bs_i], sector_num - bs_offset, buf, n);
1042 if (ret < 0) {
1043 error_report("error while reading sector %" PRId64 ": %s",
1044 sector_num - bs_offset, strerror(-ret));
1045 goto out;
1047 /* NOTE: at the same time we convert, we do not write zero
1048 sectors to have a chance to compress the image. Ideally, we
1049 should add a specific call to have the info to go faster */
1050 buf1 = buf;
1051 while (n > 0) {
1052 /* If the output image is being created as a copy on write image,
1053 copy all sectors even the ones containing only NUL bytes,
1054 because they may differ from the sectors in the base image.
1056 If the output is to a host device, we also write out
1057 sectors that are entirely 0, since whatever data was
1058 already there is garbage, not 0s. */
1059 if (!has_zero_init || out_baseimg ||
1060 is_allocated_sectors_min(buf1, n, &n1, min_sparse)) {
1061 ret = bdrv_write(out_bs, sector_num, buf1, n1);
1062 if (ret < 0) {
1063 error_report("error while writing sector %" PRId64
1064 ": %s", sector_num, strerror(-ret));
1065 goto out;
1068 sector_num += n1;
1069 n -= n1;
1070 buf1 += n1 * 512;
1072 qemu_progress_print(local_progress, 100);
1075 out:
1076 qemu_progress_end();
1077 free_option_parameters(create_options);
1078 free_option_parameters(param);
1079 qemu_vfree(buf);
1080 if (out_bs) {
1081 bdrv_delete(out_bs);
1083 if (bs) {
1084 for (bs_i = 0; bs_i < bs_n; bs_i++) {
1085 if (bs[bs_i]) {
1086 bdrv_delete(bs[bs_i]);
1089 g_free(bs);
1091 if (ret) {
1092 return 1;
1094 return 0;
1098 static void dump_snapshots(BlockDriverState *bs)
1100 QEMUSnapshotInfo *sn_tab, *sn;
1101 int nb_sns, i;
1102 char buf[256];
1104 nb_sns = bdrv_snapshot_list(bs, &sn_tab);
1105 if (nb_sns <= 0)
1106 return;
1107 printf("Snapshot list:\n");
1108 printf("%s\n", bdrv_snapshot_dump(buf, sizeof(buf), NULL));
1109 for(i = 0; i < nb_sns; i++) {
1110 sn = &sn_tab[i];
1111 printf("%s\n", bdrv_snapshot_dump(buf, sizeof(buf), sn));
1113 g_free(sn_tab);
1116 static void dump_json_image_info_list(ImageInfoList *list)
1118 Error *errp = NULL;
1119 QString *str;
1120 QmpOutputVisitor *ov = qmp_output_visitor_new();
1121 QObject *obj;
1122 visit_type_ImageInfoList(qmp_output_get_visitor(ov),
1123 &list, NULL, &errp);
1124 obj = qmp_output_get_qobject(ov);
1125 str = qobject_to_json_pretty(obj);
1126 assert(str != NULL);
1127 printf("%s\n", qstring_get_str(str));
1128 qobject_decref(obj);
1129 qmp_output_visitor_cleanup(ov);
1130 QDECREF(str);
1133 static void collect_snapshots(BlockDriverState *bs , ImageInfo *info)
1135 int i, sn_count;
1136 QEMUSnapshotInfo *sn_tab = NULL;
1137 SnapshotInfoList *info_list, *cur_item = NULL;
1138 sn_count = bdrv_snapshot_list(bs, &sn_tab);
1140 for (i = 0; i < sn_count; i++) {
1141 info->has_snapshots = true;
1142 info_list = g_new0(SnapshotInfoList, 1);
1144 info_list->value = g_new0(SnapshotInfo, 1);
1145 info_list->value->id = g_strdup(sn_tab[i].id_str);
1146 info_list->value->name = g_strdup(sn_tab[i].name);
1147 info_list->value->vm_state_size = sn_tab[i].vm_state_size;
1148 info_list->value->date_sec = sn_tab[i].date_sec;
1149 info_list->value->date_nsec = sn_tab[i].date_nsec;
1150 info_list->value->vm_clock_sec = sn_tab[i].vm_clock_nsec / 1000000000;
1151 info_list->value->vm_clock_nsec = sn_tab[i].vm_clock_nsec % 1000000000;
1153 /* XXX: waiting for the qapi to support qemu-queue.h types */
1154 if (!cur_item) {
1155 info->snapshots = cur_item = info_list;
1156 } else {
1157 cur_item->next = info_list;
1158 cur_item = info_list;
1163 g_free(sn_tab);
1166 static void dump_json_image_info(ImageInfo *info)
1168 Error *errp = NULL;
1169 QString *str;
1170 QmpOutputVisitor *ov = qmp_output_visitor_new();
1171 QObject *obj;
1172 visit_type_ImageInfo(qmp_output_get_visitor(ov),
1173 &info, NULL, &errp);
1174 obj = qmp_output_get_qobject(ov);
1175 str = qobject_to_json_pretty(obj);
1176 assert(str != NULL);
1177 printf("%s\n", qstring_get_str(str));
1178 qobject_decref(obj);
1179 qmp_output_visitor_cleanup(ov);
1180 QDECREF(str);
1183 static void collect_image_info(BlockDriverState *bs,
1184 ImageInfo *info,
1185 const char *filename,
1186 const char *fmt)
1188 uint64_t total_sectors;
1189 char backing_filename[1024];
1190 char backing_filename2[1024];
1191 BlockDriverInfo bdi;
1193 bdrv_get_geometry(bs, &total_sectors);
1195 info->filename = g_strdup(filename);
1196 info->format = g_strdup(bdrv_get_format_name(bs));
1197 info->virtual_size = total_sectors * 512;
1198 info->actual_size = bdrv_get_allocated_file_size(bs);
1199 info->has_actual_size = info->actual_size >= 0;
1200 if (bdrv_is_encrypted(bs)) {
1201 info->encrypted = true;
1202 info->has_encrypted = true;
1204 if (bdrv_get_info(bs, &bdi) >= 0) {
1205 if (bdi.cluster_size != 0) {
1206 info->cluster_size = bdi.cluster_size;
1207 info->has_cluster_size = true;
1209 info->dirty_flag = bdi.is_dirty;
1210 info->has_dirty_flag = true;
1212 bdrv_get_backing_filename(bs, backing_filename, sizeof(backing_filename));
1213 if (backing_filename[0] != '\0') {
1214 info->backing_filename = g_strdup(backing_filename);
1215 info->has_backing_filename = true;
1216 bdrv_get_full_backing_filename(bs, backing_filename2,
1217 sizeof(backing_filename2));
1219 if (strcmp(backing_filename, backing_filename2) != 0) {
1220 info->full_backing_filename =
1221 g_strdup(backing_filename2);
1222 info->has_full_backing_filename = true;
1225 if (bs->backing_format[0]) {
1226 info->backing_filename_format = g_strdup(bs->backing_format);
1227 info->has_backing_filename_format = true;
1232 static void dump_human_image_info(ImageInfo *info)
1234 char size_buf[128], dsize_buf[128];
1235 if (!info->has_actual_size) {
1236 snprintf(dsize_buf, sizeof(dsize_buf), "unavailable");
1237 } else {
1238 get_human_readable_size(dsize_buf, sizeof(dsize_buf),
1239 info->actual_size);
1241 get_human_readable_size(size_buf, sizeof(size_buf), info->virtual_size);
1242 printf("image: %s\n"
1243 "file format: %s\n"
1244 "virtual size: %s (%" PRId64 " bytes)\n"
1245 "disk size: %s\n",
1246 info->filename, info->format, size_buf,
1247 info->virtual_size,
1248 dsize_buf);
1250 if (info->has_encrypted && info->encrypted) {
1251 printf("encrypted: yes\n");
1254 if (info->has_cluster_size) {
1255 printf("cluster_size: %" PRId64 "\n", info->cluster_size);
1258 if (info->has_dirty_flag && info->dirty_flag) {
1259 printf("cleanly shut down: no\n");
1262 if (info->has_backing_filename) {
1263 printf("backing file: %s", info->backing_filename);
1264 if (info->has_full_backing_filename) {
1265 printf(" (actual path: %s)", info->full_backing_filename);
1267 putchar('\n');
1268 if (info->has_backing_filename_format) {
1269 printf("backing file format: %s\n", info->backing_filename_format);
1273 if (info->has_snapshots) {
1274 SnapshotInfoList *elem;
1275 char buf[256];
1277 printf("Snapshot list:\n");
1278 printf("%s\n", bdrv_snapshot_dump(buf, sizeof(buf), NULL));
1280 /* Ideally bdrv_snapshot_dump() would operate on SnapshotInfoList but
1281 * we convert to the block layer's native QEMUSnapshotInfo for now.
1283 for (elem = info->snapshots; elem; elem = elem->next) {
1284 QEMUSnapshotInfo sn = {
1285 .vm_state_size = elem->value->vm_state_size,
1286 .date_sec = elem->value->date_sec,
1287 .date_nsec = elem->value->date_nsec,
1288 .vm_clock_nsec = elem->value->vm_clock_sec * 1000000000ULL +
1289 elem->value->vm_clock_nsec,
1292 pstrcpy(sn.id_str, sizeof(sn.id_str), elem->value->id);
1293 pstrcpy(sn.name, sizeof(sn.name), elem->value->name);
1294 printf("%s\n", bdrv_snapshot_dump(buf, sizeof(buf), &sn));
1299 static void dump_human_image_info_list(ImageInfoList *list)
1301 ImageInfoList *elem;
1302 bool delim = false;
1304 for (elem = list; elem; elem = elem->next) {
1305 if (delim) {
1306 printf("\n");
1308 delim = true;
1310 dump_human_image_info(elem->value);
1314 static gboolean str_equal_func(gconstpointer a, gconstpointer b)
1316 return strcmp(a, b) == 0;
1320 * Open an image file chain and return an ImageInfoList
1322 * @filename: topmost image filename
1323 * @fmt: topmost image format (may be NULL to autodetect)
1324 * @chain: true - enumerate entire backing file chain
1325 * false - only topmost image file
1327 * Returns a list of ImageInfo objects or NULL if there was an error opening an
1328 * image file. If there was an error a message will have been printed to
1329 * stderr.
1331 static ImageInfoList *collect_image_info_list(const char *filename,
1332 const char *fmt,
1333 bool chain)
1335 ImageInfoList *head = NULL;
1336 ImageInfoList **last = &head;
1337 GHashTable *filenames;
1339 filenames = g_hash_table_new_full(g_str_hash, str_equal_func, NULL, NULL);
1341 while (filename) {
1342 BlockDriverState *bs;
1343 ImageInfo *info;
1344 ImageInfoList *elem;
1346 if (g_hash_table_lookup_extended(filenames, filename, NULL, NULL)) {
1347 error_report("Backing file '%s' creates an infinite loop.",
1348 filename);
1349 goto err;
1351 g_hash_table_insert(filenames, (gpointer)filename, NULL);
1353 bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_NO_BACKING,
1354 false);
1355 if (!bs) {
1356 goto err;
1359 info = g_new0(ImageInfo, 1);
1360 collect_image_info(bs, info, filename, fmt);
1361 collect_snapshots(bs, info);
1363 elem = g_new0(ImageInfoList, 1);
1364 elem->value = info;
1365 *last = elem;
1366 last = &elem->next;
1368 bdrv_delete(bs);
1370 filename = fmt = NULL;
1371 if (chain) {
1372 if (info->has_full_backing_filename) {
1373 filename = info->full_backing_filename;
1374 } else if (info->has_backing_filename) {
1375 filename = info->backing_filename;
1377 if (info->has_backing_filename_format) {
1378 fmt = info->backing_filename_format;
1382 g_hash_table_destroy(filenames);
1383 return head;
1385 err:
1386 qapi_free_ImageInfoList(head);
1387 g_hash_table_destroy(filenames);
1388 return NULL;
1391 enum {
1392 OPTION_OUTPUT = 256,
1393 OPTION_BACKING_CHAIN = 257,
1396 typedef enum OutputFormat {
1397 OFORMAT_JSON,
1398 OFORMAT_HUMAN,
1399 } OutputFormat;
1401 static int img_info(int argc, char **argv)
1403 int c;
1404 OutputFormat output_format = OFORMAT_HUMAN;
1405 bool chain = false;
1406 const char *filename, *fmt, *output;
1407 ImageInfoList *list;
1409 fmt = NULL;
1410 output = NULL;
1411 for(;;) {
1412 int option_index = 0;
1413 static const struct option long_options[] = {
1414 {"help", no_argument, 0, 'h'},
1415 {"format", required_argument, 0, 'f'},
1416 {"output", required_argument, 0, OPTION_OUTPUT},
1417 {"backing-chain", no_argument, 0, OPTION_BACKING_CHAIN},
1418 {0, 0, 0, 0}
1420 c = getopt_long(argc, argv, "f:h",
1421 long_options, &option_index);
1422 if (c == -1) {
1423 break;
1425 switch(c) {
1426 case '?':
1427 case 'h':
1428 help();
1429 break;
1430 case 'f':
1431 fmt = optarg;
1432 break;
1433 case OPTION_OUTPUT:
1434 output = optarg;
1435 break;
1436 case OPTION_BACKING_CHAIN:
1437 chain = true;
1438 break;
1441 if (optind >= argc) {
1442 help();
1444 filename = argv[optind++];
1446 if (output && !strcmp(output, "json")) {
1447 output_format = OFORMAT_JSON;
1448 } else if (output && !strcmp(output, "human")) {
1449 output_format = OFORMAT_HUMAN;
1450 } else if (output) {
1451 error_report("--output must be used with human or json as argument.");
1452 return 1;
1455 list = collect_image_info_list(filename, fmt, chain);
1456 if (!list) {
1457 return 1;
1460 switch (output_format) {
1461 case OFORMAT_HUMAN:
1462 dump_human_image_info_list(list);
1463 break;
1464 case OFORMAT_JSON:
1465 if (chain) {
1466 dump_json_image_info_list(list);
1467 } else {
1468 dump_json_image_info(list->value);
1470 break;
1473 qapi_free_ImageInfoList(list);
1474 return 0;
1477 #define SNAPSHOT_LIST 1
1478 #define SNAPSHOT_CREATE 2
1479 #define SNAPSHOT_APPLY 3
1480 #define SNAPSHOT_DELETE 4
1482 static int img_snapshot(int argc, char **argv)
1484 BlockDriverState *bs;
1485 QEMUSnapshotInfo sn;
1486 char *filename, *snapshot_name = NULL;
1487 int c, ret = 0, bdrv_oflags;
1488 int action = 0;
1489 qemu_timeval tv;
1491 bdrv_oflags = BDRV_O_FLAGS | BDRV_O_RDWR;
1492 /* Parse commandline parameters */
1493 for(;;) {
1494 c = getopt(argc, argv, "la:c:d:h");
1495 if (c == -1) {
1496 break;
1498 switch(c) {
1499 case '?':
1500 case 'h':
1501 help();
1502 return 0;
1503 case 'l':
1504 if (action) {
1505 help();
1506 return 0;
1508 action = SNAPSHOT_LIST;
1509 bdrv_oflags &= ~BDRV_O_RDWR; /* no need for RW */
1510 break;
1511 case 'a':
1512 if (action) {
1513 help();
1514 return 0;
1516 action = SNAPSHOT_APPLY;
1517 snapshot_name = optarg;
1518 break;
1519 case 'c':
1520 if (action) {
1521 help();
1522 return 0;
1524 action = SNAPSHOT_CREATE;
1525 snapshot_name = optarg;
1526 break;
1527 case 'd':
1528 if (action) {
1529 help();
1530 return 0;
1532 action = SNAPSHOT_DELETE;
1533 snapshot_name = optarg;
1534 break;
1538 if (optind >= argc) {
1539 help();
1541 filename = argv[optind++];
1543 /* Open the image */
1544 bs = bdrv_new_open(filename, NULL, bdrv_oflags, true);
1545 if (!bs) {
1546 return 1;
1549 /* Perform the requested action */
1550 switch(action) {
1551 case SNAPSHOT_LIST:
1552 dump_snapshots(bs);
1553 break;
1555 case SNAPSHOT_CREATE:
1556 memset(&sn, 0, sizeof(sn));
1557 pstrcpy(sn.name, sizeof(sn.name), snapshot_name);
1559 qemu_gettimeofday(&tv);
1560 sn.date_sec = tv.tv_sec;
1561 sn.date_nsec = tv.tv_usec * 1000;
1563 ret = bdrv_snapshot_create(bs, &sn);
1564 if (ret) {
1565 error_report("Could not create snapshot '%s': %d (%s)",
1566 snapshot_name, ret, strerror(-ret));
1568 break;
1570 case SNAPSHOT_APPLY:
1571 ret = bdrv_snapshot_goto(bs, snapshot_name);
1572 if (ret) {
1573 error_report("Could not apply snapshot '%s': %d (%s)",
1574 snapshot_name, ret, strerror(-ret));
1576 break;
1578 case SNAPSHOT_DELETE:
1579 ret = bdrv_snapshot_delete(bs, snapshot_name);
1580 if (ret) {
1581 error_report("Could not delete snapshot '%s': %d (%s)",
1582 snapshot_name, ret, strerror(-ret));
1584 break;
1587 /* Cleanup */
1588 bdrv_delete(bs);
1589 if (ret) {
1590 return 1;
1592 return 0;
1595 static int img_rebase(int argc, char **argv)
1597 BlockDriverState *bs, *bs_old_backing = NULL, *bs_new_backing = NULL;
1598 BlockDriver *old_backing_drv, *new_backing_drv;
1599 char *filename;
1600 const char *fmt, *cache, *out_basefmt, *out_baseimg;
1601 int c, flags, ret;
1602 int unsafe = 0;
1603 int progress = 0;
1605 /* Parse commandline parameters */
1606 fmt = NULL;
1607 cache = BDRV_DEFAULT_CACHE;
1608 out_baseimg = NULL;
1609 out_basefmt = NULL;
1610 for(;;) {
1611 c = getopt(argc, argv, "uhf:F:b:pt:");
1612 if (c == -1) {
1613 break;
1615 switch(c) {
1616 case '?':
1617 case 'h':
1618 help();
1619 return 0;
1620 case 'f':
1621 fmt = optarg;
1622 break;
1623 case 'F':
1624 out_basefmt = optarg;
1625 break;
1626 case 'b':
1627 out_baseimg = optarg;
1628 break;
1629 case 'u':
1630 unsafe = 1;
1631 break;
1632 case 'p':
1633 progress = 1;
1634 break;
1635 case 't':
1636 cache = optarg;
1637 break;
1641 if ((optind >= argc) || (!unsafe && !out_baseimg)) {
1642 help();
1644 filename = argv[optind++];
1646 qemu_progress_init(progress, 2.0);
1647 qemu_progress_print(0, 100);
1649 flags = BDRV_O_RDWR | (unsafe ? BDRV_O_NO_BACKING : 0);
1650 ret = bdrv_parse_cache_flags(cache, &flags);
1651 if (ret < 0) {
1652 error_report("Invalid cache option: %s", cache);
1653 return -1;
1657 * Open the images.
1659 * Ignore the old backing file for unsafe rebase in case we want to correct
1660 * the reference to a renamed or moved backing file.
1662 bs = bdrv_new_open(filename, fmt, flags, true);
1663 if (!bs) {
1664 return 1;
1667 /* Find the right drivers for the backing files */
1668 old_backing_drv = NULL;
1669 new_backing_drv = NULL;
1671 if (!unsafe && bs->backing_format[0] != '\0') {
1672 old_backing_drv = bdrv_find_format(bs->backing_format);
1673 if (old_backing_drv == NULL) {
1674 error_report("Invalid format name: '%s'", bs->backing_format);
1675 ret = -1;
1676 goto out;
1680 if (out_basefmt != NULL) {
1681 new_backing_drv = bdrv_find_format(out_basefmt);
1682 if (new_backing_drv == NULL) {
1683 error_report("Invalid format name: '%s'", out_basefmt);
1684 ret = -1;
1685 goto out;
1689 /* For safe rebasing we need to compare old and new backing file */
1690 if (unsafe) {
1691 /* Make the compiler happy */
1692 bs_old_backing = NULL;
1693 bs_new_backing = NULL;
1694 } else {
1695 char backing_name[1024];
1697 bs_old_backing = bdrv_new("old_backing");
1698 bdrv_get_backing_filename(bs, backing_name, sizeof(backing_name));
1699 ret = bdrv_open(bs_old_backing, backing_name, BDRV_O_FLAGS,
1700 old_backing_drv);
1701 if (ret) {
1702 error_report("Could not open old backing file '%s'", backing_name);
1703 goto out;
1705 if (out_baseimg[0]) {
1706 bs_new_backing = bdrv_new("new_backing");
1707 ret = bdrv_open(bs_new_backing, out_baseimg, BDRV_O_FLAGS,
1708 new_backing_drv);
1709 if (ret) {
1710 error_report("Could not open new backing file '%s'",
1711 out_baseimg);
1712 goto out;
1718 * Check each unallocated cluster in the COW file. If it is unallocated,
1719 * accesses go to the backing file. We must therefore compare this cluster
1720 * in the old and new backing file, and if they differ we need to copy it
1721 * from the old backing file into the COW file.
1723 * If qemu-img crashes during this step, no harm is done. The content of
1724 * the image is the same as the original one at any time.
1726 if (!unsafe) {
1727 uint64_t num_sectors;
1728 uint64_t old_backing_num_sectors;
1729 uint64_t new_backing_num_sectors = 0;
1730 uint64_t sector;
1731 int n;
1732 uint8_t * buf_old;
1733 uint8_t * buf_new;
1734 float local_progress = 0;
1736 buf_old = qemu_blockalign(bs, IO_BUF_SIZE);
1737 buf_new = qemu_blockalign(bs, IO_BUF_SIZE);
1739 bdrv_get_geometry(bs, &num_sectors);
1740 bdrv_get_geometry(bs_old_backing, &old_backing_num_sectors);
1741 if (bs_new_backing) {
1742 bdrv_get_geometry(bs_new_backing, &new_backing_num_sectors);
1745 if (num_sectors != 0) {
1746 local_progress = (float)100 /
1747 (num_sectors / MIN(num_sectors, IO_BUF_SIZE / 512));
1750 for (sector = 0; sector < num_sectors; sector += n) {
1752 /* How many sectors can we handle with the next read? */
1753 if (sector + (IO_BUF_SIZE / 512) <= num_sectors) {
1754 n = (IO_BUF_SIZE / 512);
1755 } else {
1756 n = num_sectors - sector;
1759 /* If the cluster is allocated, we don't need to take action */
1760 ret = bdrv_is_allocated(bs, sector, n, &n);
1761 if (ret) {
1762 continue;
1766 * Read old and new backing file and take into consideration that
1767 * backing files may be smaller than the COW image.
1769 if (sector >= old_backing_num_sectors) {
1770 memset(buf_old, 0, n * BDRV_SECTOR_SIZE);
1771 } else {
1772 if (sector + n > old_backing_num_sectors) {
1773 n = old_backing_num_sectors - sector;
1776 ret = bdrv_read(bs_old_backing, sector, buf_old, n);
1777 if (ret < 0) {
1778 error_report("error while reading from old backing file");
1779 goto out;
1783 if (sector >= new_backing_num_sectors || !bs_new_backing) {
1784 memset(buf_new, 0, n * BDRV_SECTOR_SIZE);
1785 } else {
1786 if (sector + n > new_backing_num_sectors) {
1787 n = new_backing_num_sectors - sector;
1790 ret = bdrv_read(bs_new_backing, sector, buf_new, n);
1791 if (ret < 0) {
1792 error_report("error while reading from new backing file");
1793 goto out;
1797 /* If they differ, we need to write to the COW file */
1798 uint64_t written = 0;
1800 while (written < n) {
1801 int pnum;
1803 if (compare_sectors(buf_old + written * 512,
1804 buf_new + written * 512, n - written, &pnum))
1806 ret = bdrv_write(bs, sector + written,
1807 buf_old + written * 512, pnum);
1808 if (ret < 0) {
1809 error_report("Error while writing to COW image: %s",
1810 strerror(-ret));
1811 goto out;
1815 written += pnum;
1817 qemu_progress_print(local_progress, 100);
1820 qemu_vfree(buf_old);
1821 qemu_vfree(buf_new);
1825 * Change the backing file. All clusters that are different from the old
1826 * backing file are overwritten in the COW file now, so the visible content
1827 * doesn't change when we switch the backing file.
1829 if (out_baseimg && *out_baseimg) {
1830 ret = bdrv_change_backing_file(bs, out_baseimg, out_basefmt);
1831 } else {
1832 ret = bdrv_change_backing_file(bs, NULL, NULL);
1835 if (ret == -ENOSPC) {
1836 error_report("Could not change the backing file to '%s': No "
1837 "space left in the file header", out_baseimg);
1838 } else if (ret < 0) {
1839 error_report("Could not change the backing file to '%s': %s",
1840 out_baseimg, strerror(-ret));
1843 qemu_progress_print(100, 0);
1845 * TODO At this point it is possible to check if any clusters that are
1846 * allocated in the COW file are the same in the backing file. If so, they
1847 * could be dropped from the COW file. Don't do this before switching the
1848 * backing file, in case of a crash this would lead to corruption.
1850 out:
1851 qemu_progress_end();
1852 /* Cleanup */
1853 if (!unsafe) {
1854 if (bs_old_backing != NULL) {
1855 bdrv_delete(bs_old_backing);
1857 if (bs_new_backing != NULL) {
1858 bdrv_delete(bs_new_backing);
1862 bdrv_delete(bs);
1863 if (ret) {
1864 return 1;
1866 return 0;
1869 static int img_resize(int argc, char **argv)
1871 int c, ret, relative;
1872 const char *filename, *fmt, *size;
1873 int64_t n, total_size;
1874 BlockDriverState *bs = NULL;
1875 QemuOpts *param;
1876 static QemuOptsList resize_options = {
1877 .name = "resize_options",
1878 .head = QTAILQ_HEAD_INITIALIZER(resize_options.head),
1879 .desc = {
1881 .name = BLOCK_OPT_SIZE,
1882 .type = QEMU_OPT_SIZE,
1883 .help = "Virtual disk size"
1884 }, {
1885 /* end of list */
1890 /* Remove size from argv manually so that negative numbers are not treated
1891 * as options by getopt. */
1892 if (argc < 3) {
1893 help();
1894 return 1;
1897 size = argv[--argc];
1899 /* Parse getopt arguments */
1900 fmt = NULL;
1901 for(;;) {
1902 c = getopt(argc, argv, "f:h");
1903 if (c == -1) {
1904 break;
1906 switch(c) {
1907 case '?':
1908 case 'h':
1909 help();
1910 break;
1911 case 'f':
1912 fmt = optarg;
1913 break;
1916 if (optind >= argc) {
1917 help();
1919 filename = argv[optind++];
1921 /* Choose grow, shrink, or absolute resize mode */
1922 switch (size[0]) {
1923 case '+':
1924 relative = 1;
1925 size++;
1926 break;
1927 case '-':
1928 relative = -1;
1929 size++;
1930 break;
1931 default:
1932 relative = 0;
1933 break;
1936 /* Parse size */
1937 param = qemu_opts_create_nofail(&resize_options);
1938 if (qemu_opt_set(param, BLOCK_OPT_SIZE, size)) {
1939 /* Error message already printed when size parsing fails */
1940 ret = -1;
1941 qemu_opts_del(param);
1942 goto out;
1944 n = qemu_opt_get_size(param, BLOCK_OPT_SIZE, 0);
1945 qemu_opts_del(param);
1947 bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_RDWR, true);
1948 if (!bs) {
1949 ret = -1;
1950 goto out;
1953 if (relative) {
1954 total_size = bdrv_getlength(bs) + n * relative;
1955 } else {
1956 total_size = n;
1958 if (total_size <= 0) {
1959 error_report("New image size must be positive");
1960 ret = -1;
1961 goto out;
1964 ret = bdrv_truncate(bs, total_size);
1965 switch (ret) {
1966 case 0:
1967 printf("Image resized.\n");
1968 break;
1969 case -ENOTSUP:
1970 error_report("This image does not support resize");
1971 break;
1972 case -EACCES:
1973 error_report("Image is read-only");
1974 break;
1975 default:
1976 error_report("Error resizing image (%d)", -ret);
1977 break;
1979 out:
1980 if (bs) {
1981 bdrv_delete(bs);
1983 if (ret) {
1984 return 1;
1986 return 0;
1989 static const img_cmd_t img_cmds[] = {
1990 #define DEF(option, callback, arg_string) \
1991 { option, callback },
1992 #include "qemu-img-cmds.h"
1993 #undef DEF
1994 #undef GEN_DOCS
1995 { NULL, NULL, },
1998 int main(int argc, char **argv)
2000 const img_cmd_t *cmd;
2001 const char *cmdname;
2003 error_set_progname(argv[0]);
2005 qemu_init_main_loop();
2006 bdrv_init();
2007 if (argc < 2)
2008 help();
2009 cmdname = argv[1];
2010 argc--; argv++;
2012 /* find the command */
2013 for(cmd = img_cmds; cmd->name != NULL; cmd++) {
2014 if (!strcmp(cmdname, cmd->name)) {
2015 return cmd->handler(argc, argv);
2019 /* not found */
2020 help();
2021 return 0;