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