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