Procházet zdrojové kódy

qemu-img: Allow cache mode specification for amend

qemu-img amend may extensively modify the target image, depending on the
options to be amended (e.g. conversion to qcow2 compat level 0.10 from
1.1 for an image with many unallocated zero clusters). Therefore it
makes sense to allow the user to specify the cache mode to be used.

Signed-off-by: Max Reitz <mreitz@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Max Reitz před 11 roky
rodič
revize
bd39e6ed0b
3 změnil soubory, kde provedl 18 přidání a 7 odebrání
  1. 2 2
      qemu-img-cmds.hx
  2. 15 4
      qemu-img.c
  3. 1 1
      qemu-img.texi

+ 2 - 2
qemu-img-cmds.hx

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

+ 15 - 4
qemu-img.c

@@ -2778,12 +2778,14 @@ static int img_amend(int argc, char **argv)
     char *options = NULL;
     char *options = NULL;
     QemuOptsList *create_opts = NULL;
     QemuOptsList *create_opts = NULL;
     QemuOpts *opts = NULL;
     QemuOpts *opts = NULL;
-    const char *fmt = NULL, *filename;
+    const char *fmt = NULL, *filename, *cache;
+    int flags;
     bool quiet = false;
     bool quiet = false;
     BlockDriverState *bs = NULL;
     BlockDriverState *bs = NULL;
 
 
+    cache = BDRV_DEFAULT_CACHE;
     for (;;) {
     for (;;) {
-        c = getopt(argc, argv, "hqf:o:");
+        c = getopt(argc, argv, "ho:f:t:q");
         if (c == -1) {
         if (c == -1) {
             break;
             break;
         }
         }
@@ -2810,6 +2812,9 @@ static int img_amend(int argc, char **argv)
             case 'f':
             case 'f':
                 fmt = optarg;
                 fmt = optarg;
                 break;
                 break;
+            case 't':
+                cache = optarg;
+                break;
             case 'q':
             case 'q':
                 quiet = true;
                 quiet = true;
                 break;
                 break;
@@ -2832,8 +2837,14 @@ static int img_amend(int argc, char **argv)
         error_exit("Expecting one image file name");
         error_exit("Expecting one image file name");
     }
     }
 
 
-    bs = bdrv_new_open("image", filename, fmt,
-                       BDRV_O_FLAGS | BDRV_O_RDWR, true, quiet);
+    flags = BDRV_O_FLAGS | BDRV_O_RDWR;
+    ret = bdrv_parse_cache_flags(cache, &flags);
+    if (ret < 0) {
+        error_report("Invalid cache option: %s", cache);
+        goto out;
+    }
+
+    bs = bdrv_new_open("image", filename, fmt, flags, true, quiet);
     if (!bs) {
     if (!bs) {
         error_report("Could not open image '%s'", filename);
         error_report("Could not open image '%s'", filename);
         ret = -1;
         ret = -1;

+ 1 - 1
qemu-img.texi

@@ -397,7 +397,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}] -o @var{options} @var{filename}
+@item amend [-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.