@@ -22,9 +22,9 @@ STEXI
ETEXI
DEF("commit", img_commit,
- "commit [-q] [-f fmt] [-t cache] filename")
+ "commit [-q] [-f fmt] [-t cache] [-p] filename")
STEXI
-@item commit [-q] [-f @var{fmt}] [-t @var{cache}] @var{filename}
+@item commit [-q] [-f @var{fmt}] [-t @var{cache}] [-p] @var{filename}
ETEXI
DEF("compare", img_compare,
@@ -690,12 +690,27 @@ static void dummy_block_job_cb(void *opaque, int ret)
static void run_block_job(BlockJob *job, Error **errp)
{
BlockJobInfo *info;
+ uint64_t mod_offset = 0;
do {
aio_poll(qemu_get_aio_context(), true);
info = block_job_query(job);
+ if (info->offset) {
+ if (!mod_offset) {
+ /* Some block jobs (at least "commit") will only work on a
+ * subset of the image file and therefore basically skip many
+ * sectors at the start (processing them apparently
+ * instantaneously). These sectors should be ignored when
+ * calculating the progress. */
+ mod_offset = info->offset;
+ }
+
+ qemu_progress_print((float)(info->offset - mod_offset) /
+ (info->len - mod_offset) * 100.f, 0);
+ }
+
if (!info->busy && info->offset < info->len) {
block_job_resume(job);
}
@@ -712,13 +727,13 @@ static int img_commit(int argc, char **argv)
int c, ret, flags;
const char *filename, *fmt, *cache;
BlockDriverState *bs, *base_bs;
- bool quiet = false;
+ bool progress = false, quiet = false;
Error *local_err = NULL;
fmt = NULL;
cache = BDRV_DEFAULT_CACHE;
for(;;) {
- c = getopt(argc, argv, "f:ht:q");
+ c = getopt(argc, argv, "f:ht:qp");
if (c == -1) {
break;
}
@@ -733,12 +748,20 @@ static int img_commit(int argc, char **argv)
case 't':
cache = optarg;
break;
+ case 'p':
+ progress = true;
+ break;
case 'q':
quiet = true;
break;
}
}
+ /* Progress is not shown in Quiet mode */
+ if (quiet) {
+ progress = false;
+ }
+
if (optind != argc - 1) {
help();
}
@@ -756,6 +779,9 @@ static int img_commit(int argc, char **argv)
return 1;
}
+ qemu_progress_init(progress, 1.f);
+ qemu_progress_print(0.f, 100);
+
base_bs = bdrv_find_base(bs);
if (!base_bs) {
error_set(&local_err, QERR_BASE_NOT_FOUND, "NULL");
@@ -772,6 +798,8 @@ static int img_commit(int argc, char **argv)
run_block_job(bs->job, &local_err);
done:
+ qemu_progress_end();
+
bdrv_unref(bs);
if (error_is_set(&local_err)) {
@@ -140,7 +140,7 @@ this case. @var{backing_file} will never be modified unless you use the
The size can also be specified using the @var{size} option with @code{-o},
it doesn't need to be specified separately in this case.
-@item commit [-f @var{fmt}] [-t @var{cache}] @var{filename}
+@item commit [-q] [-f @var{fmt}] [-t @var{cache}] [-p] @var{filename}
Commit the changes recorded in @var{filename} in its base image or backing file.
If the backing file is smaller than the snapshot, then the backing file will be
Implement progress output for the commit command by querying the progress of the block job. Signed-off-by: Max Reitz <mreitz@redhat.com> --- qemu-img-cmds.hx | 4 ++-- qemu-img.c | 32 ++++++++++++++++++++++++++++++-- qemu-img.texi | 2 +- 3 files changed, 33 insertions(+), 5 deletions(-)