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