]> git.proxmox.com Git - qemu.git/blame - qemu-img.c
xen: flush queue when getting an event
[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"
a0d718a3 92 " hiding corruption that has already occurred.\n"
4534ff54 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,
f9f552e8
DB
224 int flags,
225 bool require_io)
75c23805
FB
226{
227 BlockDriverState *bs;
228 BlockDriver *drv;
229 char password[256];
b9eaf9ec 230 int ret;
75c23805 231
b9eaf9ec 232 bs = bdrv_new("image");
ad717139 233
75c23805
FB
234 if (fmt) {
235 drv = bdrv_find_format(fmt);
c2abccec 236 if (!drv) {
15654a6d 237 error_report("Unknown file format '%s'", fmt);
c2abccec
MK
238 goto fail;
239 }
75c23805
FB
240 } else {
241 drv = NULL;
242 }
b9eaf9ec
KW
243
244 ret = bdrv_open(bs, filename, flags, drv);
245 if (ret < 0) {
246 error_report("Could not open '%s': %s", filename, strerror(-ret));
c2abccec 247 goto fail;
75c23805 248 }
b9eaf9ec 249
f9f552e8 250 if (bdrv_is_encrypted(bs) && require_io) {
75c23805 251 printf("Disk image '%s' is encrypted.\n", filename);
c2abccec 252 if (read_password(password, sizeof(password)) < 0) {
15654a6d 253 error_report("No password given");
c2abccec
MK
254 goto fail;
255 }
256 if (bdrv_set_key(bs, password) < 0) {
15654a6d 257 error_report("invalid password");
c2abccec
MK
258 goto fail;
259 }
75c23805
FB
260 }
261 return bs;
c2abccec
MK
262fail:
263 if (bs) {
264 bdrv_delete(bs);
265 }
266 return NULL;
75c23805
FB
267}
268
c2abccec 269static int add_old_style_options(const char *fmt, QEMUOptionParameter *list,
eec77d9e
JS
270 const char *base_filename,
271 const char *base_fmt)
efa84d43 272{
efa84d43
KW
273 if (base_filename) {
274 if (set_option_parameter(list, BLOCK_OPT_BACKING_FILE, base_filename)) {
15654a6d
JS
275 error_report("Backing file not supported for file format '%s'",
276 fmt);
c2abccec 277 return -1;
efa84d43
KW
278 }
279 }
280 if (base_fmt) {
281 if (set_option_parameter(list, BLOCK_OPT_BACKING_FMT, base_fmt)) {
15654a6d
JS
282 error_report("Backing file format not supported for file "
283 "format '%s'", fmt);
c2abccec 284 return -1;
efa84d43
KW
285 }
286 }
c2abccec 287 return 0;
efa84d43
KW
288}
289
ea2384d3
FB
290static int img_create(int argc, char **argv)
291{
eec77d9e 292 int c, ret = 0;
1da7cfbd 293 uint64_t img_size = -1;
ea2384d3 294 const char *fmt = "raw";
9230eaf6 295 const char *base_fmt = NULL;
ea2384d3
FB
296 const char *filename;
297 const char *base_filename = NULL;
9ea2ea71 298 char *options = NULL;
3b46e624 299
ea2384d3 300 for(;;) {
9ea2ea71 301 c = getopt(argc, argv, "F:b:f:he6o:");
b8fb60da 302 if (c == -1) {
ea2384d3 303 break;
b8fb60da 304 }
ea2384d3 305 switch(c) {
ef87394c 306 case '?':
ea2384d3
FB
307 case 'h':
308 help();
309 break;
9230eaf6
AL
310 case 'F':
311 base_fmt = optarg;
312 break;
ea2384d3
FB
313 case 'b':
314 base_filename = optarg;
315 break;
316 case 'f':
317 fmt = optarg;
318 break;
319 case 'e':
9d42e15d 320 error_report("option -e is deprecated, please use \'-o "
eec77d9e
JS
321 "encryption\' instead!");
322 return 1;
d8871c5a 323 case '6':
9d42e15d 324 error_report("option -6 is deprecated, please use \'-o "
eec77d9e
JS
325 "compat6\' instead!");
326 return 1;
9ea2ea71
KW
327 case 'o':
328 options = optarg;
329 break;
ea2384d3
FB
330 }
331 }
9230eaf6 332
b50cbabc 333 /* Get the filename */
b8fb60da 334 if (optind >= argc) {
b50cbabc 335 help();
b8fb60da 336 }
b50cbabc
MK
337 filename = argv[optind++];
338
1da7cfbd
JS
339 /* Get image size, if specified */
340 if (optind < argc) {
70b4f4bb 341 int64_t sval;
e36b3695
MA
342 char *end;
343 sval = strtosz_suffix(argv[optind++], &end, STRTOSZ_DEFSUFFIX_B);
344 if (sval < 0 || *end) {
15654a6d 345 error_report("Invalid image size specified! You may use k, M, G or "
1da7cfbd 346 "T suffixes for ");
15654a6d 347 error_report("kilobytes, megabytes, gigabytes and terabytes.");
1da7cfbd
JS
348 ret = -1;
349 goto out;
350 }
351 img_size = (uint64_t)sval;
352 }
353
c8057f95 354 if (options && is_help_option(options)) {
4ac8aacd
JS
355 ret = print_block_option_help(filename, fmt);
356 goto out;
357 }
358
f88e1a42
JS
359 ret = bdrv_img_create(filename, fmt, base_filename, base_fmt,
360 options, img_size, BDRV_O_FLAGS);
c2abccec
MK
361out:
362 if (ret) {
363 return 1;
364 }
ea2384d3
FB
365 return 0;
366}
367
e076f338
KW
368/*
369 * Checks an image for consistency. Exit codes:
370 *
371 * 0 - Check completed, image is good
372 * 1 - Check not completed because of internal errors
373 * 2 - Check completed, image is corrupted
374 * 3 - Check completed, image has leaked clusters, but is good otherwise
375 */
1585969c
AL
376static int img_check(int argc, char **argv)
377{
378 int c, ret;
379 const char *filename, *fmt;
1585969c 380 BlockDriverState *bs;
e076f338 381 BdrvCheckResult result;
4534ff54 382 int fix = 0;
058f8f16 383 int flags = BDRV_O_FLAGS | BDRV_O_CHECK;
1585969c
AL
384
385 fmt = NULL;
386 for(;;) {
4534ff54 387 c = getopt(argc, argv, "f:hr:");
b8fb60da 388 if (c == -1) {
1585969c 389 break;
b8fb60da 390 }
1585969c 391 switch(c) {
ef87394c 392 case '?':
1585969c
AL
393 case 'h':
394 help();
395 break;
396 case 'f':
397 fmt = optarg;
398 break;
4534ff54
KW
399 case 'r':
400 flags |= BDRV_O_RDWR;
401
402 if (!strcmp(optarg, "leaks")) {
403 fix = BDRV_FIX_LEAKS;
404 } else if (!strcmp(optarg, "all")) {
405 fix = BDRV_FIX_LEAKS | BDRV_FIX_ERRORS;
406 } else {
407 help();
408 }
409 break;
1585969c
AL
410 }
411 }
b8fb60da 412 if (optind >= argc) {
1585969c 413 help();
b8fb60da 414 }
1585969c
AL
415 filename = argv[optind++];
416
f9f552e8 417 bs = bdrv_new_open(filename, fmt, flags, true);
c2abccec
MK
418 if (!bs) {
419 return 1;
420 }
4534ff54 421 ret = bdrv_check(bs, &result, fix);
e076f338
KW
422
423 if (ret == -ENOTSUP) {
15654a6d 424 error_report("This image format does not support checks");
e076f338
KW
425 bdrv_delete(bs);
426 return 1;
427 }
428
ccf34716
KW
429 if (result.corruptions_fixed || result.leaks_fixed) {
430 printf("The following inconsistencies were found and repaired:\n\n"
431 " %d leaked clusters\n"
432 " %d corruptions\n\n"
433 "Double checking the fixed image now...\n",
434 result.leaks_fixed,
435 result.corruptions_fixed);
436 ret = bdrv_check(bs, &result, 0);
437 }
438
e076f338
KW
439 if (!(result.corruptions || result.leaks || result.check_errors)) {
440 printf("No errors were found on the image.\n");
441 } else {
442 if (result.corruptions) {
443 printf("\n%d errors were found on the image.\n"
444 "Data may be corrupted, or further writes to the image "
445 "may corrupt it.\n",
446 result.corruptions);
447 }
448
449 if (result.leaks) {
450 printf("\n%d leaked clusters were found on the image.\n"
451 "This means waste of disk space, but no harm to data.\n",
452 result.leaks);
453 }
454
455 if (result.check_errors) {
456 printf("\n%d internal errors have occurred during the check.\n",
457 result.check_errors);
1585969c 458 }
1585969c
AL
459 }
460
f8111c24
DXW
461 if (result.bfi.total_clusters != 0 && result.bfi.allocated_clusters != 0) {
462 printf("%" PRId64 "/%" PRId64 "= %0.2f%% allocated, %0.2f%% fragmented\n",
463 result.bfi.allocated_clusters, result.bfi.total_clusters,
464 result.bfi.allocated_clusters * 100.0 / result.bfi.total_clusters,
465 result.bfi.fragmented_clusters * 100.0 / result.bfi.allocated_clusters);
466 }
467
1585969c 468 bdrv_delete(bs);
e076f338
KW
469
470 if (ret < 0 || result.check_errors) {
471 printf("\nAn error has occurred during the check: %s\n"
472 "The check is not complete and may have missed error.\n",
473 strerror(-ret));
c2abccec
MK
474 return 1;
475 }
e076f338
KW
476
477 if (result.corruptions) {
478 return 2;
479 } else if (result.leaks) {
480 return 3;
481 } else {
482 return 0;
483 }
1585969c
AL
484}
485
ea2384d3
FB
486static int img_commit(int argc, char **argv)
487{
661a0f71
FS
488 int c, ret, flags;
489 const char *filename, *fmt, *cache;
ea2384d3
FB
490 BlockDriverState *bs;
491
492 fmt = NULL;
661a0f71 493 cache = BDRV_DEFAULT_CACHE;
ea2384d3 494 for(;;) {
661a0f71 495 c = getopt(argc, argv, "f:ht:");
b8fb60da 496 if (c == -1) {
ea2384d3 497 break;
b8fb60da 498 }
ea2384d3 499 switch(c) {
ef87394c 500 case '?':
ea2384d3
FB
501 case 'h':
502 help();
503 break;
504 case 'f':
505 fmt = optarg;
506 break;
661a0f71
FS
507 case 't':
508 cache = optarg;
509 break;
ea2384d3
FB
510 }
511 }
b8fb60da 512 if (optind >= argc) {
ea2384d3 513 help();
b8fb60da 514 }
ea2384d3
FB
515 filename = argv[optind++];
516
661a0f71 517 flags = BDRV_O_RDWR;
c3993cdc 518 ret = bdrv_parse_cache_flags(cache, &flags);
661a0f71
FS
519 if (ret < 0) {
520 error_report("Invalid cache option: %s", cache);
521 return -1;
522 }
523
f9f552e8 524 bs = bdrv_new_open(filename, fmt, flags, true);
c2abccec
MK
525 if (!bs) {
526 return 1;
527 }
ea2384d3
FB
528 ret = bdrv_commit(bs);
529 switch(ret) {
530 case 0:
531 printf("Image committed.\n");
532 break;
533 case -ENOENT:
15654a6d 534 error_report("No disk inserted");
ea2384d3
FB
535 break;
536 case -EACCES:
15654a6d 537 error_report("Image is read-only");
ea2384d3
FB
538 break;
539 case -ENOTSUP:
15654a6d 540 error_report("Image is already committed");
ea2384d3
FB
541 break;
542 default:
15654a6d 543 error_report("Error while committing image");
ea2384d3
FB
544 break;
545 }
546
547 bdrv_delete(bs);
c2abccec
MK
548 if (ret) {
549 return 1;
550 }
ea2384d3
FB
551 return 0;
552}
553
f58c7b35
TS
554/*
555 * Returns true iff the first sector pointed to by 'buf' contains at least
556 * a non-NUL byte.
557 *
558 * 'pnum' is set to the number of sectors (including and immediately following
559 * the first one) that are known to be in the same allocated/unallocated state.
560 */
ea2384d3
FB
561static int is_allocated_sectors(const uint8_t *buf, int n, int *pnum)
562{
1a6d39fd
SH
563 bool is_zero;
564 int i;
ea2384d3
FB
565
566 if (n <= 0) {
567 *pnum = 0;
568 return 0;
569 }
1a6d39fd 570 is_zero = buffer_is_zero(buf, 512);
ea2384d3
FB
571 for(i = 1; i < n; i++) {
572 buf += 512;
1a6d39fd 573 if (is_zero != buffer_is_zero(buf, 512)) {
ea2384d3 574 break;
1a6d39fd 575 }
ea2384d3
FB
576 }
577 *pnum = i;
1a6d39fd 578 return !is_zero;
ea2384d3
FB
579}
580
a22f123c
KW
581/*
582 * Like is_allocated_sectors, but if the buffer starts with a used sector,
583 * up to 'min' consecutive sectors containing zeros are ignored. This avoids
584 * breaking up write requests for only small sparse areas.
585 */
586static int is_allocated_sectors_min(const uint8_t *buf, int n, int *pnum,
587 int min)
588{
589 int ret;
590 int num_checked, num_used;
591
592 if (n < min) {
593 min = n;
594 }
595
596 ret = is_allocated_sectors(buf, n, pnum);
597 if (!ret) {
598 return ret;
599 }
600
601 num_used = *pnum;
602 buf += BDRV_SECTOR_SIZE * *pnum;
603 n -= *pnum;
604 num_checked = num_used;
605
606 while (n > 0) {
607 ret = is_allocated_sectors(buf, n, pnum);
608
609 buf += BDRV_SECTOR_SIZE * *pnum;
610 n -= *pnum;
611 num_checked += *pnum;
612 if (ret) {
613 num_used = num_checked;
614 } else if (*pnum >= min) {
615 break;
616 }
617 }
618
619 *pnum = num_used;
620 return 1;
621}
622
3e85c6fd
KW
623/*
624 * Compares two buffers sector by sector. Returns 0 if the first sector of both
625 * buffers matches, non-zero otherwise.
626 *
627 * pnum is set to the number of sectors (including and immediately following
628 * the first one) that are known to have the same comparison result
629 */
630static int compare_sectors(const uint8_t *buf1, const uint8_t *buf2, int n,
631 int *pnum)
632{
633 int res, i;
634
635 if (n <= 0) {
636 *pnum = 0;
637 return 0;
638 }
639
640 res = !!memcmp(buf1, buf2, 512);
641 for(i = 1; i < n; i++) {
642 buf1 += 512;
643 buf2 += 512;
644
645 if (!!memcmp(buf1, buf2, 512) != res) {
646 break;
647 }
648 }
649
650 *pnum = i;
651 return res;
652}
653
80ee15a6 654#define IO_BUF_SIZE (2 * 1024 * 1024)
ea2384d3
FB
655
656static int img_convert(int argc, char **argv)
657{
eec77d9e 658 int c, ret = 0, n, n1, bs_n, bs_i, compress, cluster_size, cluster_sectors;
661a0f71
FS
659 int progress = 0, flags;
660 const char *fmt, *out_fmt, *cache, *out_baseimg, *out_filename;
b50cbabc 661 BlockDriver *drv, *proto_drv;
c2abccec 662 BlockDriverState **bs = NULL, *out_bs = NULL;
96b8f136
TS
663 int64_t total_sectors, nb_sectors, sector_num, bs_offset;
664 uint64_t bs_sectors;
c2abccec 665 uint8_t * buf = NULL;
ea2384d3 666 const uint8_t *buf1;
faea38e7 667 BlockDriverInfo bdi;
b50cbabc 668 QEMUOptionParameter *param = NULL, *create_options = NULL;
a18953fb 669 QEMUOptionParameter *out_baseimg_param;
efa84d43 670 char *options = NULL;
51ef6727 671 const char *snapshot_name = NULL;
6b837bc4 672 float local_progress;
a22f123c 673 int min_sparse = 8; /* Need at least 4k of zeros for sparse detection */
ea2384d3
FB
674
675 fmt = NULL;
676 out_fmt = "raw";
661a0f71 677 cache = "unsafe";
f58c7b35 678 out_baseimg = NULL;
eec77d9e 679 compress = 0;
ea2384d3 680 for(;;) {
a22f123c 681 c = getopt(argc, argv, "f:O:B:s:hce6o:pS:t:");
b8fb60da 682 if (c == -1) {
ea2384d3 683 break;
b8fb60da 684 }
ea2384d3 685 switch(c) {
ef87394c 686 case '?':
ea2384d3
FB
687 case 'h':
688 help();
689 break;
690 case 'f':
691 fmt = optarg;
692 break;
693 case 'O':
694 out_fmt = optarg;
695 break;
f58c7b35
TS
696 case 'B':
697 out_baseimg = optarg;
698 break;
ea2384d3 699 case 'c':
eec77d9e 700 compress = 1;
ea2384d3
FB
701 break;
702 case 'e':
9d42e15d 703 error_report("option -e is deprecated, please use \'-o "
eec77d9e
JS
704 "encryption\' instead!");
705 return 1;
ec36ba14 706 case '6':
9d42e15d 707 error_report("option -6 is deprecated, please use \'-o "
eec77d9e
JS
708 "compat6\' instead!");
709 return 1;
efa84d43
KW
710 case 'o':
711 options = optarg;
712 break;
51ef6727 713 case 's':
714 snapshot_name = optarg;
715 break;
a22f123c
KW
716 case 'S':
717 {
718 int64_t sval;
e36b3695
MA
719 char *end;
720 sval = strtosz_suffix(optarg, &end, STRTOSZ_DEFSUFFIX_B);
721 if (sval < 0 || *end) {
a22f123c
KW
722 error_report("Invalid minimum zero buffer size for sparse output specified");
723 return 1;
724 }
725
726 min_sparse = sval / BDRV_SECTOR_SIZE;
727 break;
728 }
6b837bc4
JS
729 case 'p':
730 progress = 1;
731 break;
661a0f71
FS
732 case 't':
733 cache = optarg;
734 break;
ea2384d3
FB
735 }
736 }
3b46e624 737
926c2d23 738 bs_n = argc - optind - 1;
b8fb60da
JS
739 if (bs_n < 1) {
740 help();
741 }
926c2d23
AZ
742
743 out_filename = argv[argc - 1];
f58c7b35 744
fa170c14
CA
745 /* Initialize before goto out */
746 qemu_progress_init(progress, 2.0);
747
c8057f95 748 if (options && is_help_option(options)) {
4ac8aacd
JS
749 ret = print_block_option_help(out_filename, out_fmt);
750 goto out;
751 }
752
c2abccec 753 if (bs_n > 1 && out_baseimg) {
15654a6d
JS
754 error_report("-B makes no sense when concatenating multiple input "
755 "images");
31ca34b8
JS
756 ret = -1;
757 goto out;
c2abccec 758 }
f8111c24 759
6b837bc4
JS
760 qemu_progress_print(0, 100);
761
7267c094 762 bs = g_malloc0(bs_n * sizeof(BlockDriverState *));
926c2d23
AZ
763
764 total_sectors = 0;
765 for (bs_i = 0; bs_i < bs_n; bs_i++) {
f9f552e8 766 bs[bs_i] = bdrv_new_open(argv[optind + bs_i], fmt, BDRV_O_FLAGS, true);
c2abccec 767 if (!bs[bs_i]) {
15654a6d 768 error_report("Could not open '%s'", argv[optind + bs_i]);
c2abccec
MK
769 ret = -1;
770 goto out;
771 }
926c2d23
AZ
772 bdrv_get_geometry(bs[bs_i], &bs_sectors);
773 total_sectors += bs_sectors;
774 }
ea2384d3 775
51ef6727 776 if (snapshot_name != NULL) {
777 if (bs_n > 1) {
6daf194d 778 error_report("No support for concatenating multiple snapshot");
51ef6727 779 ret = -1;
780 goto out;
781 }
782 if (bdrv_snapshot_load_tmp(bs[0], snapshot_name) < 0) {
6daf194d 783 error_report("Failed to load snapshot");
51ef6727 784 ret = -1;
785 goto out;
786 }
787 }
788
efa84d43 789 /* Find driver and parse its options */
ea2384d3 790 drv = bdrv_find_format(out_fmt);
c2abccec 791 if (!drv) {
15654a6d 792 error_report("Unknown file format '%s'", out_fmt);
c2abccec
MK
793 ret = -1;
794 goto out;
795 }
efa84d43 796
b50cbabc 797 proto_drv = bdrv_find_protocol(out_filename);
c2abccec 798 if (!proto_drv) {
15654a6d 799 error_report("Unknown protocol '%s'", out_filename);
c2abccec
MK
800 ret = -1;
801 goto out;
802 }
b50cbabc
MK
803
804 create_options = append_option_parameters(create_options,
805 drv->create_options);
806 create_options = append_option_parameters(create_options,
807 proto_drv->create_options);
db08adf5 808
efa84d43 809 if (options) {
b50cbabc 810 param = parse_option_parameters(options, create_options, param);
efa84d43 811 if (param == NULL) {
15654a6d 812 error_report("Invalid options for file format '%s'.", out_fmt);
c2abccec
MK
813 ret = -1;
814 goto out;
efa84d43
KW
815 }
816 } else {
b50cbabc 817 param = parse_option_parameters("", create_options, param);
efa84d43
KW
818 }
819
820 set_option_parameter_int(param, BLOCK_OPT_SIZE, total_sectors * 512);
eec77d9e 821 ret = add_old_style_options(out_fmt, param, out_baseimg, NULL);
c2abccec
MK
822 if (ret < 0) {
823 goto out;
824 }
efa84d43 825
a18953fb
KW
826 /* Get backing file name if -o backing_file was used */
827 out_baseimg_param = get_option_parameter(param, BLOCK_OPT_BACKING_FILE);
828 if (out_baseimg_param) {
829 out_baseimg = out_baseimg_param->value.s;
830 }
831
efa84d43 832 /* Check if compression is supported */
eec77d9e 833 if (compress) {
efa84d43
KW
834 QEMUOptionParameter *encryption =
835 get_option_parameter(param, BLOCK_OPT_ENCRYPT);
41521fa4
KW
836 QEMUOptionParameter *preallocation =
837 get_option_parameter(param, BLOCK_OPT_PREALLOC);
efa84d43
KW
838
839 if (!drv->bdrv_write_compressed) {
15654a6d 840 error_report("Compression not supported for this file format");
c2abccec
MK
841 ret = -1;
842 goto out;
efa84d43
KW
843 }
844
845 if (encryption && encryption->value.n) {
15654a6d
JS
846 error_report("Compression and encryption not supported at "
847 "the same time");
c2abccec
MK
848 ret = -1;
849 goto out;
efa84d43 850 }
41521fa4
KW
851
852 if (preallocation && preallocation->value.s
853 && strcmp(preallocation->value.s, "off"))
854 {
855 error_report("Compression and preallocation not supported at "
856 "the same time");
857 ret = -1;
858 goto out;
859 }
efa84d43
KW
860 }
861
862 /* Create the new image */
863 ret = bdrv_create(drv, out_filename, param);
ea2384d3
FB
864 if (ret < 0) {
865 if (ret == -ENOTSUP) {
15654a6d
JS
866 error_report("Formatting not supported for file format '%s'",
867 out_fmt);
6e9ea0c0 868 } else if (ret == -EFBIG) {
15654a6d
JS
869 error_report("The image size is too large for file format '%s'",
870 out_fmt);
ea2384d3 871 } else {
15654a6d
JS
872 error_report("%s: error while converting %s: %s",
873 out_filename, out_fmt, strerror(-ret));
ea2384d3 874 }
c2abccec 875 goto out;
ea2384d3 876 }
3b46e624 877
661a0f71 878 flags = BDRV_O_RDWR;
c3993cdc 879 ret = bdrv_parse_cache_flags(cache, &flags);
661a0f71
FS
880 if (ret < 0) {
881 error_report("Invalid cache option: %s", cache);
882 return -1;
883 }
884
f9f552e8 885 out_bs = bdrv_new_open(out_filename, out_fmt, flags, true);
c2abccec
MK
886 if (!out_bs) {
887 ret = -1;
888 goto out;
889 }
ea2384d3 890
926c2d23
AZ
891 bs_i = 0;
892 bs_offset = 0;
893 bdrv_get_geometry(bs[0], &bs_sectors);
bb1c0597 894 buf = qemu_blockalign(out_bs, IO_BUF_SIZE);
926c2d23 895
eec77d9e 896 if (compress) {
c2abccec
MK
897 ret = bdrv_get_info(out_bs, &bdi);
898 if (ret < 0) {
15654a6d 899 error_report("could not get block driver info");
c2abccec
MK
900 goto out;
901 }
faea38e7 902 cluster_size = bdi.cluster_size;
c2abccec 903 if (cluster_size <= 0 || cluster_size > IO_BUF_SIZE) {
15654a6d 904 error_report("invalid cluster size");
c2abccec
MK
905 ret = -1;
906 goto out;
907 }
ea2384d3
FB
908 cluster_sectors = cluster_size >> 9;
909 sector_num = 0;
6b837bc4
JS
910
911 nb_sectors = total_sectors;
912 local_progress = (float)100 /
4ee96418 913 (nb_sectors / MIN(nb_sectors, cluster_sectors));
6b837bc4 914
ea2384d3 915 for(;;) {
926c2d23
AZ
916 int64_t bs_num;
917 int remainder;
918 uint8_t *buf2;
919
ea2384d3
FB
920 nb_sectors = total_sectors - sector_num;
921 if (nb_sectors <= 0)
922 break;
923 if (nb_sectors >= cluster_sectors)
924 n = cluster_sectors;
925 else
926 n = nb_sectors;
926c2d23
AZ
927
928 bs_num = sector_num - bs_offset;
929 assert (bs_num >= 0);
930 remainder = n;
931 buf2 = buf;
932 while (remainder > 0) {
933 int nlow;
934 while (bs_num == bs_sectors) {
935 bs_i++;
936 assert (bs_i < bs_n);
937 bs_offset += bs_sectors;
938 bdrv_get_geometry(bs[bs_i], &bs_sectors);
939 bs_num = 0;
0bfcd599
BS
940 /* printf("changing part: sector_num=%" PRId64 ", "
941 "bs_i=%d, bs_offset=%" PRId64 ", bs_sectors=%" PRId64
942 "\n", sector_num, bs_i, bs_offset, bs_sectors); */
926c2d23
AZ
943 }
944 assert (bs_num < bs_sectors);
945
946 nlow = (remainder > bs_sectors - bs_num) ? bs_sectors - bs_num : remainder;
947
c2abccec
MK
948 ret = bdrv_read(bs[bs_i], bs_num, buf2, nlow);
949 if (ret < 0) {
3fba9d81
SH
950 error_report("error while reading sector %" PRId64 ": %s",
951 bs_num, strerror(-ret));
c2abccec
MK
952 goto out;
953 }
926c2d23
AZ
954
955 buf2 += nlow * 512;
956 bs_num += nlow;
957
958 remainder -= nlow;
959 }
960 assert (remainder == 0);
961
b8fb60da 962 if (n < cluster_sectors) {
ea2384d3 963 memset(buf + n * 512, 0, cluster_size - n * 512);
b8fb60da 964 }
1a6d39fd 965 if (!buffer_is_zero(buf, cluster_size)) {
c2abccec
MK
966 ret = bdrv_write_compressed(out_bs, sector_num, buf,
967 cluster_sectors);
968 if (ret != 0) {
3fba9d81
SH
969 error_report("error while compressing sector %" PRId64
970 ": %s", sector_num, strerror(-ret));
c2abccec
MK
971 goto out;
972 }
ea2384d3
FB
973 }
974 sector_num += n;
6b837bc4 975 qemu_progress_print(local_progress, 100);
ea2384d3 976 }
faea38e7
FB
977 /* signal EOF to align */
978 bdrv_write_compressed(out_bs, 0, NULL, 0);
ea2384d3 979 } else {
f2feebbd
KW
980 int has_zero_init = bdrv_has_zero_init(out_bs);
981
f58c7b35 982 sector_num = 0; // total number of sectors converted so far
6b837bc4
JS
983 nb_sectors = total_sectors - sector_num;
984 local_progress = (float)100 /
4ee96418 985 (nb_sectors / MIN(nb_sectors, IO_BUF_SIZE / 512));
6b837bc4 986
ea2384d3
FB
987 for(;;) {
988 nb_sectors = total_sectors - sector_num;
b8fb60da 989 if (nb_sectors <= 0) {
ea2384d3 990 break;
b8fb60da
JS
991 }
992 if (nb_sectors >= (IO_BUF_SIZE / 512)) {
ea2384d3 993 n = (IO_BUF_SIZE / 512);
b8fb60da 994 } else {
ea2384d3 995 n = nb_sectors;
b8fb60da 996 }
926c2d23
AZ
997
998 while (sector_num - bs_offset >= bs_sectors) {
999 bs_i ++;
1000 assert (bs_i < bs_n);
1001 bs_offset += bs_sectors;
1002 bdrv_get_geometry(bs[bs_i], &bs_sectors);
0bfcd599
BS
1003 /* printf("changing part: sector_num=%" PRId64 ", bs_i=%d, "
1004 "bs_offset=%" PRId64 ", bs_sectors=%" PRId64 "\n",
926c2d23
AZ
1005 sector_num, bs_i, bs_offset, bs_sectors); */
1006 }
1007
b8fb60da 1008 if (n > bs_offset + bs_sectors - sector_num) {
926c2d23 1009 n = bs_offset + bs_sectors - sector_num;
b8fb60da 1010 }
926c2d23 1011
f2feebbd 1012 if (has_zero_init) {
d032044f
AS
1013 /* If the output image is being created as a copy on write image,
1014 assume that sectors which are unallocated in the input image
1015 are present in both the output's and input's base images (no
1016 need to copy them). */
1017 if (out_baseimg) {
1018 if (!bdrv_is_allocated(bs[bs_i], sector_num - bs_offset,
1019 n, &n1)) {
1020 sector_num += n1;
1021 continue;
1022 }
1023 /* The next 'n1' sectors are allocated in the input image. Copy
1024 only those as they may be followed by unallocated sectors. */
1025 n = n1;
93c65b47 1026 }
93c65b47
AL
1027 } else {
1028 n1 = n;
f58c7b35
TS
1029 }
1030
c2abccec
MK
1031 ret = bdrv_read(bs[bs_i], sector_num - bs_offset, buf, n);
1032 if (ret < 0) {
3fba9d81
SH
1033 error_report("error while reading sector %" PRId64 ": %s",
1034 sector_num - bs_offset, strerror(-ret));
c2abccec
MK
1035 goto out;
1036 }
ea2384d3
FB
1037 /* NOTE: at the same time we convert, we do not write zero
1038 sectors to have a chance to compress the image. Ideally, we
1039 should add a specific call to have the info to go faster */
1040 buf1 = buf;
1041 while (n > 0) {
f58c7b35
TS
1042 /* If the output image is being created as a copy on write image,
1043 copy all sectors even the ones containing only NUL bytes,
93c65b47
AL
1044 because they may differ from the sectors in the base image.
1045
1046 If the output is to a host device, we also write out
1047 sectors that are entirely 0, since whatever data was
1048 already there is garbage, not 0s. */
f2feebbd 1049 if (!has_zero_init || out_baseimg ||
a22f123c 1050 is_allocated_sectors_min(buf1, n, &n1, min_sparse)) {
c2abccec
MK
1051 ret = bdrv_write(out_bs, sector_num, buf1, n1);
1052 if (ret < 0) {
3fba9d81
SH
1053 error_report("error while writing sector %" PRId64
1054 ": %s", sector_num, strerror(-ret));
c2abccec
MK
1055 goto out;
1056 }
ea2384d3
FB
1057 }
1058 sector_num += n1;
1059 n -= n1;
1060 buf1 += n1 * 512;
1061 }
6b837bc4 1062 qemu_progress_print(local_progress, 100);
ea2384d3
FB
1063 }
1064 }
c2abccec 1065out:
6b837bc4 1066 qemu_progress_end();
c2abccec
MK
1067 free_option_parameters(create_options);
1068 free_option_parameters(param);
bb1c0597 1069 qemu_vfree(buf);
c2abccec
MK
1070 if (out_bs) {
1071 bdrv_delete(out_bs);
1072 }
31ca34b8
JS
1073 if (bs) {
1074 for (bs_i = 0; bs_i < bs_n; bs_i++) {
1075 if (bs[bs_i]) {
1076 bdrv_delete(bs[bs_i]);
1077 }
c2abccec 1078 }
7267c094 1079 g_free(bs);
c2abccec 1080 }
c2abccec
MK
1081 if (ret) {
1082 return 1;
1083 }
ea2384d3
FB
1084 return 0;
1085}
1086
57d1a2b6 1087
faea38e7
FB
1088static void dump_snapshots(BlockDriverState *bs)
1089{
1090 QEMUSnapshotInfo *sn_tab, *sn;
1091 int nb_sns, i;
1092 char buf[256];
1093
1094 nb_sns = bdrv_snapshot_list(bs, &sn_tab);
1095 if (nb_sns <= 0)
1096 return;
1097 printf("Snapshot list:\n");
1098 printf("%s\n", bdrv_snapshot_dump(buf, sizeof(buf), NULL));
1099 for(i = 0; i < nb_sns; i++) {
1100 sn = &sn_tab[i];
1101 printf("%s\n", bdrv_snapshot_dump(buf, sizeof(buf), sn));
1102 }
7267c094 1103 g_free(sn_tab);
faea38e7
FB
1104}
1105
ea2384d3
FB
1106static int img_info(int argc, char **argv)
1107{
1108 int c;
1109 const char *filename, *fmt;
ea2384d3 1110 BlockDriverState *bs;
f8d6bba1 1111 char size_buf[128], dsize_buf[128];
96b8f136
TS
1112 uint64_t total_sectors;
1113 int64_t allocated_size;
93b6b2a3
FB
1114 char backing_filename[1024];
1115 char backing_filename2[1024];
faea38e7 1116 BlockDriverInfo bdi;
ea2384d3
FB
1117
1118 fmt = NULL;
1119 for(;;) {
1120 c = getopt(argc, argv, "f:h");
b8fb60da 1121 if (c == -1) {
ea2384d3 1122 break;
b8fb60da 1123 }
ea2384d3 1124 switch(c) {
ef87394c 1125 case '?':
ea2384d3
FB
1126 case 'h':
1127 help();
1128 break;
1129 case 'f':
1130 fmt = optarg;
1131 break;
1132 }
1133 }
b8fb60da 1134 if (optind >= argc) {
ea2384d3 1135 help();
b8fb60da 1136 }
ea2384d3
FB
1137 filename = argv[optind++];
1138
f9f552e8 1139 bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_NO_BACKING, false);
c2abccec
MK
1140 if (!bs) {
1141 return 1;
1142 }
ea2384d3
FB
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",
f8d6bba1 1156 filename, bdrv_get_format_name(bs), 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 */
f9f552e8 1252 bs = bdrv_new_open(filename, NULL, bdrv_oflags, true);
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 */
f9f552e8 1370 bs = bdrv_new_open(filename, fmt, flags, true);
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;
20caf0f7
DXW
1571 QemuOpts *param;
1572 static QemuOptsList resize_options = {
1573 .name = "resize_options",
1574 .head = QTAILQ_HEAD_INITIALIZER(resize_options.head),
1575 .desc = {
1576 {
1577 .name = BLOCK_OPT_SIZE,
1578 .type = QEMU_OPT_SIZE,
1579 .help = "Virtual disk size"
1580 }, {
1581 /* end of list */
1582 }
ae6b0ed6 1583 },
ae6b0ed6
SH
1584 };
1585
e80fec7f
KW
1586 /* Remove size from argv manually so that negative numbers are not treated
1587 * as options by getopt. */
1588 if (argc < 3) {
1589 help();
1590 return 1;
1591 }
1592
1593 size = argv[--argc];
1594
1595 /* Parse getopt arguments */
ae6b0ed6
SH
1596 fmt = NULL;
1597 for(;;) {
1598 c = getopt(argc, argv, "f:h");
1599 if (c == -1) {
1600 break;
1601 }
1602 switch(c) {
ef87394c 1603 case '?':
ae6b0ed6
SH
1604 case 'h':
1605 help();
1606 break;
1607 case 'f':
1608 fmt = optarg;
1609 break;
1610 }
1611 }
e80fec7f 1612 if (optind >= argc) {
ae6b0ed6
SH
1613 help();
1614 }
1615 filename = argv[optind++];
ae6b0ed6
SH
1616
1617 /* Choose grow, shrink, or absolute resize mode */
1618 switch (size[0]) {
1619 case '+':
1620 relative = 1;
1621 size++;
1622 break;
1623 case '-':
1624 relative = -1;
1625 size++;
1626 break;
1627 default:
1628 relative = 0;
1629 break;
1630 }
1631
1632 /* Parse size */
20caf0f7
DXW
1633 param = qemu_opts_create(&resize_options, NULL, 0, NULL);
1634 if (qemu_opt_set(param, BLOCK_OPT_SIZE, size)) {
ae6b0ed6 1635 /* Error message already printed when size parsing fails */
2a81998a 1636 ret = -1;
20caf0f7 1637 qemu_opts_del(param);
2a81998a 1638 goto out;
ae6b0ed6 1639 }
20caf0f7
DXW
1640 n = qemu_opt_get_size(param, BLOCK_OPT_SIZE, 0);
1641 qemu_opts_del(param);
ae6b0ed6 1642
f9f552e8 1643 bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_RDWR, true);
c2abccec 1644 if (!bs) {
2a81998a
JS
1645 ret = -1;
1646 goto out;
c2abccec 1647 }
ae6b0ed6
SH
1648
1649 if (relative) {
1650 total_size = bdrv_getlength(bs) + n * relative;
1651 } else {
1652 total_size = n;
1653 }
1654 if (total_size <= 0) {
15654a6d 1655 error_report("New image size must be positive");
c2abccec
MK
1656 ret = -1;
1657 goto out;
ae6b0ed6
SH
1658 }
1659
1660 ret = bdrv_truncate(bs, total_size);
1661 switch (ret) {
1662 case 0:
1663 printf("Image resized.\n");
1664 break;
1665 case -ENOTSUP:
259b2173 1666 error_report("This image does not support resize");
ae6b0ed6
SH
1667 break;
1668 case -EACCES:
15654a6d 1669 error_report("Image is read-only");
ae6b0ed6
SH
1670 break;
1671 default:
15654a6d 1672 error_report("Error resizing image (%d)", -ret);
ae6b0ed6
SH
1673 break;
1674 }
c2abccec 1675out:
2a81998a
JS
1676 if (bs) {
1677 bdrv_delete(bs);
1678 }
c2abccec
MK
1679 if (ret) {
1680 return 1;
1681 }
ae6b0ed6
SH
1682 return 0;
1683}
1684
c227f099 1685static const img_cmd_t img_cmds[] = {
153859be
SB
1686#define DEF(option, callback, arg_string) \
1687 { option, callback },
1688#include "qemu-img-cmds.h"
1689#undef DEF
1690#undef GEN_DOCS
1691 { NULL, NULL, },
1692};
1693
ea2384d3
FB
1694int main(int argc, char **argv)
1695{
c227f099 1696 const img_cmd_t *cmd;
153859be 1697 const char *cmdname;
ea2384d3 1698
53f76e58
KW
1699 error_set_progname(argv[0]);
1700
ea2384d3
FB
1701 bdrv_init();
1702 if (argc < 2)
1703 help();
153859be 1704 cmdname = argv[1];
8f9b157e 1705 argc--; argv++;
153859be 1706
67d384e8
ZYW
1707 qemu_init_main_loop();
1708
153859be
SB
1709 /* find the command */
1710 for(cmd = img_cmds; cmd->name != NULL; cmd++) {
1711 if (!strcmp(cmdname, cmd->name)) {
1712 return cmd->handler(argc, argv);
1713 }
ea2384d3 1714 }
153859be
SB
1715
1716 /* not found */
1717 help();
ea2384d3
FB
1718 return 0;
1719}