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