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