qemu-img: Enable progress output for commit

Implement progress output for the commit command by querying the
progress of the block job.

Signed-off-by: Max Reitz <mreitz@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
Message-id: 1414159063-25977-11-git-send-email-mreitz@redhat.com
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
Max Reitz 2014-10-24 15:57:39 +02:00 committed by Stefan Hajnoczi
parent 9a86fe4895
commit 687fa1d830
3 changed files with 24 additions and 5 deletions

View File

@ -22,9 +22,9 @@ STEXI
ETEXI ETEXI
DEF("commit", img_commit, DEF("commit", img_commit,
"commit [-q] [-f fmt] [-t cache] [-d] filename") "commit [-q] [-f fmt] [-t cache] [-d] [-p] filename")
STEXI STEXI
@item commit [-q] [-f @var{fmt}] [-t @var{cache}] [-d] @var{filename} @item commit [-q] [-f @var{fmt}] [-t @var{cache}] [-d] [-p] @var{filename}
ETEXI ETEXI
DEF("compare", img_compare, DEF("compare", img_compare,

View File

@ -746,9 +746,14 @@ static void run_block_job(BlockJob *job, Error **errp)
do { do {
aio_poll(aio_context, true); aio_poll(aio_context, true);
qemu_progress_print((float)job->offset / job->len * 100.f, 0);
} while (!job->ready); } while (!job->ready);
block_job_complete_sync(job, errp); block_job_complete_sync(job, errp);
/* A block job may finish instantaneously without publishing any progress,
* so just signal completion here */
qemu_progress_print(100.f, 0);
} }
static int img_commit(int argc, char **argv) static int img_commit(int argc, char **argv)
@ -757,14 +762,14 @@ static int img_commit(int argc, char **argv)
const char *filename, *fmt, *cache; const char *filename, *fmt, *cache;
BlockBackend *blk; BlockBackend *blk;
BlockDriverState *bs, *base_bs; BlockDriverState *bs, *base_bs;
bool quiet = false, drop = false; bool progress = false, quiet = false, drop = false;
Error *local_err = NULL; Error *local_err = NULL;
CommonBlockJobCBInfo cbi; CommonBlockJobCBInfo cbi;
fmt = NULL; fmt = NULL;
cache = BDRV_DEFAULT_CACHE; cache = BDRV_DEFAULT_CACHE;
for(;;) { for(;;) {
c = getopt(argc, argv, "f:ht:dq"); c = getopt(argc, argv, "f:ht:dpq");
if (c == -1) { if (c == -1) {
break; break;
} }
@ -782,11 +787,20 @@ static int img_commit(int argc, char **argv)
case 'd': case 'd':
drop = true; drop = true;
break; break;
case 'p':
progress = true;
break;
case 'q': case 'q':
quiet = true; quiet = true;
break; break;
} }
} }
/* Progress is not shown in Quiet mode */
if (quiet) {
progress = false;
}
if (optind != argc - 1) { if (optind != argc - 1) {
error_exit("Expecting one image file name"); error_exit("Expecting one image file name");
} }
@ -805,6 +819,9 @@ static int img_commit(int argc, char **argv)
} }
bs = blk_bs(blk); bs = blk_bs(blk);
qemu_progress_init(progress, 1.f);
qemu_progress_print(0.f, 100);
/* This is different from QMP, which by default uses the deepest file in the /* This is different from QMP, which by default uses the deepest file in the
* backing chain (i.e., the very base); however, the traditional behavior of * backing chain (i.e., the very base); however, the traditional behavior of
* qemu-img commit is using the immediate backing file. */ * qemu-img commit is using the immediate backing file. */
@ -853,6 +870,8 @@ unref_backing:
} }
done: done:
qemu_progress_end();
blk_unref(blk); blk_unref(blk);
if (local_err) { if (local_err) {

View File

@ -167,7 +167,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}, 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. it doesn't need to be specified separately in this case.
@item commit [-f @var{fmt}] [-t @var{cache}] [-d] @var{filename} @item commit [-q] [-f @var{fmt}] [-t @var{cache}] [-d] [-p] @var{filename}
Commit the changes recorded in @var{filename} in its base image or backing file. 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 If the backing file is smaller than the snapshot, then the backing file will be