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