virstorageobj: Check for source duplicates from virStoragePoolObjAssignDef
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>
This commit is contained in:
parent
4f426ce4ba
commit
bc9a80161a
@ -1486,17 +1486,15 @@ virStoragePoolObjSourceFindDuplicateCb(const void *payload,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
static int
|
||||||
virStoragePoolObjSourceFindDuplicate(virStoragePoolObjListPtr pools,
|
virStoragePoolObjSourceFindDuplicate(virStoragePoolObjListPtr pools,
|
||||||
virStoragePoolDefPtr def)
|
virStoragePoolDefPtr def)
|
||||||
{
|
{
|
||||||
struct _virStoragePoolObjFindDuplicateData data = {.def = def};
|
struct _virStoragePoolObjFindDuplicateData data = {.def = def};
|
||||||
virStoragePoolObjPtr obj = NULL;
|
virStoragePoolObjPtr obj = NULL;
|
||||||
|
|
||||||
virObjectRWLockRead(pools);
|
|
||||||
obj = virHashSearch(pools->objs, virStoragePoolObjSourceFindDuplicateCb,
|
obj = virHashSearch(pools->objs, virStoragePoolObjSourceFindDuplicateCb,
|
||||||
&data, NULL);
|
&data, NULL);
|
||||||
virObjectRWUnlock(pools);
|
|
||||||
|
|
||||||
if (obj) {
|
if (obj) {
|
||||||
virReportError(VIR_ERR_OPERATION_FAILED,
|
virReportError(VIR_ERR_OPERATION_FAILED,
|
||||||
@ -1531,6 +1529,9 @@ virStoragePoolObjAssignDef(virStoragePoolObjListPtr pools,
|
|||||||
|
|
||||||
virObjectRWLockWrite(pools);
|
virObjectRWLockWrite(pools);
|
||||||
|
|
||||||
|
if (virStoragePoolObjSourceFindDuplicate(pools, def) < 0)
|
||||||
|
goto error;
|
||||||
|
|
||||||
rc = virStoragePoolObjIsDuplicate(pools, def, check_active, &obj);
|
rc = virStoragePoolObjIsDuplicate(pools, def, check_active, &obj);
|
||||||
|
|
||||||
if (rc < 0)
|
if (rc < 0)
|
||||||
|
@ -245,10 +245,6 @@ void
|
|||||||
virStoragePoolObjRemove(virStoragePoolObjListPtr pools,
|
virStoragePoolObjRemove(virStoragePoolObjListPtr pools,
|
||||||
virStoragePoolObjPtr obj);
|
virStoragePoolObjPtr obj);
|
||||||
|
|
||||||
int
|
|
||||||
virStoragePoolObjSourceFindDuplicate(virStoragePoolObjListPtr pools,
|
|
||||||
virStoragePoolDefPtr def);
|
|
||||||
|
|
||||||
int
|
int
|
||||||
virStoragePoolObjListExport(virConnectPtr conn,
|
virStoragePoolObjListExport(virConnectPtr conn,
|
||||||
virStoragePoolObjListPtr poolobjs,
|
virStoragePoolObjListPtr poolobjs,
|
||||||
|
@ -1160,7 +1160,6 @@ virStoragePoolObjSetActive;
|
|||||||
virStoragePoolObjSetAutostart;
|
virStoragePoolObjSetAutostart;
|
||||||
virStoragePoolObjSetConfigFile;
|
virStoragePoolObjSetConfigFile;
|
||||||
virStoragePoolObjSetDef;
|
virStoragePoolObjSetDef;
|
||||||
virStoragePoolObjSourceFindDuplicate;
|
|
||||||
virStoragePoolObjVolumeGetNames;
|
virStoragePoolObjVolumeGetNames;
|
||||||
virStoragePoolObjVolumeListExport;
|
virStoragePoolObjVolumeListExport;
|
||||||
|
|
||||||
|
@ -705,9 +705,6 @@ storagePoolCreateXML(virConnectPtr conn,
|
|||||||
if (virStoragePoolCreateXMLEnsureACL(conn, newDef) < 0)
|
if (virStoragePoolCreateXMLEnsureACL(conn, newDef) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if (virStoragePoolObjSourceFindDuplicate(driver->pools, newDef) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if ((backend = virStorageBackendForType(newDef->type)) == NULL)
|
if ((backend = virStorageBackendForType(newDef->type)) == NULL)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
@ -796,9 +793,6 @@ storagePoolDefineXML(virConnectPtr conn,
|
|||||||
if (virStoragePoolDefineXMLEnsureACL(conn, newDef) < 0)
|
if (virStoragePoolDefineXMLEnsureACL(conn, newDef) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if (virStoragePoolObjSourceFindDuplicate(driver->pools, newDef) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (virStorageBackendForType(newDef->type) == NULL)
|
if (virStorageBackendForType(newDef->type) == NULL)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user