All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH] snapshot subcommand for qemu-img
@ 2008-12-08 15:04 Kevin Wolf
  2008-12-11 21:09 ` Anthony Liguori
  0 siblings, 1 reply; 3+ messages in thread
From: Kevin Wolf @ 2008-12-08 15:04 UTC (permalink / raw)
  To: qemu-devel

[-- Attachment #1: Type: text/plain, Size: 153 bytes --]

Add snapshot subcommand to qemu-img which allows to list, create, apply
and delete snapshots on qcow2 images.

Signed-off-by: Kevin Wolf <kwolf@suse.de>

[-- Attachment #2: qemu-img-snapshots.patch --]
[-- Type: text/x-patch, Size: 4730 bytes --]

Index: qemu-svn/qemu-img.c
===================================================================
--- qemu-svn.orig/qemu-img.c
+++ qemu-svn/qemu-img.c
@@ -60,6 +60,7 @@ static void help(void)
            "  commit [-f fmt] filename\n"
            "  convert [-c] [-e] [-6] [-f fmt] [-O output_fmt] [-B output_base_image] filename [filename2 [...]] output_filename\n"
            "  info [-f fmt] filename\n"
+           "  snapshot [-l|-a snapshot|-c snapshot|-d snapshot] filename\n"
            "\n"
            "Command parameters:\n"
            "  'filename' is a disk image filename\n"
@@ -77,6 +78,13 @@ static void help(void)
            "  '-c' indicates that target image must be compressed (qcow format only)\n"
            "  '-e' indicates that the target image must be encrypted (qcow format only)\n"
            "  '-6' indicates that the target image must use compatibility level 6 (vmdk format only)\n"
+           "\n"
+           "  Parameters to snapshot subcommand:\n"
+           "    'snapshot' is the name of the snapshot to create, apply or delete\n"
+           "    '-a' applies a snapshot (revert disk to saved state)\n"
+           "    '-c' creates a snapshot\n"
+           "    '-d' deletes a snapshot\n"
+           "    '-l' lists all snapshots in the given image\n"
            );
     printf("\nSupported format:");
     bdrv_iterate_format(format_print, NULL);
@@ -732,6 +740,124 @@ static int img_info(int argc, char **arg
     return 0;
 }
 
+#define SNAPSHOT_LIST   1
+#define SNAPSHOT_CREATE 2
+#define SNAPSHOT_APPLY  3
+#define SNAPSHOT_DELETE 4
+
+static void img_snapshot(int argc, char **argv)
+{
+    BlockDriverState *bs;
+    QEMUSnapshotInfo sn;
+    char *filename, *snapshot_name = NULL;
+    char c;
+    int ret;
+    int action = 0;
+#ifdef _WIN32
+    struct _timeb tb;
+#else
+    struct timeval tv;
+#endif
+
+    /* Parse commandline parameters */
+    for(;;) {
+        c = getopt(argc, argv, "la:c:d:h");
+        if (c == -1)
+            break;
+        switch(c) {
+        case 'h':
+            help();
+            return;
+        case 'l':
+            if (action) {
+                help();
+                return;
+            }
+            action = SNAPSHOT_LIST;
+            break;
+        case 'a':
+            if (action) {
+                help();
+                return;
+            }
+            action = SNAPSHOT_APPLY;
+            snapshot_name = optarg;
+            break;
+        case 'c':
+            if (action) {
+                help();
+                return;
+            }
+            action = SNAPSHOT_CREATE;
+            snapshot_name = optarg;
+            break;
+        case 'd':
+            if (action) {
+                help();
+                return;
+            }
+            action = SNAPSHOT_DELETE;
+            snapshot_name = optarg;
+            break;
+        }
+    }
+
+    if (optind >= argc)
+        help();
+    filename = argv[optind++];
+
+    /* Open the image */
+    bs = bdrv_new("");
+    if (!bs)
+        error("Not enough memory");
+
+    if (bdrv_open2(bs, filename, 0, NULL) < 0) {
+        error("Could not open '%s'", filename);
+    }
+
+    /* Perform the requested action */
+    switch(action) {
+    case SNAPSHOT_LIST:
+        dump_snapshots(bs);
+        break;
+
+    case SNAPSHOT_CREATE:
+        memset(&sn, 0, sizeof(sn));
+        pstrcpy(sn.name, sizeof(sn.name), snapshot_name);
+#ifdef _WIN32
+        _ftime(&tb);
+        sn.date_sec = tb.time;
+        sn.date_nsec = tb.millitm * 1000000;
+#else
+        gettimeofday(&tv, NULL);
+        sn.date_sec = tv.tv_sec;
+        sn.date_nsec = tv.tv_usec * 1000;
+#endif
+        ret = bdrv_snapshot_create(bs, &sn);
+        if (ret)
+            error("Could not create snapshot '%s': %d (%s)",
+                snapshot_name, ret, strerror(-ret));
+        break;
+
+    case SNAPSHOT_APPLY:
+        ret = bdrv_snapshot_goto(bs, snapshot_name);
+        if (ret)
+            error("Could not apply snapshot '%s': %d (%s)",
+                snapshot_name, ret, strerror(-ret));
+        break;
+
+    case SNAPSHOT_DELETE:
+        ret = bdrv_snapshot_delete(bs, snapshot_name);
+        if (ret)
+            error("Could not delete snapshot '%s': %d (%s)",
+                snapshot_name, ret, strerror(-ret));
+        break;
+    }
+
+    /* Cleanup */
+    bdrv_delete(bs);
+}
+
 int main(int argc, char **argv)
 {
     const char *cmd;
@@ -749,6 +875,8 @@ int main(int argc, char **argv)
         img_convert(argc, argv);
     } else if (!strcmp(cmd, "info")) {
         img_info(argc, argv);
+    } else if (!strcmp(cmd, "snapshot")) {
+        img_snapshot(argc, argv);
     } else {
         help();
     }

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [Qemu-devel] [PATCH] snapshot subcommand for qemu-img
  2008-12-08 15:04 [Qemu-devel] [PATCH] snapshot subcommand for qemu-img Kevin Wolf
@ 2008-12-11 21:09 ` Anthony Liguori
  2008-12-15 13:55   ` [Qemu-devel] [PATCH] snapshot subcommand for qemu-img (v2) Kevin Wolf
  0 siblings, 1 reply; 3+ messages in thread
From: Anthony Liguori @ 2008-12-11 21:09 UTC (permalink / raw)
  To: qemu-devel

Kevin Wolf wrote:
> Add snapshot subcommand to qemu-img which allows to list, create, apply
> and delete snapshots on qcow2 images.
>
> Signed-off-by: Kevin Wolf <kwolf@suse.de>
>   

This introduces a warning that gettimeofday is implicit.  You can avoid 
the #ifdef _WIN32 by just using qemu_gettimeofday from osdep.h and also 
avoid the warning in the process.

Regards,

Anthony Liguori

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [Qemu-devel] [PATCH] snapshot subcommand for qemu-img (v2)
  2008-12-11 21:09 ` Anthony Liguori
@ 2008-12-15 13:55   ` Kevin Wolf
  0 siblings, 0 replies; 3+ messages in thread
From: Kevin Wolf @ 2008-12-15 13:55 UTC (permalink / raw)
  To: qemu-devel

[-- Attachment #1: Type: text/plain, Size: 758 bytes --]

Anthony Liguori schrieb:
> Kevin Wolf wrote:
>> Add snapshot subcommand to qemu-img which allows to list, create, apply
>> and delete snapshots on qcow2 images.
>>
>> Signed-off-by: Kevin Wolf <kwolf@suse.de>
>>   
> 
> This introduces a warning that gettimeofday is implicit.  You can avoid
> the #ifdef _WIN32 by just using qemu_gettimeofday from osdep.h and also
> avoid the warning in the process.

Oops, I should have noticed the warning. For the #ifdef, I've taken that
code directly from savevm.c. Maybe it would be a good idea to change it
to qemu_gettimeofday there, too? Anyway, next attempt:


Add snapshot subcommand to qemu-img which allows to list, create, apply
and delete snapshots on qcow2 images.

Signed-off-by: Kevin Wolf <kwolf@suse.de>

[-- Attachment #2: qemu-img-snapshots.patch --]
[-- Type: text/x-patch, Size: 4996 bytes --]

Index: qemu-svn/qemu-img.c
===================================================================
--- qemu-svn.orig/qemu-img.c
+++ qemu-svn/qemu-img.c
@@ -22,6 +22,7 @@
  * THE SOFTWARE.
  */
 #include "qemu-common.h"
+#include "osdep.h"
 #include "block_int.h"
 #include <assert.h>
 
@@ -60,6 +61,7 @@ static void help(void)
            "  commit [-f fmt] filename\n"
            "  convert [-c] [-e] [-6] [-f fmt] [-O output_fmt] [-B output_base_image] filename [filename2 [...]] output_filename\n"
            "  info [-f fmt] filename\n"
+           "  snapshot [-l|-a snapshot|-c snapshot|-d snapshot] filename\n"
            "\n"
            "Command parameters:\n"
            "  'filename' is a disk image filename\n"
@@ -77,6 +79,13 @@ static void help(void)
            "  '-c' indicates that target image must be compressed (qcow format only)\n"
            "  '-e' indicates that the target image must be encrypted (qcow format only)\n"
            "  '-6' indicates that the target image must use compatibility level 6 (vmdk format only)\n"
+           "\n"
+           "  Parameters to snapshot subcommand:\n"
+           "    'snapshot' is the name of the snapshot to create, apply or delete\n"
+           "    '-a' applies a snapshot (revert disk to saved state)\n"
+           "    '-c' creates a snapshot\n"
+           "    '-d' deletes a snapshot\n"
+           "    '-l' lists all snapshots in the given image\n"
            );
     printf("\nSupported format:");
     bdrv_iterate_format(format_print, NULL);
@@ -732,6 +741,116 @@ static int img_info(int argc, char **arg
     return 0;
 }
 
+#define SNAPSHOT_LIST   1
+#define SNAPSHOT_CREATE 2
+#define SNAPSHOT_APPLY  3
+#define SNAPSHOT_DELETE 4
+
+static void img_snapshot(int argc, char **argv)
+{
+    BlockDriverState *bs;
+    QEMUSnapshotInfo sn;
+    char *filename, *snapshot_name = NULL;
+    char c;
+    int ret;
+    int action = 0;
+    qemu_timeval tv;
+
+    /* Parse commandline parameters */
+    for(;;) {
+        c = getopt(argc, argv, "la:c:d:h");
+        if (c == -1)
+            break;
+        switch(c) {
+        case 'h':
+            help();
+            return;
+        case 'l':
+            if (action) {
+                help();
+                return;
+            }
+            action = SNAPSHOT_LIST;
+            break;
+        case 'a':
+            if (action) {
+                help();
+                return;
+            }
+            action = SNAPSHOT_APPLY;
+            snapshot_name = optarg;
+            break;
+        case 'c':
+            if (action) {
+                help();
+                return;
+            }
+            action = SNAPSHOT_CREATE;
+            snapshot_name = optarg;
+            break;
+        case 'd':
+            if (action) {
+                help();
+                return;
+            }
+            action = SNAPSHOT_DELETE;
+            snapshot_name = optarg;
+            break;
+        }
+    }
+
+    if (optind >= argc)
+        help();
+    filename = argv[optind++];
+
+    /* Open the image */
+    bs = bdrv_new("");
+    if (!bs)
+        error("Not enough memory");
+
+    if (bdrv_open2(bs, filename, 0, NULL) < 0) {
+        error("Could not open '%s'", filename);
+    }
+
+    /* Perform the requested action */
+    switch(action) {
+    case SNAPSHOT_LIST:
+        dump_snapshots(bs);
+        break;
+
+    case SNAPSHOT_CREATE:
+        memset(&sn, 0, sizeof(sn));
+        pstrcpy(sn.name, sizeof(sn.name), snapshot_name);
+
+        qemu_gettimeofday(&tv);
+        sn.date_sec = tv.tv_sec;
+        sn.date_nsec = tv.tv_usec * 1000;
+
+        ret = bdrv_snapshot_create(bs, &sn);
+        if (ret)
+            error("Could not create snapshot '%s': %d (%s)",
+                snapshot_name, ret, strerror(-ret));
+        break;
+
+    case SNAPSHOT_APPLY:
+        ret = bdrv_snapshot_goto(bs, snapshot_name);
+        if (ret)
+            error("Could not apply snapshot '%s': %d (%s)",
+                snapshot_name, ret, strerror(-ret));
+        break;
+
+    case SNAPSHOT_DELETE:
+        ret = bdrv_snapshot_delete(bs, snapshot_name);
+        if (ret)
+            error("Could not delete snapshot '%s': %d (%s)",
+                snapshot_name, ret, strerror(-ret));
+        break;
+    }
+
+    /* Cleanup */
+    bdrv_delete(bs);
+}
+
 int main(int argc, char **argv)
 {
     const char *cmd;
@@ -749,6 +868,8 @@ int main(int argc, char **argv)
         img_convert(argc, argv);
     } else if (!strcmp(cmd, "info")) {
         img_info(argc, argv);
+    } else if (!strcmp(cmd, "snapshot")) {
+        img_snapshot(argc, argv);
     } else {
         help();
     }
Index: qemu-svn/osdep.h
===================================================================
--- qemu-svn.orig/osdep.h
+++ qemu-svn/osdep.h
@@ -7,6 +7,10 @@
 #include <sys/signal.h>
 #endif
 
+#ifndef _WIN32
+#include <sys/time.h>
+#endif
+
 #ifndef glue
 #define xglue(x, y) x ## y
 #define glue(x, y) xglue(x, y)

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2008-12-15 13:51 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-12-08 15:04 [Qemu-devel] [PATCH] snapshot subcommand for qemu-img Kevin Wolf
2008-12-11 21:09 ` Anthony Liguori
2008-12-15 13:55   ` [Qemu-devel] [PATCH] snapshot subcommand for qemu-img (v2) Kevin Wolf

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.