Message ID | 1397771992-31126-9-git-send-email-mreitz@redhat.com |
---|---|
State | New |
Headers | show |
On 04/17/2014 03:59 PM, Max Reitz wrote: > 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 | 24 ++++++++++++++++++++++-- > qemu-img.texi | 2 +- > 3 files changed, 25 insertions(+), 5 deletions(-) > > + > + /* A block job may finish instantanously without publishing any progress, s/instantanously/instantaneously/ > @@ -733,7 +739,7 @@ static int img_commit(int argc, char **argv) > fmt = NULL; > cache = BDRV_DEFAULT_CACHE; > for(;;) { > - c = getopt(argc, argv, "f:ht:q"); > + c = getopt(argc, argv, "f:ht:qp"); Here, 'p' is last,... > if (c == -1) { > break; > } > @@ -748,11 +754,20 @@ static int img_commit(int argc, char **argv) > case 't': > cache = optarg; > break; > + case 'p': > + progress = true; > + break; > case 'q': ...but here, 'q' is last. The OCD side of me likes to list getopt() arguments in the same order as the case statements in order to more easily map the two to each other and ensure we aren't missing anything (the truly OCD person insists on sorting things alphabetically, or at least case-insensitively). As order doesn't actually matter to the compiler, it doesn't invalidate this patch; but something to consider if you respin for other reasons. :)
On 22.04.2014 17:23, Eric Blake wrote: > On 04/17/2014 03:59 PM, Max Reitz wrote: >> 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 | 24 ++++++++++++++++++++++-- >> qemu-img.texi | 2 +- >> 3 files changed, 25 insertions(+), 5 deletions(-) >> >> + >> + /* A block job may finish instantanously without publishing any progress, > s/instantanously/instantaneously/ When I looked it up I wrote it correctly. *g* >> @@ -733,7 +739,7 @@ static int img_commit(int argc, char **argv) >> fmt = NULL; >> cache = BDRV_DEFAULT_CACHE; >> for(;;) { >> - c = getopt(argc, argv, "f:ht:q"); >> + c = getopt(argc, argv, "f:ht:qp"); > Here, 'p' is last,... > >> if (c == -1) { >> break; >> } >> @@ -748,11 +754,20 @@ static int img_commit(int argc, char **argv) >> case 't': >> cache = optarg; >> break; >> + case 'p': >> + progress = true; >> + break; >> case 'q': > ...but here, 'q' is last. The OCD side of me likes to list getopt() > arguments in the same order as the case statements in order to more > easily map the two to each other and ensure we aren't missing anything > (the truly OCD person insists on sorting things alphabetically, or at > least case-insensitively). As order doesn't actually matter to the > compiler, it doesn't invalidate this patch; but something to consider if > you respin for other reasons. :) I'll put p in front of q in getopt, as that is the smaller change. On the other hand, I guess I should consider keeping my code OCD hostile, so people will have a longer and closer look at it. *g* Max
diff --git a/qemu-img-cmds.hx b/qemu-img-cmds.hx index d029609..8bc55cd 100644 --- a/qemu-img-cmds.hx +++ b/qemu-img-cmds.hx @@ -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, diff --git a/qemu-img.c b/qemu-img.c index 42616da..0d65fed 100644 --- a/qemu-img.c +++ b/qemu-img.c @@ -710,12 +710,18 @@ static void run_block_job(BlockJob *job, Error **errp) do { qemu_aio_wait(); + qemu_progress_print((float)job->offset / job->len * 100.f, 0); + if (!job->busy && !job->ready) { block_job_resume(job); } } while (!job->ready); block_job_complete_sync(job, errp); + + /* A block job may finish instantanously without publishing any progress, + * so just signal completion here */ + qemu_progress_print(100.f, 0); } static int img_commit(int argc, char **argv) @@ -723,7 +729,7 @@ static int img_commit(int argc, char **argv) int c, ret, flags; const char *filename, *fmt, *cache; BlockDriverState *bs, *base_bs, *backing_bs; - bool quiet = false; + bool progress = false, quiet = false; Error *local_err = NULL; CommonBlockJobCBInfo cbi; BackingList *bl_element, *bl_next; @@ -733,7 +739,7 @@ static int img_commit(int argc, char **argv) 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; } @@ -748,11 +754,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(); } @@ -770,6 +785,9 @@ static int img_commit(int argc, char **argv) return 1; } + 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 * backing chain (i.e., the very base); however, the traditional behavior of * qemu-img commit is using the immediate backing file. */ @@ -866,6 +884,8 @@ free_backing_list: } done: + qemu_progress_end(); + bdrv_unref(bs); if (local_err) { diff --git a/qemu-img.texi b/qemu-img.texi index f84590e..1a9c08f 100644 --- a/qemu-img.texi +++ b/qemu-img.texi @@ -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 | 24 ++++++++++++++++++++++-- qemu-img.texi | 2 +- 3 files changed, 25 insertions(+), 5 deletions(-)