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