File snapshot-ioemu-restore.patch of Package xen.import4929

Index: xen-4.0.2-testing/tools/ioemu-qemu-xen/xenstore.c
===================================================================
--- xen-4.0.2-testing.orig/tools/ioemu-qemu-xen/xenstore.c
+++ xen-4.0.2-testing/tools/ioemu-qemu-xen/xenstore.c
@@ -103,6 +103,8 @@ int xenstore_watch_new_callback(const ch
 }
 
 
+char* get_snapshot_name(int devid);
+
 static int pasprintf(char **buf, const char *fmt, ...)
 {
     va_list ap;
@@ -672,8 +674,33 @@ void xenstore_parse_domain_config(int hv
 
             fprintf(stderr, "Using file %s in read-%s mode\n", bs->filename, is_readonly ? "only" : "write");
 
-            if (bdrv_open2(bs, params, flags, format) < 0)
+            if (bdrv_open2(bs, params, BDRV_O_CACHE_WB /* snapshot and write-back */, format) < 0) {
                 fprintf(stderr, "qemu: could not open vbd '%s' or hard disk image '%s' (drv '%s' format '%s')\n", buf, params, drv ? drv : "?", format ? format->format_name : "0");
+            } else {
+                char* snapshot = get_snapshot_name(atoi(e_danger[i]));
+                if (snapshot) {
+                    fprintf(stderr, "Using snapshot %s\n", snapshot);
+                    ret = bdrv_snapshot_goto(bs, snapshot);
+                    switch (ret) {
+                    case 0:
+                        /* Success */
+                        break;
+                    case -ENOTSUP:
+                        /* Don't abort here (could be read-only ISO) */
+                        fprintf(stderr, "Snapshots are not supported for "
+                            "this image file format\n");
+                        break;
+                    case -ENOENT:
+                        fprintf(stderr, "No such snapshot, skipping this "
+                            "image file\n");
+                        continue;
+                    default:
+                        fprintf(stderr, "Could not load snapshot, skipping"
+                            " this image file\n");
+                        continue;
+                    }
+                }
+            }
         }
 
 #endif
@@ -808,6 +835,23 @@ int xenstore_parse_disable_pf_config ()
     return disable_pf;
 }
 
+
+char* get_snapshot_name(int devid)
+{
+    char* path = NULL;
+    char* name = NULL;
+    unsigned int len;
+
+    if (pasprintf(&path,
+            "/local/domain/0/backend/tap/%u/%u/snapshot", domid, devid) == -1)
+        return NULL;
+    name = xs_read(xsh, XBT_NULL, path, &len);
+
+    free(path);
+    return name;
+}
+
+
 int xenstore_fd(void)
 {
     if (xsh)
openSUSE Build Service is sponsored by