Browse Source

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>
Max Reitz 10 years ago
parent
commit
687fa1d830
3 changed files with 24 additions and 5 deletions
  1. 2 2
      qemu-img-cmds.hx
  2. 21 2
      qemu-img.c
  3. 1 1
      qemu-img.texi

+ 2 - 2
qemu-img-cmds.hx

@@ -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,

+ 21 - 2
qemu-img.c

@@ -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) {

+ 1 - 1
qemu-img.texi

@@ -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