]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
util: storage: Return complete parent info from virStorageFileChainLookup
authorPeter Krempa <pkrempa@redhat.com>
Wed, 25 Jun 2014 13:43:04 +0000 (15:43 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Wed, 9 Jul 2014 09:41:34 +0000 (11:41 +0200)
Instead of just returning the parent path, return the complete parent
source structure.

src/qemu/qemu_driver.c
src/util/virstoragefile.c
src/util/virstoragefile.h
tests/virstoragetest.c

index fd68324735d8483c32a69949672db4e5c2cb6e32..0343fff30e0947a54b94ce8f0cc919c11cde6d0d 100644 (file)
@@ -15540,7 +15540,7 @@ qemuDomainBlockCommit(virDomainPtr dom,
     unsigned int topIndex = 0;
     virStorageSourcePtr baseSource;
     unsigned int baseIndex = 0;
-    const char *top_parent = NULL;
+    virStorageSourcePtr top_parent = NULL;
     bool clean_access = false;
     char *topPath = NULL;
     char *basePath = NULL;
@@ -15652,10 +15652,9 @@ qemuDomainBlockCommit(virDomainPtr dom,
     clean_access = true;
     if (qemuDomainPrepareDiskChainElement(driver, vm, disk, baseSource,
                                           VIR_DISK_CHAIN_READ_WRITE) < 0 ||
-        (top_parent && top_parent != disk->src->path &&
-         qemuDomainPrepareDiskChainElementPath(driver, vm, disk,
-                                               top_parent,
-                                               VIR_DISK_CHAIN_READ_WRITE) < 0))
+        (top_parent && top_parent != disk->src &&
+         qemuDomainPrepareDiskChainElement(driver, vm, disk, top_parent,
+                                           VIR_DISK_CHAIN_READ_WRITE) < 0))
         goto endjob;
 
     if (qemuGetDriveSourceString(topSource, NULL, &topPath) < 0)
@@ -15699,10 +15698,9 @@ qemuDomainBlockCommit(virDomainPtr dom,
         /* Revert access to read-only, if possible.  */
         qemuDomainPrepareDiskChainElement(driver, vm, disk, baseSource,
                                           VIR_DISK_CHAIN_READ_ONLY);
-        if (top_parent && top_parent != disk->src->path)
-            qemuDomainPrepareDiskChainElementPath(driver, vm, disk,
-                                                  top_parent,
-                                                  VIR_DISK_CHAIN_READ_ONLY);
+        if (top_parent && top_parent != disk->src)
+            qemuDomainPrepareDiskChainElement(driver, vm, disk, top_parent,
+                                              VIR_DISK_CHAIN_READ_ONLY);
     }
     if (!qemuDomainObjEndJob(driver, vm))
         vm = NULL;
index 4dd76a7521af91dd74bf663145e60a3d41acabbc..ca5cbb4eebb0a1949decdd3d6b5d6d1def5aa235 100644 (file)
@@ -1326,17 +1326,16 @@ virStorageFileChainLookup(virStorageSourcePtr chain,
                           virStorageSourcePtr startFrom,
                           const char *name,
                           unsigned int idx,
-                          const char **parent)
+                          virStorageSourcePtr *parent)
 {
-    virStorageSourcePtr prev = NULL;
+    virStorageSourcePtr prev;
     const char *start = chain->path;
-    const char *tmp;
     char *parentDir = NULL;
     bool nameIsFile = virStorageIsFile(name);
     size_t i = 0;
 
     if (!parent)
-        parent = &tmp;
+        parent = &prev;
     *parent = NULL;
 
     if (startFrom) {
@@ -1344,7 +1343,7 @@ virStorageFileChainLookup(virStorageSourcePtr chain,
             chain = chain->backingStore;
             i++;
         }
-        *parent = startFrom->path;
+        *parent = startFrom;
     }
 
     while (chain) {
@@ -1361,8 +1360,8 @@ virStorageFileChainLookup(virStorageSourcePtr chain,
                 break;
 
             if (nameIsFile && virStorageSourceIsLocalStorage(chain)) {
-                if (prev && virStorageSourceIsLocalStorage(prev))
-                    parentDir = mdir_name(prev->path);
+                if (*parent && virStorageSourceIsLocalStorage(*parent))
+                    parentDir = mdir_name((*parent)->path);
                 else
                     ignore_value(VIR_STRDUP_QUIET(parentDir, "."));
 
@@ -1383,8 +1382,7 @@ virStorageFileChainLookup(virStorageSourcePtr chain,
                     break;
             }
         }
-        *parent = chain->path;
-        prev = chain;
+        *parent = chain;
         chain = chain->backingStore;
         i++;
     }
index 744a6bacc346fc5e4a6e37ac45b0c1ee4823f866..d08aea172daa5169178184a1ddd82d1702e1b163 100644 (file)
@@ -315,7 +315,7 @@ virStorageSourcePtr virStorageFileChainLookup(virStorageSourcePtr chain,
                                               virStorageSourcePtr startFrom,
                                               const char *name,
                                               unsigned int idx,
-                                              const char **parent)
+                                              virStorageSourcePtr *parent)
     ATTRIBUTE_NONNULL(1);
 
 int virStorageFileResize(const char *path,
index fb2837f1de5b0c486100c7ccd0bd686a2dd5e2a2..e2ee3ff87e17e8f22168da5327480267f096515a 100644 (file)
@@ -415,7 +415,7 @@ struct testLookupData
     unsigned int expIndex;
     const char *expResult;
     virStorageSourcePtr expMeta;
-    const char *expParent;
+    virStorageSourcePtr expParent;
 };
 
 static int
@@ -424,7 +424,7 @@ testStorageLookup(const void *args)
     const struct testLookupData *data = args;
     int ret = 0;
     virStorageSourcePtr result;
-    const char *actualParent;
+    virStorageSourcePtr actualParent;
     unsigned int idx;
 
     if (virStorageFileParseChainIndex(data->target, data->name, &idx) < 0 &&
@@ -488,9 +488,10 @@ testStorageLookup(const void *args)
                 data->expMeta, result);
         ret = -1;
     }
-    if (STRNEQ_NULLABLE(data->expParent, actualParent)) {
+    if (data->expParent != actualParent) {
         fprintf(stderr, "parent: expected %s, got %s\n",
-                NULLSTR(data->expParent), NULLSTR(actualParent));
+                NULLSTR(data->expParent ? data->expParent->path : NULL),
+                NULLSTR(actualParent ? actualParent->path : NULL));
         ret = -1;
     }
 
@@ -974,25 +975,25 @@ mymain(void)
     TEST_LOOKUP(5, NULL, abswrap, chain->path, chain, NULL);
     TEST_LOOKUP(6, chain, abswrap, NULL, NULL, NULL);
     TEST_LOOKUP(7, chain2, abswrap, NULL, NULL, NULL);
-    TEST_LOOKUP(8, NULL, "qcow2", chain2->path, chain2, chain->path);
-    TEST_LOOKUP(9, chain, "qcow2", chain2->path, chain2, chain->path);
+    TEST_LOOKUP(8, NULL, "qcow2", chain2->path, chain2, chain);
+    TEST_LOOKUP(9, chain, "qcow2", chain2->path, chain2, chain);
     TEST_LOOKUP(10, chain2, "qcow2", NULL, NULL, NULL);
     TEST_LOOKUP(11, chain3, "qcow2", NULL, NULL, NULL);
-    TEST_LOOKUP(12, NULL, absqcow2, chain2->path, chain2, chain->path);
-    TEST_LOOKUP(13, chain, absqcow2, chain2->path, chain2, chain->path);
+    TEST_LOOKUP(12, NULL, absqcow2, chain2->path, chain2, chain);
+    TEST_LOOKUP(13, chain, absqcow2, chain2->path, chain2, chain);
     TEST_LOOKUP(14, chain2, absqcow2, NULL, NULL, NULL);
     TEST_LOOKUP(15, chain3, absqcow2, NULL, NULL, NULL);
-    TEST_LOOKUP(16, NULL, "raw", chain3->path, chain3, chain2->path);
-    TEST_LOOKUP(17, chain, "raw", chain3->path, chain3, chain2->path);
-    TEST_LOOKUP(18, chain2, "raw", chain3->path, chain3, chain2->path);
+    TEST_LOOKUP(16, NULL, "raw", chain3->path, chain3, chain2);
+    TEST_LOOKUP(17, chain, "raw", chain3->path, chain3, chain2);
+    TEST_LOOKUP(18, chain2, "raw", chain3->path, chain3, chain2);
     TEST_LOOKUP(19, chain3, "raw", NULL, NULL, NULL);
-    TEST_LOOKUP(20, NULL, absraw, chain3->path, chain3, chain2->path);
-    TEST_LOOKUP(21, chain, absraw, chain3->path, chain3, chain2->path);
-    TEST_LOOKUP(22, chain2, absraw, chain3->path, chain3, chain2->path);
+    TEST_LOOKUP(20, NULL, absraw, chain3->path, chain3, chain2);
+    TEST_LOOKUP(21, chain, absraw, chain3->path, chain3, chain2);
+    TEST_LOOKUP(22, chain2, absraw, chain3->path, chain3, chain2);
     TEST_LOOKUP(23, chain3, absraw, NULL, NULL, NULL);
-    TEST_LOOKUP(24, NULL, NULL, chain3->path, chain3, chain2->path);
-    TEST_LOOKUP(25, chain, NULL, chain3->path, chain3, chain2->path);
-    TEST_LOOKUP(26, chain2, NULL, chain3->path, chain3, chain2->path);
+    TEST_LOOKUP(24, NULL, NULL, chain3->path, chain3, chain2);
+    TEST_LOOKUP(25, chain, NULL, chain3->path, chain3, chain2);
+    TEST_LOOKUP(26, chain2, NULL, chain3->path, chain3, chain2);
     TEST_LOOKUP(27, chain3, NULL, NULL, NULL, NULL);
 
     /* Rewrite wrap and qcow2 back to 3-deep chain, relative backing */
@@ -1027,25 +1028,25 @@ mymain(void)
     TEST_LOOKUP(33, NULL, abswrap, chain->path, chain, NULL);
     TEST_LOOKUP(34, chain, abswrap, NULL, NULL, NULL);
     TEST_LOOKUP(35, chain2, abswrap, NULL, NULL, NULL);
-    TEST_LOOKUP(36, NULL, "qcow2", chain2->path, chain2, chain->path);
-    TEST_LOOKUP(37, chain, "qcow2", chain2->path, chain2, chain->path);
+    TEST_LOOKUP(36, NULL, "qcow2", chain2->path, chain2, chain);
+    TEST_LOOKUP(37, chain, "qcow2", chain2->path, chain2, chain);
     TEST_LOOKUP(38, chain2, "qcow2", NULL, NULL, NULL);
     TEST_LOOKUP(39, chain3, "qcow2", NULL, NULL, NULL);
-    TEST_LOOKUP(40, NULL, absqcow2, chain2->path, chain2, chain->path);
-    TEST_LOOKUP(41, chain, absqcow2, chain2->path, chain2, chain->path);
+    TEST_LOOKUP(40, NULL, absqcow2, chain2->path, chain2, chain);
+    TEST_LOOKUP(41, chain, absqcow2, chain2->path, chain2, chain);
     TEST_LOOKUP(42, chain2, absqcow2, NULL, NULL, NULL);
     TEST_LOOKUP(43, chain3, absqcow2, NULL, NULL, NULL);
-    TEST_LOOKUP(44, NULL, "raw", chain3->path, chain3, chain2->path);
-    TEST_LOOKUP(45, chain, "raw", chain3->path, chain3, chain2->path);
-    TEST_LOOKUP(46, chain2, "raw", chain3->path, chain3, chain2->path);
+    TEST_LOOKUP(44, NULL, "raw", chain3->path, chain3, chain2);
+    TEST_LOOKUP(45, chain, "raw", chain3->path, chain3, chain2);
+    TEST_LOOKUP(46, chain2, "raw", chain3->path, chain3, chain2);
     TEST_LOOKUP(47, chain3, "raw", NULL, NULL, NULL);
-    TEST_LOOKUP(48, NULL, absraw, chain3->path, chain3, chain2->path);
-    TEST_LOOKUP(49, chain, absraw, chain3->path, chain3, chain2->path);
-    TEST_LOOKUP(50, chain2, absraw, chain3->path, chain3, chain2->path);
+    TEST_LOOKUP(48, NULL, absraw, chain3->path, chain3, chain2);
+    TEST_LOOKUP(49, chain, absraw, chain3->path, chain3, chain2);
+    TEST_LOOKUP(50, chain2, absraw, chain3->path, chain3, chain2);
     TEST_LOOKUP(51, chain3, absraw, NULL, NULL, NULL);
-    TEST_LOOKUP(52, NULL, NULL, chain3->path, chain3, chain2->path);
-    TEST_LOOKUP(53, chain, NULL, chain3->path, chain3, chain2->path);
-    TEST_LOOKUP(54, chain2, NULL, chain3->path, chain3, chain2->path);
+    TEST_LOOKUP(52, NULL, NULL, chain3->path, chain3, chain2);
+    TEST_LOOKUP(53, chain, NULL, chain3->path, chain3, chain2);
+    TEST_LOOKUP(54, chain2, NULL, chain3->path, chain3, chain2);
     TEST_LOOKUP(55, chain3, NULL, NULL, NULL, NULL);
 
     /* Use link to wrap with cross-directory relative backing */
@@ -1070,12 +1071,12 @@ mymain(void)
     TEST_LOOKUP(57, NULL, "sub/link2", chain->path, chain, NULL);
     TEST_LOOKUP(58, NULL, "wrap", chain->path, chain, NULL);
     TEST_LOOKUP(59, NULL, abswrap, chain->path, chain, NULL);
-    TEST_LOOKUP(60, NULL, "../qcow2", chain2->path, chain2, chain->path);
+    TEST_LOOKUP(60, NULL, "../qcow2", chain2->path, chain2, chain);
     TEST_LOOKUP(61, NULL, "qcow2", NULL, NULL, NULL);
-    TEST_LOOKUP(62, NULL, absqcow2, chain2->path, chain2, chain->path);
-    TEST_LOOKUP(63, NULL, "raw", chain3->path, chain3, chain2->path);
-    TEST_LOOKUP(64, NULL, absraw, chain3->path, chain3, chain2->path);
-    TEST_LOOKUP(65, NULL, NULL, chain3->path, chain3, chain2->path);
+    TEST_LOOKUP(62, NULL, absqcow2, chain2->path, chain2, chain);
+    TEST_LOOKUP(63, NULL, "raw", chain3->path, chain3, chain2);
+    TEST_LOOKUP(64, NULL, absraw, chain3->path, chain3, chain2);
+    TEST_LOOKUP(65, NULL, NULL, chain3->path, chain3, chain2);
 
     TEST_LOOKUP_TARGET(66, "vda", NULL, "bogus[1]", 0, NULL, NULL, NULL);
     TEST_LOOKUP_TARGET(67, "vda", NULL, "vda[-1]", 0, NULL, NULL, NULL);
@@ -1084,18 +1085,13 @@ mymain(void)
     TEST_LOOKUP_TARGET(70, "vda", chain, "wrap", 0, NULL, NULL, NULL);
     TEST_LOOKUP_TARGET(71, "vda", chain2, "wrap", 0, NULL, NULL, NULL);
     TEST_LOOKUP_TARGET(72, "vda", NULL, "vda[0]", 0, NULL, NULL, NULL);
-    TEST_LOOKUP_TARGET(73, "vda", NULL, "vda[1]", 1, chain2->path, chain2,
-                       chain->path);
-    TEST_LOOKUP_TARGET(74, "vda", chain, "vda[1]", 1, chain2->path, chain2,
-                       chain->path);
+    TEST_LOOKUP_TARGET(73, "vda", NULL, "vda[1]", 1, chain2->path, chain2, chain);
+    TEST_LOOKUP_TARGET(74, "vda", chain, "vda[1]", 1, chain2->path, chain2, chain);
     TEST_LOOKUP_TARGET(75, "vda", chain2, "vda[1]", 1, NULL, NULL, NULL);
     TEST_LOOKUP_TARGET(76, "vda", chain3, "vda[1]", 1, NULL, NULL, NULL);
-    TEST_LOOKUP_TARGET(77, "vda", NULL, "vda[2]", 2, chain3->path, chain3,
-                       chain2->path);
-    TEST_LOOKUP_TARGET(78, "vda", chain, "vda[2]", 2, chain3->path, chain3,
-                       chain2->path);
-    TEST_LOOKUP_TARGET(79, "vda", chain2, "vda[2]", 2, chain3->path, chain3,
-                       chain2->path);
+    TEST_LOOKUP_TARGET(77, "vda", NULL, "vda[2]", 2, chain3->path, chain3, chain2);
+    TEST_LOOKUP_TARGET(78, "vda", chain, "vda[2]", 2, chain3->path, chain3, chain2);
+    TEST_LOOKUP_TARGET(79, "vda", chain2, "vda[2]", 2, chain3->path, chain3, chain2);
     TEST_LOOKUP_TARGET(80, "vda", chain3, "vda[2]", 2, NULL, NULL, NULL);
     TEST_LOOKUP_TARGET(81, "vda", NULL, "vda[3]", 3, NULL, NULL, NULL);