]> git.proxmox.com Git - qemu.git/blob - qemu-img.c
qemu-img: Add json output option to the info command.
[qemu.git] / qemu-img.c
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 #include "qapi-visit.h"
25 #include "qapi/qmp-output-visitor.h"
26 #include "qjson.h"
27 #include "qemu-common.h"
28 #include "qemu-option.h"
29 #include "qemu-error.h"
30 #include "osdep.h"
31 #include "sysemu.h"
32 #include "block_int.h"
33 #include <getopt.h>
34 #include <stdio.h>
35
36 #ifdef _WIN32
37 #include <windows.h>
38 #endif
39
40 typedef struct img_cmd_t {
41 const char *name;
42 int (*handler)(int argc, char **argv);
43 } img_cmd_t;
44
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"
48
49 static void format_print(void *opaque, const char *name)
50 {
51 printf(" %s", name);
52 }
53
54 /* Please keep in synch with qemu-img.texi */
55 static void help(void)
56 {
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 occured.\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";
105
106 printf("%s\nSupported formats:", help_msg);
107 bdrv_iterate_format(format_print, NULL);
108 printf("\n");
109 exit(1);
110 }
111
112 #if defined(WIN32)
113 /* XXX: put correct support for win32 */
114 static int read_password(char *buf, int buf_size)
115 {
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;
126 }
127 buf[i] = '\0';
128 return 0;
129 }
130
131 #else
132
133 #include <termios.h>
134
135 static struct termios oldtty;
136
137 static void term_exit(void)
138 {
139 tcsetattr (0, TCSANOW, &oldtty);
140 }
141
142 static void term_init(void)
143 {
144 struct termios tty;
145
146 tcgetattr (0, &tty);
147 oldtty = tty;
148
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;
157
158 tcsetattr (0, TCSANOW, &tty);
159
160 atexit(term_exit);
161 }
162
163 static int read_password(char *buf, int buf_size)
164 {
165 uint8_t ch;
166 int i, ret;
167
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;
180 }
181 } else if (ret == 0) {
182 ret = -1;
183 break;
184 } else {
185 if (ch == '\r') {
186 ret = 0;
187 break;
188 }
189 if (i < (buf_size - 1))
190 buf[i++] = ch;
191 }
192 }
193 term_exit();
194 buf[i] = '\0';
195 printf("\n");
196 return ret;
197 }
198 #endif
199
200 static int print_block_option_help(const char *filename, const char *fmt)
201 {
202 BlockDriver *drv, *proto_drv;
203 QEMUOptionParameter *create_options = NULL;
204
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;
210 }
211
212 proto_drv = bdrv_find_protocol(filename);
213 if (!proto_drv) {
214 error_report("Unknown protocol '%s'", filename);
215 return 1;
216 }
217
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;
225 }
226
227 static BlockDriverState *bdrv_new_open(const char *filename,
228 const char *fmt,
229 int flags)
230 {
231 BlockDriverState *bs;
232 BlockDriver *drv;
233 char password[256];
234 int ret;
235
236 bs = bdrv_new("image");
237
238 if (fmt) {
239 drv = bdrv_find_format(fmt);
240 if (!drv) {
241 error_report("Unknown file format '%s'", fmt);
242 goto fail;
243 }
244 } else {
245 drv = NULL;
246 }
247
248 ret = bdrv_open(bs, filename, flags, drv);
249 if (ret < 0) {
250 error_report("Could not open '%s': %s", filename, strerror(-ret));
251 goto fail;
252 }
253
254 if (bdrv_is_encrypted(bs)) {
255 printf("Disk image '%s' is encrypted.\n", filename);
256 if (read_password(password, sizeof(password)) < 0) {
257 error_report("No password given");
258 goto fail;
259 }
260 if (bdrv_set_key(bs, password) < 0) {
261 error_report("invalid password");
262 goto fail;
263 }
264 }
265 return bs;
266 fail:
267 if (bs) {
268 bdrv_delete(bs);
269 }
270 return NULL;
271 }
272
273 static int add_old_style_options(const char *fmt, QEMUOptionParameter *list,
274 const char *base_filename,
275 const char *base_fmt)
276 {
277 if (base_filename) {
278 if (set_option_parameter(list, BLOCK_OPT_BACKING_FILE, base_filename)) {
279 error_report("Backing file not supported for file format '%s'",
280 fmt);
281 return -1;
282 }
283 }
284 if (base_fmt) {
285 if (set_option_parameter(list, BLOCK_OPT_BACKING_FMT, base_fmt)) {
286 error_report("Backing file format not supported for file "
287 "format '%s'", fmt);
288 return -1;
289 }
290 }
291 return 0;
292 }
293
294 static int img_create(int argc, char **argv)
295 {
296 int c, ret = 0;
297 uint64_t img_size = -1;
298 const char *fmt = "raw";
299 const char *base_fmt = NULL;
300 const char *filename;
301 const char *base_filename = NULL;
302 char *options = NULL;
303
304 for(;;) {
305 c = getopt(argc, argv, "F:b:f:he6o:");
306 if (c == -1) {
307 break;
308 }
309 switch(c) {
310 case '?':
311 case 'h':
312 help();
313 break;
314 case 'F':
315 base_fmt = optarg;
316 break;
317 case 'b':
318 base_filename = optarg;
319 break;
320 case 'f':
321 fmt = optarg;
322 break;
323 case 'e':
324 error_report("option -e is deprecated, please use \'-o "
325 "encryption\' instead!");
326 return 1;
327 case '6':
328 error_report("option -6 is deprecated, please use \'-o "
329 "compat6\' instead!");
330 return 1;
331 case 'o':
332 options = optarg;
333 break;
334 }
335 }
336
337 /* Get the filename */
338 if (optind >= argc) {
339 help();
340 }
341 filename = argv[optind++];
342
343 /* Get image size, if specified */
344 if (optind < argc) {
345 int64_t sval;
346 char *end;
347 sval = strtosz_suffix(argv[optind++], &end, STRTOSZ_DEFSUFFIX_B);
348 if (sval < 0 || *end) {
349 error_report("Invalid image size specified! You may use k, M, G or "
350 "T suffixes for ");
351 error_report("kilobytes, megabytes, gigabytes and terabytes.");
352 ret = -1;
353 goto out;
354 }
355 img_size = (uint64_t)sval;
356 }
357
358 if (options && is_help_option(options)) {
359 ret = print_block_option_help(filename, fmt);
360 goto out;
361 }
362
363 ret = bdrv_img_create(filename, fmt, base_filename, base_fmt,
364 options, img_size, BDRV_O_FLAGS);
365 out:
366 if (ret) {
367 return 1;
368 }
369 return 0;
370 }
371
372 /*
373 * Checks an image for consistency. Exit codes:
374 *
375 * 0 - Check completed, image is good
376 * 1 - Check not completed because of internal errors
377 * 2 - Check completed, image is corrupted
378 * 3 - Check completed, image has leaked clusters, but is good otherwise
379 */
380 static int img_check(int argc, char **argv)
381 {
382 int c, ret;
383 const char *filename, *fmt;
384 BlockDriverState *bs;
385 BdrvCheckResult result;
386 int fix = 0;
387 int flags = BDRV_O_FLAGS | BDRV_O_CHECK;
388
389 fmt = NULL;
390 for(;;) {
391 c = getopt(argc, argv, "f:hr:");
392 if (c == -1) {
393 break;
394 }
395 switch(c) {
396 case '?':
397 case 'h':
398 help();
399 break;
400 case 'f':
401 fmt = optarg;
402 break;
403 case 'r':
404 flags |= BDRV_O_RDWR;
405
406 if (!strcmp(optarg, "leaks")) {
407 fix = BDRV_FIX_LEAKS;
408 } else if (!strcmp(optarg, "all")) {
409 fix = BDRV_FIX_LEAKS | BDRV_FIX_ERRORS;
410 } else {
411 help();
412 }
413 break;
414 }
415 }
416 if (optind >= argc) {
417 help();
418 }
419 filename = argv[optind++];
420
421 bs = bdrv_new_open(filename, fmt, flags);
422 if (!bs) {
423 return 1;
424 }
425 ret = bdrv_check(bs, &result, fix);
426
427 if (ret == -ENOTSUP) {
428 error_report("This image format does not support checks");
429 bdrv_delete(bs);
430 return 1;
431 }
432
433 if (result.corruptions_fixed || result.leaks_fixed) {
434 printf("The following inconsistencies were found and repaired:\n\n"
435 " %d leaked clusters\n"
436 " %d corruptions\n\n"
437 "Double checking the fixed image now...\n",
438 result.leaks_fixed,
439 result.corruptions_fixed);
440 ret = bdrv_check(bs, &result, 0);
441 }
442
443 if (!(result.corruptions || result.leaks || result.check_errors)) {
444 printf("No errors were found on the image.\n");
445 } else {
446 if (result.corruptions) {
447 printf("\n%d errors were found on the image.\n"
448 "Data may be corrupted, or further writes to the image "
449 "may corrupt it.\n",
450 result.corruptions);
451 }
452
453 if (result.leaks) {
454 printf("\n%d leaked clusters were found on the image.\n"
455 "This means waste of disk space, but no harm to data.\n",
456 result.leaks);
457 }
458
459 if (result.check_errors) {
460 printf("\n%d internal errors have occurred during the check.\n",
461 result.check_errors);
462 }
463 }
464
465 if (result.bfi.total_clusters != 0 && result.bfi.allocated_clusters != 0) {
466 printf("%" PRId64 "/%" PRId64 "= %0.2f%% allocated, %0.2f%% fragmented\n",
467 result.bfi.allocated_clusters, result.bfi.total_clusters,
468 result.bfi.allocated_clusters * 100.0 / result.bfi.total_clusters,
469 result.bfi.fragmented_clusters * 100.0 / result.bfi.allocated_clusters);
470 }
471
472 bdrv_delete(bs);
473
474 if (ret < 0 || result.check_errors) {
475 printf("\nAn error has occurred during the check: %s\n"
476 "The check is not complete and may have missed error.\n",
477 strerror(-ret));
478 return 1;
479 }
480
481 if (result.corruptions) {
482 return 2;
483 } else if (result.leaks) {
484 return 3;
485 } else {
486 return 0;
487 }
488 }
489
490 static int img_commit(int argc, char **argv)
491 {
492 int c, ret, flags;
493 const char *filename, *fmt, *cache;
494 BlockDriverState *bs;
495
496 fmt = NULL;
497 cache = BDRV_DEFAULT_CACHE;
498 for(;;) {
499 c = getopt(argc, argv, "f:ht:");
500 if (c == -1) {
501 break;
502 }
503 switch(c) {
504 case '?':
505 case 'h':
506 help();
507 break;
508 case 'f':
509 fmt = optarg;
510 break;
511 case 't':
512 cache = optarg;
513 break;
514 }
515 }
516 if (optind >= argc) {
517 help();
518 }
519 filename = argv[optind++];
520
521 flags = BDRV_O_RDWR;
522 ret = bdrv_parse_cache_flags(cache, &flags);
523 if (ret < 0) {
524 error_report("Invalid cache option: %s", cache);
525 return -1;
526 }
527
528 bs = bdrv_new_open(filename, fmt, flags);
529 if (!bs) {
530 return 1;
531 }
532 ret = bdrv_commit(bs);
533 switch(ret) {
534 case 0:
535 printf("Image committed.\n");
536 break;
537 case -ENOENT:
538 error_report("No disk inserted");
539 break;
540 case -EACCES:
541 error_report("Image is read-only");
542 break;
543 case -ENOTSUP:
544 error_report("Image is already committed");
545 break;
546 default:
547 error_report("Error while committing image");
548 break;
549 }
550
551 bdrv_delete(bs);
552 if (ret) {
553 return 1;
554 }
555 return 0;
556 }
557
558 /*
559 * Returns true iff the first sector pointed to by 'buf' contains at least
560 * a non-NUL byte.
561 *
562 * 'pnum' is set to the number of sectors (including and immediately following
563 * the first one) that are known to be in the same allocated/unallocated state.
564 */
565 static int is_allocated_sectors(const uint8_t *buf, int n, int *pnum)
566 {
567 bool is_zero;
568 int i;
569
570 if (n <= 0) {
571 *pnum = 0;
572 return 0;
573 }
574 is_zero = buffer_is_zero(buf, 512);
575 for(i = 1; i < n; i++) {
576 buf += 512;
577 if (is_zero != buffer_is_zero(buf, 512)) {
578 break;
579 }
580 }
581 *pnum = i;
582 return !is_zero;
583 }
584
585 /*
586 * Like is_allocated_sectors, but if the buffer starts with a used sector,
587 * up to 'min' consecutive sectors containing zeros are ignored. This avoids
588 * breaking up write requests for only small sparse areas.
589 */
590 static int is_allocated_sectors_min(const uint8_t *buf, int n, int *pnum,
591 int min)
592 {
593 int ret;
594 int num_checked, num_used;
595
596 if (n < min) {
597 min = n;
598 }
599
600 ret = is_allocated_sectors(buf, n, pnum);
601 if (!ret) {
602 return ret;
603 }
604
605 num_used = *pnum;
606 buf += BDRV_SECTOR_SIZE * *pnum;
607 n -= *pnum;
608 num_checked = num_used;
609
610 while (n > 0) {
611 ret = is_allocated_sectors(buf, n, pnum);
612
613 buf += BDRV_SECTOR_SIZE * *pnum;
614 n -= *pnum;
615 num_checked += *pnum;
616 if (ret) {
617 num_used = num_checked;
618 } else if (*pnum >= min) {
619 break;
620 }
621 }
622
623 *pnum = num_used;
624 return 1;
625 }
626
627 /*
628 * Compares two buffers sector by sector. Returns 0 if the first sector of both
629 * buffers matches, non-zero otherwise.
630 *
631 * pnum is set to the number of sectors (including and immediately following
632 * the first one) that are known to have the same comparison result
633 */
634 static int compare_sectors(const uint8_t *buf1, const uint8_t *buf2, int n,
635 int *pnum)
636 {
637 int res, i;
638
639 if (n <= 0) {
640 *pnum = 0;
641 return 0;
642 }
643
644 res = !!memcmp(buf1, buf2, 512);
645 for(i = 1; i < n; i++) {
646 buf1 += 512;
647 buf2 += 512;
648
649 if (!!memcmp(buf1, buf2, 512) != res) {
650 break;
651 }
652 }
653
654 *pnum = i;
655 return res;
656 }
657
658 #define IO_BUF_SIZE (2 * 1024 * 1024)
659
660 static int img_convert(int argc, char **argv)
661 {
662 int c, ret = 0, n, n1, bs_n, bs_i, compress, cluster_size, cluster_sectors;
663 int progress = 0, flags;
664 const char *fmt, *out_fmt, *cache, *out_baseimg, *out_filename;
665 BlockDriver *drv, *proto_drv;
666 BlockDriverState **bs = NULL, *out_bs = NULL;
667 int64_t total_sectors, nb_sectors, sector_num, bs_offset;
668 uint64_t bs_sectors;
669 uint8_t * buf = NULL;
670 const uint8_t *buf1;
671 BlockDriverInfo bdi;
672 QEMUOptionParameter *param = NULL, *create_options = NULL;
673 QEMUOptionParameter *out_baseimg_param;
674 char *options = NULL;
675 const char *snapshot_name = NULL;
676 float local_progress;
677 int min_sparse = 8; /* Need at least 4k of zeros for sparse detection */
678
679 fmt = NULL;
680 out_fmt = "raw";
681 cache = "unsafe";
682 out_baseimg = NULL;
683 compress = 0;
684 for(;;) {
685 c = getopt(argc, argv, "f:O:B:s:hce6o:pS:t:");
686 if (c == -1) {
687 break;
688 }
689 switch(c) {
690 case '?':
691 case 'h':
692 help();
693 break;
694 case 'f':
695 fmt = optarg;
696 break;
697 case 'O':
698 out_fmt = optarg;
699 break;
700 case 'B':
701 out_baseimg = optarg;
702 break;
703 case 'c':
704 compress = 1;
705 break;
706 case 'e':
707 error_report("option -e is deprecated, please use \'-o "
708 "encryption\' instead!");
709 return 1;
710 case '6':
711 error_report("option -6 is deprecated, please use \'-o "
712 "compat6\' instead!");
713 return 1;
714 case 'o':
715 options = optarg;
716 break;
717 case 's':
718 snapshot_name = optarg;
719 break;
720 case 'S':
721 {
722 int64_t sval;
723 char *end;
724 sval = strtosz_suffix(optarg, &end, STRTOSZ_DEFSUFFIX_B);
725 if (sval < 0 || *end) {
726 error_report("Invalid minimum zero buffer size for sparse output specified");
727 return 1;
728 }
729
730 min_sparse = sval / BDRV_SECTOR_SIZE;
731 break;
732 }
733 case 'p':
734 progress = 1;
735 break;
736 case 't':
737 cache = optarg;
738 break;
739 }
740 }
741
742 bs_n = argc - optind - 1;
743 if (bs_n < 1) {
744 help();
745 }
746
747 out_filename = argv[argc - 1];
748
749 /* Initialize before goto out */
750 qemu_progress_init(progress, 2.0);
751
752 if (options && is_help_option(options)) {
753 ret = print_block_option_help(out_filename, out_fmt);
754 goto out;
755 }
756
757 if (bs_n > 1 && out_baseimg) {
758 error_report("-B makes no sense when concatenating multiple input "
759 "images");
760 ret = -1;
761 goto out;
762 }
763
764 qemu_progress_print(0, 100);
765
766 bs = g_malloc0(bs_n * sizeof(BlockDriverState *));
767
768 total_sectors = 0;
769 for (bs_i = 0; bs_i < bs_n; bs_i++) {
770 bs[bs_i] = bdrv_new_open(argv[optind + bs_i], fmt, BDRV_O_FLAGS);
771 if (!bs[bs_i]) {
772 error_report("Could not open '%s'", argv[optind + bs_i]);
773 ret = -1;
774 goto out;
775 }
776 bdrv_get_geometry(bs[bs_i], &bs_sectors);
777 total_sectors += bs_sectors;
778 }
779
780 if (snapshot_name != NULL) {
781 if (bs_n > 1) {
782 error_report("No support for concatenating multiple snapshot");
783 ret = -1;
784 goto out;
785 }
786 if (bdrv_snapshot_load_tmp(bs[0], snapshot_name) < 0) {
787 error_report("Failed to load snapshot");
788 ret = -1;
789 goto out;
790 }
791 }
792
793 /* Find driver and parse its options */
794 drv = bdrv_find_format(out_fmt);
795 if (!drv) {
796 error_report("Unknown file format '%s'", out_fmt);
797 ret = -1;
798 goto out;
799 }
800
801 proto_drv = bdrv_find_protocol(out_filename);
802 if (!proto_drv) {
803 error_report("Unknown protocol '%s'", out_filename);
804 ret = -1;
805 goto out;
806 }
807
808 create_options = append_option_parameters(create_options,
809 drv->create_options);
810 create_options = append_option_parameters(create_options,
811 proto_drv->create_options);
812
813 if (options) {
814 param = parse_option_parameters(options, create_options, param);
815 if (param == NULL) {
816 error_report("Invalid options for file format '%s'.", out_fmt);
817 ret = -1;
818 goto out;
819 }
820 } else {
821 param = parse_option_parameters("", create_options, param);
822 }
823
824 set_option_parameter_int(param, BLOCK_OPT_SIZE, total_sectors * 512);
825 ret = add_old_style_options(out_fmt, param, out_baseimg, NULL);
826 if (ret < 0) {
827 goto out;
828 }
829
830 /* Get backing file name if -o backing_file was used */
831 out_baseimg_param = get_option_parameter(param, BLOCK_OPT_BACKING_FILE);
832 if (out_baseimg_param) {
833 out_baseimg = out_baseimg_param->value.s;
834 }
835
836 /* Check if compression is supported */
837 if (compress) {
838 QEMUOptionParameter *encryption =
839 get_option_parameter(param, BLOCK_OPT_ENCRYPT);
840 QEMUOptionParameter *preallocation =
841 get_option_parameter(param, BLOCK_OPT_PREALLOC);
842
843 if (!drv->bdrv_write_compressed) {
844 error_report("Compression not supported for this file format");
845 ret = -1;
846 goto out;
847 }
848
849 if (encryption && encryption->value.n) {
850 error_report("Compression and encryption not supported at "
851 "the same time");
852 ret = -1;
853 goto out;
854 }
855
856 if (preallocation && preallocation->value.s
857 && strcmp(preallocation->value.s, "off"))
858 {
859 error_report("Compression and preallocation not supported at "
860 "the same time");
861 ret = -1;
862 goto out;
863 }
864 }
865
866 /* Create the new image */
867 ret = bdrv_create(drv, out_filename, param);
868 if (ret < 0) {
869 if (ret == -ENOTSUP) {
870 error_report("Formatting not supported for file format '%s'",
871 out_fmt);
872 } else if (ret == -EFBIG) {
873 error_report("The image size is too large for file format '%s'",
874 out_fmt);
875 } else {
876 error_report("%s: error while converting %s: %s",
877 out_filename, out_fmt, strerror(-ret));
878 }
879 goto out;
880 }
881
882 flags = BDRV_O_RDWR;
883 ret = bdrv_parse_cache_flags(cache, &flags);
884 if (ret < 0) {
885 error_report("Invalid cache option: %s", cache);
886 return -1;
887 }
888
889 out_bs = bdrv_new_open(out_filename, out_fmt, flags);
890 if (!out_bs) {
891 ret = -1;
892 goto out;
893 }
894
895 bs_i = 0;
896 bs_offset = 0;
897 bdrv_get_geometry(bs[0], &bs_sectors);
898 buf = qemu_blockalign(out_bs, IO_BUF_SIZE);
899
900 if (compress) {
901 ret = bdrv_get_info(out_bs, &bdi);
902 if (ret < 0) {
903 error_report("could not get block driver info");
904 goto out;
905 }
906 cluster_size = bdi.cluster_size;
907 if (cluster_size <= 0 || cluster_size > IO_BUF_SIZE) {
908 error_report("invalid cluster size");
909 ret = -1;
910 goto out;
911 }
912 cluster_sectors = cluster_size >> 9;
913 sector_num = 0;
914
915 nb_sectors = total_sectors;
916 local_progress = (float)100 /
917 (nb_sectors / MIN(nb_sectors, cluster_sectors));
918
919 for(;;) {
920 int64_t bs_num;
921 int remainder;
922 uint8_t *buf2;
923
924 nb_sectors = total_sectors - sector_num;
925 if (nb_sectors <= 0)
926 break;
927 if (nb_sectors >= cluster_sectors)
928 n = cluster_sectors;
929 else
930 n = nb_sectors;
931
932 bs_num = sector_num - bs_offset;
933 assert (bs_num >= 0);
934 remainder = n;
935 buf2 = buf;
936 while (remainder > 0) {
937 int nlow;
938 while (bs_num == bs_sectors) {
939 bs_i++;
940 assert (bs_i < bs_n);
941 bs_offset += bs_sectors;
942 bdrv_get_geometry(bs[bs_i], &bs_sectors);
943 bs_num = 0;
944 /* printf("changing part: sector_num=%" PRId64 ", "
945 "bs_i=%d, bs_offset=%" PRId64 ", bs_sectors=%" PRId64
946 "\n", sector_num, bs_i, bs_offset, bs_sectors); */
947 }
948 assert (bs_num < bs_sectors);
949
950 nlow = (remainder > bs_sectors - bs_num) ? bs_sectors - bs_num : remainder;
951
952 ret = bdrv_read(bs[bs_i], bs_num, buf2, nlow);
953 if (ret < 0) {
954 error_report("error while reading sector %" PRId64 ": %s",
955 bs_num, strerror(-ret));
956 goto out;
957 }
958
959 buf2 += nlow * 512;
960 bs_num += nlow;
961
962 remainder -= nlow;
963 }
964 assert (remainder == 0);
965
966 if (n < cluster_sectors) {
967 memset(buf + n * 512, 0, cluster_size - n * 512);
968 }
969 if (!buffer_is_zero(buf, cluster_size)) {
970 ret = bdrv_write_compressed(out_bs, sector_num, buf,
971 cluster_sectors);
972 if (ret != 0) {
973 error_report("error while compressing sector %" PRId64
974 ": %s", sector_num, strerror(-ret));
975 goto out;
976 }
977 }
978 sector_num += n;
979 qemu_progress_print(local_progress, 100);
980 }
981 /* signal EOF to align */
982 bdrv_write_compressed(out_bs, 0, NULL, 0);
983 } else {
984 int has_zero_init = bdrv_has_zero_init(out_bs);
985
986 sector_num = 0; // total number of sectors converted so far
987 nb_sectors = total_sectors - sector_num;
988 local_progress = (float)100 /
989 (nb_sectors / MIN(nb_sectors, IO_BUF_SIZE / 512));
990
991 for(;;) {
992 nb_sectors = total_sectors - sector_num;
993 if (nb_sectors <= 0) {
994 break;
995 }
996 if (nb_sectors >= (IO_BUF_SIZE / 512)) {
997 n = (IO_BUF_SIZE / 512);
998 } else {
999 n = nb_sectors;
1000 }
1001
1002 while (sector_num - bs_offset >= bs_sectors) {
1003 bs_i ++;
1004 assert (bs_i < bs_n);
1005 bs_offset += bs_sectors;
1006 bdrv_get_geometry(bs[bs_i], &bs_sectors);
1007 /* printf("changing part: sector_num=%" PRId64 ", bs_i=%d, "
1008 "bs_offset=%" PRId64 ", bs_sectors=%" PRId64 "\n",
1009 sector_num, bs_i, bs_offset, bs_sectors); */
1010 }
1011
1012 if (n > bs_offset + bs_sectors - sector_num) {
1013 n = bs_offset + bs_sectors - sector_num;
1014 }
1015
1016 if (has_zero_init) {
1017 /* If the output image is being created as a copy on write image,
1018 assume that sectors which are unallocated in the input image
1019 are present in both the output's and input's base images (no
1020 need to copy them). */
1021 if (out_baseimg) {
1022 if (!bdrv_is_allocated(bs[bs_i], sector_num - bs_offset,
1023 n, &n1)) {
1024 sector_num += n1;
1025 continue;
1026 }
1027 /* The next 'n1' sectors are allocated in the input image. Copy
1028 only those as they may be followed by unallocated sectors. */
1029 n = n1;
1030 }
1031 } else {
1032 n1 = n;
1033 }
1034
1035 ret = bdrv_read(bs[bs_i], sector_num - bs_offset, buf, n);
1036 if (ret < 0) {
1037 error_report("error while reading sector %" PRId64 ": %s",
1038 sector_num - bs_offset, strerror(-ret));
1039 goto out;
1040 }
1041 /* NOTE: at the same time we convert, we do not write zero
1042 sectors to have a chance to compress the image. Ideally, we
1043 should add a specific call to have the info to go faster */
1044 buf1 = buf;
1045 while (n > 0) {
1046 /* If the output image is being created as a copy on write image,
1047 copy all sectors even the ones containing only NUL bytes,
1048 because they may differ from the sectors in the base image.
1049
1050 If the output is to a host device, we also write out
1051 sectors that are entirely 0, since whatever data was
1052 already there is garbage, not 0s. */
1053 if (!has_zero_init || out_baseimg ||
1054 is_allocated_sectors_min(buf1, n, &n1, min_sparse)) {
1055 ret = bdrv_write(out_bs, sector_num, buf1, n1);
1056 if (ret < 0) {
1057 error_report("error while writing sector %" PRId64
1058 ": %s", sector_num, strerror(-ret));
1059 goto out;
1060 }
1061 }
1062 sector_num += n1;
1063 n -= n1;
1064 buf1 += n1 * 512;
1065 }
1066 qemu_progress_print(local_progress, 100);
1067 }
1068 }
1069 out:
1070 qemu_progress_end();
1071 free_option_parameters(create_options);
1072 free_option_parameters(param);
1073 qemu_vfree(buf);
1074 if (out_bs) {
1075 bdrv_delete(out_bs);
1076 }
1077 if (bs) {
1078 for (bs_i = 0; bs_i < bs_n; bs_i++) {
1079 if (bs[bs_i]) {
1080 bdrv_delete(bs[bs_i]);
1081 }
1082 }
1083 g_free(bs);
1084 }
1085 if (ret) {
1086 return 1;
1087 }
1088 return 0;
1089 }
1090
1091
1092 static void dump_snapshots(BlockDriverState *bs)
1093 {
1094 QEMUSnapshotInfo *sn_tab, *sn;
1095 int nb_sns, i;
1096 char buf[256];
1097
1098 nb_sns = bdrv_snapshot_list(bs, &sn_tab);
1099 if (nb_sns <= 0)
1100 return;
1101 printf("Snapshot list:\n");
1102 printf("%s\n", bdrv_snapshot_dump(buf, sizeof(buf), NULL));
1103 for(i = 0; i < nb_sns; i++) {
1104 sn = &sn_tab[i];
1105 printf("%s\n", bdrv_snapshot_dump(buf, sizeof(buf), sn));
1106 }
1107 g_free(sn_tab);
1108 }
1109
1110 static void collect_snapshots(BlockDriverState *bs , ImageInfo *info)
1111 {
1112 int i, sn_count;
1113 QEMUSnapshotInfo *sn_tab = NULL;
1114 SnapshotInfoList *info_list, *cur_item = NULL;
1115 sn_count = bdrv_snapshot_list(bs, &sn_tab);
1116
1117 for (i = 0; i < sn_count; i++) {
1118 info->has_snapshots = true;
1119 info_list = g_new0(SnapshotInfoList, 1);
1120
1121 info_list->value = g_new0(SnapshotInfo, 1);
1122 info_list->value->id = g_strdup(sn_tab[i].id_str);
1123 info_list->value->name = g_strdup(sn_tab[i].name);
1124 info_list->value->vm_state_size = sn_tab[i].vm_state_size;
1125 info_list->value->date_sec = sn_tab[i].date_sec;
1126 info_list->value->date_nsec = sn_tab[i].date_nsec;
1127 info_list->value->vm_clock_sec = sn_tab[i].vm_clock_nsec / 1000000000;
1128 info_list->value->vm_clock_nsec = sn_tab[i].vm_clock_nsec % 1000000000;
1129
1130 /* XXX: waiting for the qapi to support qemu-queue.h types */
1131 if (!cur_item) {
1132 info->snapshots = cur_item = info_list;
1133 } else {
1134 cur_item->next = info_list;
1135 cur_item = info_list;
1136 }
1137
1138 }
1139
1140 g_free(sn_tab);
1141 }
1142
1143 static void dump_json_image_info(ImageInfo *info)
1144 {
1145 Error *errp = NULL;
1146 QString *str;
1147 QmpOutputVisitor *ov = qmp_output_visitor_new();
1148 QObject *obj;
1149 visit_type_ImageInfo(qmp_output_get_visitor(ov),
1150 &info, NULL, &errp);
1151 obj = qmp_output_get_qobject(ov);
1152 str = qobject_to_json_pretty(obj);
1153 assert(str != NULL);
1154 printf("%s\n", qstring_get_str(str));
1155 qobject_decref(obj);
1156 qmp_output_visitor_cleanup(ov);
1157 QDECREF(str);
1158 }
1159
1160 static void collect_image_info(BlockDriverState *bs,
1161 ImageInfo *info,
1162 const char *filename,
1163 const char *fmt)
1164 {
1165 uint64_t total_sectors;
1166 char backing_filename[1024];
1167 char backing_filename2[1024];
1168 BlockDriverInfo bdi;
1169
1170 bdrv_get_geometry(bs, &total_sectors);
1171
1172 info->filename = g_strdup(filename);
1173 info->format = g_strdup(bdrv_get_format_name(bs));
1174 info->virtual_size = total_sectors * 512;
1175 info->actual_size = bdrv_get_allocated_file_size(bs);
1176 info->has_actual_size = info->actual_size >= 0;
1177 if (bdrv_is_encrypted(bs)) {
1178 info->encrypted = true;
1179 info->has_encrypted = true;
1180 }
1181 if (bdrv_get_info(bs, &bdi) >= 0) {
1182 if (bdi.cluster_size != 0) {
1183 info->cluster_size = bdi.cluster_size;
1184 info->has_cluster_size = true;
1185 }
1186 info->dirty_flag = bdi.is_dirty;
1187 info->has_dirty_flag = true;
1188 }
1189 bdrv_get_backing_filename(bs, backing_filename, sizeof(backing_filename));
1190 if (backing_filename[0] != '\0') {
1191 info->backing_filename = g_strdup(backing_filename);
1192 info->has_backing_filename = true;
1193 bdrv_get_full_backing_filename(bs, backing_filename2,
1194 sizeof(backing_filename2));
1195
1196 if (strcmp(backing_filename, backing_filename2) != 0) {
1197 info->full_backing_filename =
1198 g_strdup(backing_filename2);
1199 info->has_full_backing_filename = true;
1200 }
1201
1202 if (bs->backing_format[0]) {
1203 info->backing_filename_format = g_strdup(bs->backing_format);
1204 info->has_backing_filename_format = true;
1205 }
1206 }
1207 }
1208
1209 static void dump_human_image_info(ImageInfo *info)
1210 {
1211 char size_buf[128], dsize_buf[128];
1212 if (!info->has_actual_size) {
1213 snprintf(dsize_buf, sizeof(dsize_buf), "unavailable");
1214 } else {
1215 get_human_readable_size(dsize_buf, sizeof(dsize_buf),
1216 info->actual_size);
1217 }
1218 get_human_readable_size(size_buf, sizeof(size_buf), info->virtual_size);
1219 printf("image: %s\n"
1220 "file format: %s\n"
1221 "virtual size: %s (%" PRId64 " bytes)\n"
1222 "disk size: %s\n",
1223 info->filename, info->format, size_buf,
1224 info->virtual_size,
1225 dsize_buf);
1226
1227 if (info->has_encrypted && info->encrypted) {
1228 printf("encrypted: yes\n");
1229 }
1230
1231 if (info->has_cluster_size) {
1232 printf("cluster_size: %" PRId64 "\n", info->cluster_size);
1233 }
1234
1235 if (info->has_dirty_flag && info->dirty_flag) {
1236 printf("cleanly shut down: no\n");
1237 }
1238
1239 if (info->has_backing_filename) {
1240 printf("backing file: %s", info->backing_filename);
1241 if (info->has_full_backing_filename) {
1242 printf(" (actual path: %s)", info->full_backing_filename);
1243 }
1244 putchar('\n');
1245 if (info->has_backing_filename_format) {
1246 printf("backing file format: %s\n", info->backing_filename_format);
1247 }
1248 }
1249 }
1250
1251 enum {OPTION_OUTPUT = 256};
1252
1253 typedef enum OutputFormat {
1254 OFORMAT_JSON,
1255 OFORMAT_HUMAN,
1256 } OutputFormat;
1257
1258 static int img_info(int argc, char **argv)
1259 {
1260 int c;
1261 OutputFormat output_format = OFORMAT_HUMAN;
1262 const char *filename, *fmt, *output;
1263 BlockDriverState *bs;
1264 ImageInfo *info;
1265
1266 fmt = NULL;
1267 output = NULL;
1268 for(;;) {
1269 int option_index = 0;
1270 static const struct option long_options[] = {
1271 {"help", no_argument, 0, 'h'},
1272 {"format", required_argument, 0, 'f'},
1273 {"output", required_argument, 0, OPTION_OUTPUT},
1274 {0, 0, 0, 0}
1275 };
1276 c = getopt_long(argc, argv, "f:h",
1277 long_options, &option_index);
1278 if (c == -1) {
1279 break;
1280 }
1281 switch(c) {
1282 case '?':
1283 case 'h':
1284 help();
1285 break;
1286 case 'f':
1287 fmt = optarg;
1288 break;
1289 case OPTION_OUTPUT:
1290 output = optarg;
1291 break;
1292 }
1293 }
1294 if (optind >= argc) {
1295 help();
1296 }
1297 filename = argv[optind++];
1298
1299 if (output && !strcmp(output, "json")) {
1300 output_format = OFORMAT_JSON;
1301 } else if (output && !strcmp(output, "human")) {
1302 output_format = OFORMAT_HUMAN;
1303 } else if (output) {
1304 error_report("--output must be used with human or json as argument.");
1305 return 1;
1306 }
1307
1308 bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_NO_BACKING);
1309 if (!bs) {
1310 return 1;
1311 }
1312
1313 info = g_new0(ImageInfo, 1);
1314 collect_image_info(bs, info, filename, fmt);
1315
1316 switch (output_format) {
1317 case OFORMAT_HUMAN:
1318 dump_human_image_info(info);
1319 dump_snapshots(bs);
1320 break;
1321 case OFORMAT_JSON:
1322 collect_snapshots(bs, info);
1323 dump_json_image_info(info);
1324 break;
1325 }
1326
1327 qapi_free_ImageInfo(info);
1328 bdrv_delete(bs);
1329 return 0;
1330 }
1331
1332 #define SNAPSHOT_LIST 1
1333 #define SNAPSHOT_CREATE 2
1334 #define SNAPSHOT_APPLY 3
1335 #define SNAPSHOT_DELETE 4
1336
1337 static int img_snapshot(int argc, char **argv)
1338 {
1339 BlockDriverState *bs;
1340 QEMUSnapshotInfo sn;
1341 char *filename, *snapshot_name = NULL;
1342 int c, ret = 0, bdrv_oflags;
1343 int action = 0;
1344 qemu_timeval tv;
1345
1346 bdrv_oflags = BDRV_O_FLAGS | BDRV_O_RDWR;
1347 /* Parse commandline parameters */
1348 for(;;) {
1349 c = getopt(argc, argv, "la:c:d:h");
1350 if (c == -1) {
1351 break;
1352 }
1353 switch(c) {
1354 case '?':
1355 case 'h':
1356 help();
1357 return 0;
1358 case 'l':
1359 if (action) {
1360 help();
1361 return 0;
1362 }
1363 action = SNAPSHOT_LIST;
1364 bdrv_oflags &= ~BDRV_O_RDWR; /* no need for RW */
1365 break;
1366 case 'a':
1367 if (action) {
1368 help();
1369 return 0;
1370 }
1371 action = SNAPSHOT_APPLY;
1372 snapshot_name = optarg;
1373 break;
1374 case 'c':
1375 if (action) {
1376 help();
1377 return 0;
1378 }
1379 action = SNAPSHOT_CREATE;
1380 snapshot_name = optarg;
1381 break;
1382 case 'd':
1383 if (action) {
1384 help();
1385 return 0;
1386 }
1387 action = SNAPSHOT_DELETE;
1388 snapshot_name = optarg;
1389 break;
1390 }
1391 }
1392
1393 if (optind >= argc) {
1394 help();
1395 }
1396 filename = argv[optind++];
1397
1398 /* Open the image */
1399 bs = bdrv_new_open(filename, NULL, bdrv_oflags);
1400 if (!bs) {
1401 return 1;
1402 }
1403
1404 /* Perform the requested action */
1405 switch(action) {
1406 case SNAPSHOT_LIST:
1407 dump_snapshots(bs);
1408 break;
1409
1410 case SNAPSHOT_CREATE:
1411 memset(&sn, 0, sizeof(sn));
1412 pstrcpy(sn.name, sizeof(sn.name), snapshot_name);
1413
1414 qemu_gettimeofday(&tv);
1415 sn.date_sec = tv.tv_sec;
1416 sn.date_nsec = tv.tv_usec * 1000;
1417
1418 ret = bdrv_snapshot_create(bs, &sn);
1419 if (ret) {
1420 error_report("Could not create snapshot '%s': %d (%s)",
1421 snapshot_name, ret, strerror(-ret));
1422 }
1423 break;
1424
1425 case SNAPSHOT_APPLY:
1426 ret = bdrv_snapshot_goto(bs, snapshot_name);
1427 if (ret) {
1428 error_report("Could not apply snapshot '%s': %d (%s)",
1429 snapshot_name, ret, strerror(-ret));
1430 }
1431 break;
1432
1433 case SNAPSHOT_DELETE:
1434 ret = bdrv_snapshot_delete(bs, snapshot_name);
1435 if (ret) {
1436 error_report("Could not delete snapshot '%s': %d (%s)",
1437 snapshot_name, ret, strerror(-ret));
1438 }
1439 break;
1440 }
1441
1442 /* Cleanup */
1443 bdrv_delete(bs);
1444 if (ret) {
1445 return 1;
1446 }
1447 return 0;
1448 }
1449
1450 static int img_rebase(int argc, char **argv)
1451 {
1452 BlockDriverState *bs, *bs_old_backing = NULL, *bs_new_backing = NULL;
1453 BlockDriver *old_backing_drv, *new_backing_drv;
1454 char *filename;
1455 const char *fmt, *cache, *out_basefmt, *out_baseimg;
1456 int c, flags, ret;
1457 int unsafe = 0;
1458 int progress = 0;
1459
1460 /* Parse commandline parameters */
1461 fmt = NULL;
1462 cache = BDRV_DEFAULT_CACHE;
1463 out_baseimg = NULL;
1464 out_basefmt = NULL;
1465 for(;;) {
1466 c = getopt(argc, argv, "uhf:F:b:pt:");
1467 if (c == -1) {
1468 break;
1469 }
1470 switch(c) {
1471 case '?':
1472 case 'h':
1473 help();
1474 return 0;
1475 case 'f':
1476 fmt = optarg;
1477 break;
1478 case 'F':
1479 out_basefmt = optarg;
1480 break;
1481 case 'b':
1482 out_baseimg = optarg;
1483 break;
1484 case 'u':
1485 unsafe = 1;
1486 break;
1487 case 'p':
1488 progress = 1;
1489 break;
1490 case 't':
1491 cache = optarg;
1492 break;
1493 }
1494 }
1495
1496 if ((optind >= argc) || (!unsafe && !out_baseimg)) {
1497 help();
1498 }
1499 filename = argv[optind++];
1500
1501 qemu_progress_init(progress, 2.0);
1502 qemu_progress_print(0, 100);
1503
1504 flags = BDRV_O_RDWR | (unsafe ? BDRV_O_NO_BACKING : 0);
1505 ret = bdrv_parse_cache_flags(cache, &flags);
1506 if (ret < 0) {
1507 error_report("Invalid cache option: %s", cache);
1508 return -1;
1509 }
1510
1511 /*
1512 * Open the images.
1513 *
1514 * Ignore the old backing file for unsafe rebase in case we want to correct
1515 * the reference to a renamed or moved backing file.
1516 */
1517 bs = bdrv_new_open(filename, fmt, flags);
1518 if (!bs) {
1519 return 1;
1520 }
1521
1522 /* Find the right drivers for the backing files */
1523 old_backing_drv = NULL;
1524 new_backing_drv = NULL;
1525
1526 if (!unsafe && bs->backing_format[0] != '\0') {
1527 old_backing_drv = bdrv_find_format(bs->backing_format);
1528 if (old_backing_drv == NULL) {
1529 error_report("Invalid format name: '%s'", bs->backing_format);
1530 ret = -1;
1531 goto out;
1532 }
1533 }
1534
1535 if (out_basefmt != NULL) {
1536 new_backing_drv = bdrv_find_format(out_basefmt);
1537 if (new_backing_drv == NULL) {
1538 error_report("Invalid format name: '%s'", out_basefmt);
1539 ret = -1;
1540 goto out;
1541 }
1542 }
1543
1544 /* For safe rebasing we need to compare old and new backing file */
1545 if (unsafe) {
1546 /* Make the compiler happy */
1547 bs_old_backing = NULL;
1548 bs_new_backing = NULL;
1549 } else {
1550 char backing_name[1024];
1551
1552 bs_old_backing = bdrv_new("old_backing");
1553 bdrv_get_backing_filename(bs, backing_name, sizeof(backing_name));
1554 ret = bdrv_open(bs_old_backing, backing_name, BDRV_O_FLAGS,
1555 old_backing_drv);
1556 if (ret) {
1557 error_report("Could not open old backing file '%s'", backing_name);
1558 goto out;
1559 }
1560
1561 bs_new_backing = bdrv_new("new_backing");
1562 ret = bdrv_open(bs_new_backing, out_baseimg, BDRV_O_FLAGS,
1563 new_backing_drv);
1564 if (ret) {
1565 error_report("Could not open new backing file '%s'", out_baseimg);
1566 goto out;
1567 }
1568 }
1569
1570 /*
1571 * Check each unallocated cluster in the COW file. If it is unallocated,
1572 * accesses go to the backing file. We must therefore compare this cluster
1573 * in the old and new backing file, and if they differ we need to copy it
1574 * from the old backing file into the COW file.
1575 *
1576 * If qemu-img crashes during this step, no harm is done. The content of
1577 * the image is the same as the original one at any time.
1578 */
1579 if (!unsafe) {
1580 uint64_t num_sectors;
1581 uint64_t old_backing_num_sectors;
1582 uint64_t new_backing_num_sectors;
1583 uint64_t sector;
1584 int n;
1585 uint8_t * buf_old;
1586 uint8_t * buf_new;
1587 float local_progress;
1588
1589 buf_old = qemu_blockalign(bs, IO_BUF_SIZE);
1590 buf_new = qemu_blockalign(bs, IO_BUF_SIZE);
1591
1592 bdrv_get_geometry(bs, &num_sectors);
1593 bdrv_get_geometry(bs_old_backing, &old_backing_num_sectors);
1594 bdrv_get_geometry(bs_new_backing, &new_backing_num_sectors);
1595
1596 local_progress = (float)100 /
1597 (num_sectors / MIN(num_sectors, IO_BUF_SIZE / 512));
1598 for (sector = 0; sector < num_sectors; sector += n) {
1599
1600 /* How many sectors can we handle with the next read? */
1601 if (sector + (IO_BUF_SIZE / 512) <= num_sectors) {
1602 n = (IO_BUF_SIZE / 512);
1603 } else {
1604 n = num_sectors - sector;
1605 }
1606
1607 /* If the cluster is allocated, we don't need to take action */
1608 ret = bdrv_is_allocated(bs, sector, n, &n);
1609 if (ret) {
1610 continue;
1611 }
1612
1613 /*
1614 * Read old and new backing file and take into consideration that
1615 * backing files may be smaller than the COW image.
1616 */
1617 if (sector >= old_backing_num_sectors) {
1618 memset(buf_old, 0, n * BDRV_SECTOR_SIZE);
1619 } else {
1620 if (sector + n > old_backing_num_sectors) {
1621 n = old_backing_num_sectors - sector;
1622 }
1623
1624 ret = bdrv_read(bs_old_backing, sector, buf_old, n);
1625 if (ret < 0) {
1626 error_report("error while reading from old backing file");
1627 goto out;
1628 }
1629 }
1630
1631 if (sector >= new_backing_num_sectors) {
1632 memset(buf_new, 0, n * BDRV_SECTOR_SIZE);
1633 } else {
1634 if (sector + n > new_backing_num_sectors) {
1635 n = new_backing_num_sectors - sector;
1636 }
1637
1638 ret = bdrv_read(bs_new_backing, sector, buf_new, n);
1639 if (ret < 0) {
1640 error_report("error while reading from new backing file");
1641 goto out;
1642 }
1643 }
1644
1645 /* If they differ, we need to write to the COW file */
1646 uint64_t written = 0;
1647
1648 while (written < n) {
1649 int pnum;
1650
1651 if (compare_sectors(buf_old + written * 512,
1652 buf_new + written * 512, n - written, &pnum))
1653 {
1654 ret = bdrv_write(bs, sector + written,
1655 buf_old + written * 512, pnum);
1656 if (ret < 0) {
1657 error_report("Error while writing to COW image: %s",
1658 strerror(-ret));
1659 goto out;
1660 }
1661 }
1662
1663 written += pnum;
1664 }
1665 qemu_progress_print(local_progress, 100);
1666 }
1667
1668 qemu_vfree(buf_old);
1669 qemu_vfree(buf_new);
1670 }
1671
1672 /*
1673 * Change the backing file. All clusters that are different from the old
1674 * backing file are overwritten in the COW file now, so the visible content
1675 * doesn't change when we switch the backing file.
1676 */
1677 ret = bdrv_change_backing_file(bs, out_baseimg, out_basefmt);
1678 if (ret == -ENOSPC) {
1679 error_report("Could not change the backing file to '%s': No "
1680 "space left in the file header", out_baseimg);
1681 } else if (ret < 0) {
1682 error_report("Could not change the backing file to '%s': %s",
1683 out_baseimg, strerror(-ret));
1684 }
1685
1686 qemu_progress_print(100, 0);
1687 /*
1688 * TODO At this point it is possible to check if any clusters that are
1689 * allocated in the COW file are the same in the backing file. If so, they
1690 * could be dropped from the COW file. Don't do this before switching the
1691 * backing file, in case of a crash this would lead to corruption.
1692 */
1693 out:
1694 qemu_progress_end();
1695 /* Cleanup */
1696 if (!unsafe) {
1697 if (bs_old_backing != NULL) {
1698 bdrv_delete(bs_old_backing);
1699 }
1700 if (bs_new_backing != NULL) {
1701 bdrv_delete(bs_new_backing);
1702 }
1703 }
1704
1705 bdrv_delete(bs);
1706 if (ret) {
1707 return 1;
1708 }
1709 return 0;
1710 }
1711
1712 static int img_resize(int argc, char **argv)
1713 {
1714 int c, ret, relative;
1715 const char *filename, *fmt, *size;
1716 int64_t n, total_size;
1717 BlockDriverState *bs = NULL;
1718 QemuOpts *param;
1719 static QemuOptsList resize_options = {
1720 .name = "resize_options",
1721 .head = QTAILQ_HEAD_INITIALIZER(resize_options.head),
1722 .desc = {
1723 {
1724 .name = BLOCK_OPT_SIZE,
1725 .type = QEMU_OPT_SIZE,
1726 .help = "Virtual disk size"
1727 }, {
1728 /* end of list */
1729 }
1730 },
1731 };
1732
1733 /* Remove size from argv manually so that negative numbers are not treated
1734 * as options by getopt. */
1735 if (argc < 3) {
1736 help();
1737 return 1;
1738 }
1739
1740 size = argv[--argc];
1741
1742 /* Parse getopt arguments */
1743 fmt = NULL;
1744 for(;;) {
1745 c = getopt(argc, argv, "f:h");
1746 if (c == -1) {
1747 break;
1748 }
1749 switch(c) {
1750 case '?':
1751 case 'h':
1752 help();
1753 break;
1754 case 'f':
1755 fmt = optarg;
1756 break;
1757 }
1758 }
1759 if (optind >= argc) {
1760 help();
1761 }
1762 filename = argv[optind++];
1763
1764 /* Choose grow, shrink, or absolute resize mode */
1765 switch (size[0]) {
1766 case '+':
1767 relative = 1;
1768 size++;
1769 break;
1770 case '-':
1771 relative = -1;
1772 size++;
1773 break;
1774 default:
1775 relative = 0;
1776 break;
1777 }
1778
1779 /* Parse size */
1780 param = qemu_opts_create(&resize_options, NULL, 0, NULL);
1781 if (qemu_opt_set(param, BLOCK_OPT_SIZE, size)) {
1782 /* Error message already printed when size parsing fails */
1783 ret = -1;
1784 qemu_opts_del(param);
1785 goto out;
1786 }
1787 n = qemu_opt_get_size(param, BLOCK_OPT_SIZE, 0);
1788 qemu_opts_del(param);
1789
1790 bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_RDWR);
1791 if (!bs) {
1792 ret = -1;
1793 goto out;
1794 }
1795
1796 if (relative) {
1797 total_size = bdrv_getlength(bs) + n * relative;
1798 } else {
1799 total_size = n;
1800 }
1801 if (total_size <= 0) {
1802 error_report("New image size must be positive");
1803 ret = -1;
1804 goto out;
1805 }
1806
1807 ret = bdrv_truncate(bs, total_size);
1808 switch (ret) {
1809 case 0:
1810 printf("Image resized.\n");
1811 break;
1812 case -ENOTSUP:
1813 error_report("This image does not support resize");
1814 break;
1815 case -EACCES:
1816 error_report("Image is read-only");
1817 break;
1818 default:
1819 error_report("Error resizing image (%d)", -ret);
1820 break;
1821 }
1822 out:
1823 if (bs) {
1824 bdrv_delete(bs);
1825 }
1826 if (ret) {
1827 return 1;
1828 }
1829 return 0;
1830 }
1831
1832 static const img_cmd_t img_cmds[] = {
1833 #define DEF(option, callback, arg_string) \
1834 { option, callback },
1835 #include "qemu-img-cmds.h"
1836 #undef DEF
1837 #undef GEN_DOCS
1838 { NULL, NULL, },
1839 };
1840
1841 int main(int argc, char **argv)
1842 {
1843 const img_cmd_t *cmd;
1844 const char *cmdname;
1845
1846 error_set_progname(argv[0]);
1847
1848 bdrv_init();
1849 if (argc < 2)
1850 help();
1851 cmdname = argv[1];
1852 argc--; argv++;
1853
1854 qemu_init_main_loop();
1855
1856 /* find the command */
1857 for(cmd = img_cmds; cmd->name != NULL; cmd++) {
1858 if (!strcmp(cmdname, cmd->name)) {
1859 return cmd->handler(argc, argv);
1860 }
1861 }
1862
1863 /* not found */
1864 help();
1865 return 0;
1866 }