]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
qemuDomainBlockCommit: Track virStorageSourcePtr for base
authorJiri Denemark <jdenemar@redhat.com>
Fri, 18 Apr 2014 12:44:51 +0000 (14:44 +0200)
committerJiri Denemark <jdenemar@redhat.com>
Fri, 25 Apr 2014 07:46:11 +0000 (09:46 +0200)
virStorageFileChainLookup is able to give use virStorageSourcePtr which
contains the pointer to its canonical path. Let's use a more general
virStorageSourcePtr instead of just canonical path.

Former base_canon maps to baseSource->path.

Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
src/qemu/qemu_driver.c

index f230b77ed20003a7b4a4a9386b6652a79ebaa2dd..b7de28ad2c669898e4abd7349da6dd5a228d73a8 100644 (file)
@@ -15286,8 +15286,8 @@ qemuDomainBlockCommit(virDomainPtr dom, const char *path, const char *base,
     int idx;
     virDomainDiskDefPtr disk = NULL;
     virStorageSourcePtr topSource;
+    virStorageSourcePtr baseSource;
     const char *top_parent = NULL;
-    const char *base_canon = NULL;
     bool clean_access = false;
 
     virCheckFlags(VIR_DOMAIN_BLOCK_COMMIT_SHALLOW, -1);
@@ -15342,16 +15342,12 @@ qemuDomainBlockCommit(virDomainPtr dom, const char *path, const char *base,
     }
 
     if (!base && (flags & VIR_DOMAIN_BLOCK_COMMIT_SHALLOW))
-        base_canon = topSource->backingStore->path;
-    else if (!(base_canon = virStorageFileChainLookup(topSource,
-                                                      base, NULL, NULL)))
+        baseSource = topSource->backingStore;
+    else if (!(virStorageFileChainLookup(topSource, base, &baseSource, NULL)))
         goto endjob;
 
-    /* Note that this code exploits the fact that
-     * virStorageFileChainLookup guarantees a simple pointer
-     * comparison will work, rather than needing full-blown STREQ.  */
     if ((flags & VIR_DOMAIN_BLOCK_COMMIT_SHALLOW) &&
-        base_canon != topSource->backingStore->path) {
+        baseSource != topSource->backingStore) {
         virReportError(VIR_ERR_INVALID_ARG,
                        _("base '%s' is not immediately below '%s' in chain "
                          "for '%s'"),
@@ -15367,7 +15363,7 @@ qemuDomainBlockCommit(virDomainPtr dom, const char *path, const char *base,
      * operation succeeds, but doing that requires tracking the
      * operation in XML across libvirtd restarts.  */
     clean_access = true;
-    if (qemuDomainPrepareDiskChainElement(driver, vm, disk, base_canon,
+    if (qemuDomainPrepareDiskChainElement(driver, vm, disk, baseSource->path,
                                           VIR_DISK_CHAIN_READ_WRITE) < 0 ||
         (top_parent && top_parent != disk->src.path &&
          qemuDomainPrepareDiskChainElement(driver, vm, disk,
@@ -15383,13 +15379,13 @@ qemuDomainBlockCommit(virDomainPtr dom, const char *path, const char *base,
     qemuDomainObjEnterMonitor(driver, vm);
     ret = qemuMonitorBlockCommit(priv->mon, device,
                                  top ? top : topSource->path,
-                                 base ? base : base_canon, bandwidth);
+                                 base ? base : baseSource->path, bandwidth);
     qemuDomainObjExitMonitor(driver, vm);
 
  endjob:
     if (ret < 0 && clean_access) {
         /* Revert access to read-only, if possible.  */
-        qemuDomainPrepareDiskChainElement(driver, vm, disk, base_canon,
+        qemuDomainPrepareDiskChainElement(driver, vm, disk, baseSource->path,
                                           VIR_DISK_CHAIN_READ_ONLY);
         if (top_parent && top_parent != disk->src.path)
             qemuDomainPrepareDiskChainElement(driver, vm, disk,