]> xenbits.xensource.com Git - libvirt.git/commitdiff
virstorageobj: Check for source duplicates from virStoragePoolObjAssignDef
authorMichal Privoznik <mprivozn@redhat.com>
Fri, 17 Aug 2018 13:07:01 +0000 (15:07 +0200)
committerMichal Privoznik <mprivozn@redhat.com>
Tue, 4 Sep 2018 08:11:40 +0000 (10:11 +0200)
Just like a few commits earlier, checking for pool source
duplicates and unlocking pools list afterwards is a buggy
pattern. The check must go into virStoragePoolObjAssignDef.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: John Ferlan <jferlan@redhat.com>
src/conf/virstorageobj.c
src/conf/virstorageobj.h
src/libvirt_private.syms
src/storage/storage_driver.c

index 817d9a41466a02d6fa4226275dedc002a930705a..0b3ba84af233f625d4c3af269c3821f6fe772488 100644 (file)
@@ -1486,17 +1486,15 @@ virStoragePoolObjSourceFindDuplicateCb(const void *payload,
 }
 
 
-int
+static int
 virStoragePoolObjSourceFindDuplicate(virStoragePoolObjListPtr pools,
                                      virStoragePoolDefPtr def)
 {
     struct _virStoragePoolObjFindDuplicateData data = {.def = def};
     virStoragePoolObjPtr obj = NULL;
 
-    virObjectRWLockRead(pools);
     obj = virHashSearch(pools->objs, virStoragePoolObjSourceFindDuplicateCb,
                         &data, NULL);
-    virObjectRWUnlock(pools);
 
     if (obj) {
         virReportError(VIR_ERR_OPERATION_FAILED,
@@ -1531,6 +1529,9 @@ virStoragePoolObjAssignDef(virStoragePoolObjListPtr pools,
 
     virObjectRWLockWrite(pools);
 
+    if (virStoragePoolObjSourceFindDuplicate(pools, def) < 0)
+        goto error;
+
     rc = virStoragePoolObjIsDuplicate(pools, def, check_active, &obj);
 
     if (rc < 0)
index bc24db192895985446fefc9060f06ff9d719f258..abd6166d888c25660dc65db3591c1a0d8716840f 100644 (file)
@@ -245,10 +245,6 @@ void
 virStoragePoolObjRemove(virStoragePoolObjListPtr pools,
                         virStoragePoolObjPtr obj);
 
-int
-virStoragePoolObjSourceFindDuplicate(virStoragePoolObjListPtr pools,
-                                     virStoragePoolDefPtr def);
-
 int
 virStoragePoolObjListExport(virConnectPtr conn,
                             virStoragePoolObjListPtr poolobjs,
index fe518f7325d10557a51e6dc47ebf43f16955bfd1..93e6e8a14ca4c2a01ee4b8cfad1e644392da0d7f 100644 (file)
@@ -1160,7 +1160,6 @@ virStoragePoolObjSetActive;
 virStoragePoolObjSetAutostart;
 virStoragePoolObjSetConfigFile;
 virStoragePoolObjSetDef;
-virStoragePoolObjSourceFindDuplicate;
 virStoragePoolObjVolumeGetNames;
 virStoragePoolObjVolumeListExport;
 
index df4f86c4bda779edb032163e037649774dccf84c..e7085e4773362844929e4432e8e140367d1c0e9b 100644 (file)
@@ -705,9 +705,6 @@ storagePoolCreateXML(virConnectPtr conn,
     if (virStoragePoolCreateXMLEnsureACL(conn, newDef) < 0)
         goto cleanup;
 
-    if (virStoragePoolObjSourceFindDuplicate(driver->pools, newDef) < 0)
-        goto cleanup;
-
     if ((backend = virStorageBackendForType(newDef->type)) == NULL)
         goto cleanup;
 
@@ -796,9 +793,6 @@ storagePoolDefineXML(virConnectPtr conn,
     if (virStoragePoolDefineXMLEnsureACL(conn, newDef) < 0)
         goto cleanup;
 
-    if (virStoragePoolObjSourceFindDuplicate(driver->pools, newDef) < 0)
-        goto cleanup;
-
     if (virStorageBackendForType(newDef->type) == NULL)
         goto cleanup;