qemu-img: Add progress output for amend

Now that bdrv_amend_options() supports a status callback, use it to
display a progress report.

Signed-off-by: Max Reitz <mreitz@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Benoît Canet <benoit.canet@nodalink.com>
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
Message-id: 1414404776-4919-3-git-send-email-mreitz@redhat.com
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
Max Reitz 2014-10-27 11:12:51 +01:00 committed by Stefan Hajnoczi
parent 7748543420
commit 76a3a34dce
3 changed files with 25 additions and 6 deletions

View file

@ -70,8 +70,8 @@ STEXI
ETEXI ETEXI
DEF("amend", img_amend, DEF("amend", img_amend,
"amend [-q] [-f fmt] [-t cache] -o options filename") "amend [-p] [-q] [-f fmt] [-t cache] -o options filename")
STEXI STEXI
@item amend [-q] [-f @var{fmt}] [-t @var{cache}] -o @var{options} @var{filename} @item amend [-p] [-q] [-f @var{fmt}] [-t @var{cache}] -o @var{options} @var{filename}
@end table @end table
ETEXI ETEXI

View file

@ -2871,6 +2871,12 @@ out:
return 0; return 0;
} }
static void amend_status_cb(BlockDriverState *bs,
int64_t offset, int64_t total_work_size)
{
qemu_progress_print(100.f * offset / total_work_size, 0);
}
static int img_amend(int argc, char **argv) static int img_amend(int argc, char **argv)
{ {
int c, ret = 0; int c, ret = 0;
@ -2879,13 +2885,13 @@ static int img_amend(int argc, char **argv)
QemuOpts *opts = NULL; QemuOpts *opts = NULL;
const char *fmt = NULL, *filename, *cache; const char *fmt = NULL, *filename, *cache;
int flags; int flags;
bool quiet = false; bool quiet = false, progress = false;
BlockBackend *blk = NULL; BlockBackend *blk = NULL;
BlockDriverState *bs = NULL; BlockDriverState *bs = NULL;
cache = BDRV_DEFAULT_CACHE; cache = BDRV_DEFAULT_CACHE;
for (;;) { for (;;) {
c = getopt(argc, argv, "ho:f:t:q"); c = getopt(argc, argv, "ho:f:t:pq");
if (c == -1) { if (c == -1) {
break; break;
} }
@ -2915,6 +2921,9 @@ static int img_amend(int argc, char **argv)
case 't': case 't':
cache = optarg; cache = optarg;
break; break;
case 'p':
progress = true;
break;
case 'q': case 'q':
quiet = true; quiet = true;
break; break;
@ -2925,6 +2934,11 @@ static int img_amend(int argc, char **argv)
error_exit("Must specify options (-o)"); error_exit("Must specify options (-o)");
} }
if (quiet) {
progress = false;
}
qemu_progress_init(progress, 1.0);
filename = (optind == argc - 1) ? argv[argc - 1] : NULL; filename = (optind == argc - 1) ? argv[argc - 1] : NULL;
if (fmt && has_help_option(options)) { if (fmt && has_help_option(options)) {
/* If a format is explicitly specified (and possibly no filename is /* If a format is explicitly specified (and possibly no filename is
@ -2968,13 +2982,18 @@ static int img_amend(int argc, char **argv)
goto out; goto out;
} }
ret = bdrv_amend_options(bs, opts, NULL); /* In case the driver does not call amend_status_cb() */
qemu_progress_print(0.f, 0);
ret = bdrv_amend_options(bs, opts, &amend_status_cb);
qemu_progress_print(100.f, 0);
if (ret < 0) { if (ret < 0) {
error_report("Error while amending options: %s", strerror(-ret)); error_report("Error while amending options: %s", strerror(-ret));
goto out; goto out;
} }
out: out:
qemu_progress_end();
blk_unref(blk); blk_unref(blk);
qemu_opts_del(opts); qemu_opts_del(opts);
qemu_opts_free(create_opts); qemu_opts_free(create_opts);

View file

@ -412,7 +412,7 @@ After using this command to grow a disk image, you must use file system and
partitioning tools inside the VM to actually begin using the new space on the partitioning tools inside the VM to actually begin using the new space on the
device. device.
@item amend [-f @var{fmt}] [-t @var{cache}] -o @var{options} @var{filename} @item amend [-p] [-f @var{fmt}] [-t @var{cache}] -o @var{options} @var{filename}
Amends the image format specific @var{options} for the image file Amends the image format specific @var{options} for the image file
@var{filename}. Not all file formats support this operation. @var{filename}. Not all file formats support this operation.