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