This patch makes the test driver thread safe, adding a global driver lock, and the neccessary locking calls on domain/network/storagepool objects. You'll notice there are many calls to virDomainObjUnlock but very few corresponding calls to virDomainObjLock This is because the contract of virDomainFindByUUID declares that the object it returns is already locked. Methods which create / delete virDomainObj instances have to keep the global driver lock held for their whole duration, but others can drop it immediately after getting the virDomainObjPtr instance. src/test.c | 460 +++++++++++++++++++++++++++++++++++++++++++++++++++----- tests/virsh-all | 1 2 files changed, 420 insertions(+), 41 deletions(-) Daniel diff --git a/src/test.c b/src/test.c --- a/src/test.c +++ b/src/test.c @@ -58,6 +58,8 @@ typedef struct _testCell *testCellPtr; #define MAX_CELLS 128 struct _testConn { + PTHREAD_MUTEX_T(lock); + char path[PATH_MAX]; int nextDomID; virCapsPtr caps; @@ -90,6 +92,16 @@ static const virNodeInfo defaultNodeInfo #define testError(conn, code, fmt...) \ virReportErrorHelper(conn, VIR_FROM_TEST, code, __FILE__, \ __FUNCTION__, __LINE__, fmt) + +static void testDriverLock(testConnPtr driver) +{ + pthread_mutex_lock(&driver->lock); +} + +static void testDriverUnlock(testConnPtr driver) +{ + pthread_mutex_unlock(&driver->lock); +} static virCapsPtr testBuildCapabilities(virConnectPtr conn) { @@ -200,6 +212,8 @@ static int testOpenDefault(virConnectPtr return VIR_DRV_OPEN_ERROR; } conn->privateData = privconn; + pthread_mutex_init(&privconn->lock, NULL); + testDriverLock(privconn); if (gettimeofday(&tv, NULL) < 0) { testError(NULL, VIR_ERR_INTERNAL_ERROR, "%s", _("getting time of day")); @@ -232,6 +246,7 @@ static int testOpenDefault(virConnectPtr domobj->def->id = privconn->nextDomID++; domobj->state = VIR_DOMAIN_RUNNING; domobj->persistent = 1; + virDomainObjUnlock(domobj); if (!(netdef = virNetworkDefParseString(conn, defaultNetworkXML))) goto error; @@ -241,6 +256,7 @@ static int testOpenDefault(virConnectPtr } netobj->active = 1; netobj->persistent = 1; + virNetworkObjUnlock(netobj); if (!(pooldef = virStoragePoolDefParse(conn, defaultPoolXML, NULL))) goto error; @@ -250,10 +266,15 @@ static int testOpenDefault(virConnectPtr virStoragePoolDefFree(pooldef); goto error; } - if (testStoragePoolObjSetDefaults(poolobj) == -1) + + if (testStoragePoolObjSetDefaults(poolobj) == -1) { + virStoragePoolObjUnlock(poolobj); goto error; + } poolobj->active = 1; + virStoragePoolObjUnlock(poolobj); + testDriverUnlock(privconn); return VIR_DRV_OPEN_SUCCESS; error: @@ -261,6 +282,7 @@ error: virNetworkObjListFree(&privconn->networks); virStoragePoolObjListFree(&privconn->pools); virCapabilitiesFree(privconn->caps); + testDriverUnlock(privconn); VIR_FREE(privconn); return VIR_DRV_OPEN_ERROR; } @@ -307,6 +329,8 @@ static int testOpenFromFile(virConnectPt return VIR_DRV_OPEN_ERROR; } conn->privateData = privconn; + pthread_mutex_init(&privconn->lock, NULL); + testDriverLock(privconn); if (!(privconn->caps = testBuildCapabilities(conn))) goto error; @@ -445,6 +469,7 @@ static int testOpenFromFile(virConnectPt dom->state = VIR_DOMAIN_RUNNING; dom->def->id = privconn->nextDomID++; dom->persistent = 1; + virDomainObjUnlock(dom); } if (domains != NULL) VIR_FREE(domains); @@ -478,8 +503,8 @@ static int testOpenFromFile(virConnectPt virNetworkDefFree(def); goto error; } - net->persistent = 1; + virNetworkObjUnlock(net); } if (networks != NULL) VIR_FREE(networks); @@ -529,15 +554,19 @@ static int testOpenFromFile(virConnectPt goto error; } - if (testStoragePoolObjSetDefaults(pool) == -1) + if (testStoragePoolObjSetDefaults(pool) == -1) { + virStoragePoolObjUnlock(pool); goto error; + } pool->active = 1; + virStoragePoolObjUnlock(pool); } if (pools != NULL) VIR_FREE(pools); xmlXPathFreeContext(ctxt); xmlFreeDoc(xml); + testDriverUnlock(privconn); return (0); @@ -552,6 +581,7 @@ static int testOpenFromFile(virConnectPt virDomainObjListFree(&privconn->domains); virNetworkObjListFree(&privconn->networks); virStoragePoolObjListFree(&privconn->pools); + testDriverUnlock(privconn); VIR_FREE(privconn); conn->privateData = NULL; return VIR_DRV_OPEN_ERROR; @@ -598,11 +628,12 @@ static int testClose(virConnectPtr conn) static int testClose(virConnectPtr conn) { testConnPtr privconn = conn->privateData; - + testDriverLock(privconn); virCapabilitiesFree(privconn->caps); virDomainObjListFree(&privconn->domains); virNetworkObjListFree(&privconn->networks); virStoragePoolObjListFree(&privconn->pools); + testDriverUnlock(privconn); VIR_FREE (privconn); conn->privateData = NULL; @@ -646,8 +677,9 @@ static int testNodeGetInfo(virConnectPtr virNodeInfoPtr info) { testConnPtr privconn = conn->privateData; - + testDriverLock(privconn); memcpy(info, &privconn->nodeInfo, sizeof(virNodeInfo)); + testDriverUnlock(privconn); return (0); } @@ -655,10 +687,10 @@ static char *testGetCapabilities (virCon { testConnPtr privconn = conn->privateData; char *xml; - + testDriverLock(privconn); if ((xml = virCapabilitiesFormatXML(privconn->caps)) == NULL) testError(conn, VIR_ERR_NO_MEMORY, NULL); - + testDriverUnlock(privconn); return xml; } @@ -667,9 +699,11 @@ static int testNumOfDomains(virConnectPt testConnPtr privconn = conn->privateData; unsigned int numActive = 0, i; + testDriverLock(privconn); for (i = 0 ; i < privconn->domains.count ; i++) if (virDomainIsActive(privconn->domains.objs[i])) numActive++; + testDriverUnlock(privconn); return numActive; } @@ -681,8 +715,9 @@ testDomainCreateXML(virConnectPtr conn, testConnPtr privconn = conn->privateData; virDomainPtr ret = NULL; virDomainDefPtr def; - virDomainObjPtr dom; + virDomainObjPtr dom = NULL; + testDriverLock(privconn); if ((def = virDomainDefParseString(conn, privconn->caps, xml)) == NULL) goto cleanup; @@ -699,6 +734,9 @@ testDomainCreateXML(virConnectPtr conn, ret->id = def->id; cleanup: + if (dom) + virDomainObjUnlock(dom); + testDriverUnlock(privconn); return ret; } @@ -710,7 +748,11 @@ static virDomainPtr testLookupDomainByID virDomainPtr ret = NULL; virDomainObjPtr dom; - if ((dom = virDomainFindByID(&privconn->domains, id)) == NULL) { + testDriverLock(privconn); + dom = virDomainFindByID(&privconn->domains, id); + testDriverUnlock(privconn); + + if (dom == NULL) { testError (conn, VIR_ERR_NO_DOMAIN, NULL); goto cleanup; } @@ -720,6 +762,8 @@ static virDomainPtr testLookupDomainByID ret->id = dom->def->id; cleanup: + if (dom) + virDomainObjUnlock(dom); return ret; } @@ -730,7 +774,11 @@ static virDomainPtr testLookupDomainByUU virDomainPtr ret = NULL; virDomainObjPtr dom ; - if ((dom = virDomainFindByUUID(&privconn->domains, uuid)) == NULL) { + testDriverLock(privconn); + dom = virDomainFindByUUID(&privconn->domains, uuid); + testDriverUnlock(privconn); + + if (dom == NULL) { testError (conn, VIR_ERR_NO_DOMAIN, NULL); goto cleanup; } @@ -740,6 +788,8 @@ static virDomainPtr testLookupDomainByUU ret->id = dom->def->id; cleanup: + if (dom) + virDomainObjUnlock(dom); return ret; } @@ -750,7 +800,11 @@ static virDomainPtr testLookupDomainByNa virDomainPtr ret = NULL; virDomainObjPtr dom; - if ((dom = virDomainFindByName(&privconn->domains, name)) == NULL) { + testDriverLock(privconn); + dom = virDomainFindByName(&privconn->domains, name); + testDriverUnlock(privconn); + + if (dom == NULL) { testError (conn, VIR_ERR_NO_DOMAIN, NULL); goto cleanup; } @@ -760,6 +814,8 @@ static virDomainPtr testLookupDomainByNa ret->id = dom->def->id; cleanup: + if (dom) + virDomainObjUnlock(dom); return ret; } @@ -770,9 +826,14 @@ static int testListDomains (virConnectPt testConnPtr privconn = conn->privateData; unsigned int n = 0, i; - for (i = 0 ; i < privconn->domains.count && n < maxids ; i++) + testDriverLock(privconn); + for (i = 0 ; i < privconn->domains.count && n < maxids ; i++) { + virDomainObjLock(privconn->domains.objs[i]); if (virDomainIsActive(privconn->domains.objs[i])) ids[n++] = privconn->domains.objs[i]->def->id; + virDomainObjUnlock(privconn->domains.objs[i]); + } + testDriverUnlock(privconn); return n; } @@ -783,6 +844,7 @@ static int testDestroyDomain (virDomainP virDomainObjPtr privdom; int ret = -1; + testDriverLock(privconn); privdom = virDomainFindByName(&privconn->domains, domain->name); @@ -797,10 +859,14 @@ static int testDestroyDomain (virDomainP if (!privdom->persistent) { virDomainRemoveInactive(&privconn->domains, privdom); + privdom = NULL; } ret = 0; cleanup: + if (privdom) + virDomainObjUnlock(privdom); + testDriverUnlock(privconn); return ret; } @@ -810,8 +876,10 @@ static int testResumeDomain (virDomainPt virDomainObjPtr privdom; int ret = -1; + testDriverLock(privconn); privdom = virDomainFindByName(&privconn->domains, domain->name); + testDriverUnlock(privconn); if (privdom == NULL) { testError(domain->conn, VIR_ERR_INVALID_ARG, __FUNCTION__); @@ -829,6 +897,8 @@ static int testResumeDomain (virDomainPt ret = 0; cleanup: + if (privdom) + virDomainObjUnlock(privdom); return ret; } @@ -838,8 +908,10 @@ static int testPauseDomain (virDomainPtr virDomainObjPtr privdom; int ret = -1; + testDriverLock(privconn); privdom = virDomainFindByName(&privconn->domains, domain->name); + testDriverUnlock(privconn); if (privdom == NULL) { testError(domain->conn, VIR_ERR_INVALID_ARG, __FUNCTION__); @@ -858,6 +930,8 @@ static int testPauseDomain (virDomainPtr ret = 0; cleanup: + if (privdom) + virDomainObjUnlock(privdom); return ret; } @@ -867,6 +941,7 @@ static int testShutdownDomain (virDomain virDomainObjPtr privdom; int ret = -1; + testDriverLock(privconn); privdom = virDomainFindByName(&privconn->domains, domain->name); @@ -884,9 +959,17 @@ static int testShutdownDomain (virDomain privdom->state = VIR_DOMAIN_SHUTOFF; domain->id = -1; privdom->def->id = -1; + if (!privdom->persistent) { + virDomainRemoveInactive(&privconn->domains, + privdom); + privdom = NULL; + } ret = 0; cleanup: + if (privdom) + virDomainObjUnlock(privdom); + testDriverUnlock(privconn); return ret; } @@ -898,6 +981,7 @@ static int testRebootDomain (virDomainPt virDomainObjPtr privdom; int ret = -1; + testDriverLock(privconn); privdom = virDomainFindByName(&privconn->domains, domain->name); @@ -935,9 +1019,18 @@ static int testRebootDomain (virDomainPt break; } + if (privdom->state == VIR_DOMAIN_SHUTOFF && !privdom->persistent) { + virDomainRemoveInactive(&privconn->domains, + privdom); + privdom = NULL; + } + ret = 0; cleanup: + if (privdom) + virDomainObjUnlock(privdom); + testDriverUnlock(privconn); return ret; } @@ -949,8 +1042,10 @@ static int testGetDomainInfo (virDomainP virDomainObjPtr privdom; int ret = -1; + testDriverLock(privconn); privdom = virDomainFindByName(&privconn->domains, domain->name); + testDriverUnlock(privconn); if (privdom == NULL) { testError(domain->conn, VIR_ERR_INVALID_ARG, __FUNCTION__); @@ -971,6 +1066,8 @@ static int testGetDomainInfo (virDomainP ret = 0; cleanup: + if (privdom) + virDomainObjUnlock(privdom); return ret; } @@ -988,6 +1085,7 @@ static int testDomainSave(virDomainPtr d virDomainObjPtr privdom; int ret = -1; + testDriverLock(privconn); privdom = virDomainFindByName(&privconn->domains, domain->name); @@ -1042,6 +1140,7 @@ static int testDomainSave(virDomainPtr d if (!privdom->persistent) { virDomainRemoveInactive(&privconn->domains, privdom); + privdom = NULL; } ret = 0; @@ -1056,7 +1155,9 @@ cleanup: close(fd); unlink(path); } - + if (privdom) + virDomainObjUnlock(privdom); + testDriverUnlock(privconn); return ret; } @@ -1069,7 +1170,7 @@ static int testDomainRestore(virConnectP int fd = -1; int len; virDomainDefPtr def = NULL; - virDomainObjPtr dom; + virDomainObjPtr dom = NULL; int ret = -1; if ((fd = open(path, O_RDONLY)) < 0) { @@ -1108,6 +1209,7 @@ static int testDomainRestore(virConnectP } xml[len] = '\0'; + testDriverLock(privconn); def = virDomainDefParseString(conn, privconn->caps, xml); if (!def) goto cleanup; @@ -1126,6 +1228,9 @@ cleanup: VIR_FREE(xml); if (fd != -1) close(fd); + if (dom) + virDomainObjUnlock(dom); + testDriverUnlock(privconn); return ret; } @@ -1138,6 +1243,7 @@ static int testDomainCoreDump(virDomainP virDomainObjPtr privdom; int ret = -1; + testDriverLock(privconn); privdom = virDomainFindByName(&privconn->domains, domain->name); @@ -1168,12 +1274,16 @@ static int testDomainCoreDump(virDomainP if (!privdom->persistent) { virDomainRemoveInactive(&privconn->domains, privdom); + privdom = NULL; } ret = 0; cleanup: if (fd != -1) close(fd); + if (privdom) + virDomainObjUnlock(privdom); + testDriverUnlock(privconn); return ret; } @@ -1189,8 +1299,10 @@ static unsigned long testGetMaxMemory(vi virDomainObjPtr privdom; unsigned long ret = -1; + testDriverLock(privconn); privdom = virDomainFindByName(&privconn->domains, domain->name); + testDriverUnlock(privconn); if (privdom == NULL) { testError(domain->conn, VIR_ERR_INVALID_ARG, __FUNCTION__); @@ -1200,6 +1312,8 @@ static unsigned long testGetMaxMemory(vi ret = privdom->def->maxmem; cleanup: + if (privdom) + virDomainObjUnlock(privdom); return ret; } @@ -1210,8 +1324,10 @@ static int testSetMaxMemory(virDomainPtr virDomainObjPtr privdom; int ret = -1; + testDriverLock(privconn); privdom = virDomainFindByName(&privconn->domains, domain->name); + testDriverUnlock(privconn); if (privdom == NULL) { testError(domain->conn, VIR_ERR_INVALID_ARG, __FUNCTION__); @@ -1223,6 +1339,8 @@ static int testSetMaxMemory(virDomainPtr ret = 0; cleanup: + if (privdom) + virDomainObjUnlock(privdom); return ret; } @@ -1233,8 +1351,10 @@ static int testSetMemory(virDomainPtr do virDomainObjPtr privdom; int ret = -1; + testDriverLock(privconn); privdom = virDomainFindByName(&privconn->domains, domain->name); + testDriverUnlock(privconn); if (privdom == NULL) { testError(domain->conn, VIR_ERR_INVALID_ARG, __FUNCTION__); @@ -1251,6 +1371,8 @@ static int testSetMemory(virDomainPtr do ret = 0; cleanup: + if (privdom) + virDomainObjUnlock(privdom); return ret; } @@ -1260,8 +1382,12 @@ static int testSetVcpus(virDomainPtr dom virDomainObjPtr privdom; int ret = -1; - if ((privdom = virDomainFindByName(&privconn->domains, - domain->name)) == NULL) { + testDriverLock(privconn); + privdom = virDomainFindByName(&privconn->domains, + domain->name); + testDriverUnlock(privconn); + + if (privdom == NULL) { testError(domain->conn, VIR_ERR_INVALID_ARG, __FUNCTION__); goto cleanup; } @@ -1276,6 +1402,8 @@ static int testSetVcpus(virDomainPtr dom ret = 0; cleanup: + if (privdom) + virDomainObjUnlock(privdom); return ret; } @@ -1286,8 +1414,12 @@ static char *testDomainDumpXML(virDomain virDomainObjPtr privdom; char *ret = NULL; - if ((privdom = virDomainFindByName(&privconn->domains, - domain->name)) == NULL) { + testDriverLock(privconn); + privdom = virDomainFindByName(&privconn->domains, + domain->name); + testDriverUnlock(privconn); + + if (privdom == NULL) { testError(domain->conn, VIR_ERR_INVALID_ARG, __FUNCTION__); goto cleanup; } @@ -1300,6 +1432,8 @@ static char *testDomainDumpXML(virDomain flags); cleanup: + if (privdom) + virDomainObjUnlock(privdom); return ret; } @@ -1307,9 +1441,14 @@ static int testNumOfDefinedDomains(virCo testConnPtr privconn = conn->privateData; unsigned int numInactive = 0, i; - for (i = 0 ; i < privconn->domains.count ; i++) + testDriverLock(privconn); + for (i = 0 ; i < privconn->domains.count ; i++) { + virDomainObjLock(privconn->domains.objs[i]); if (!virDomainIsActive(privconn->domains.objs[i])) numInactive++; + virDomainObjUnlock(privconn->domains.objs[i]); + } + testDriverUnlock(privconn); return numInactive; } @@ -1320,11 +1459,18 @@ static int testListDefinedDomains(virCon testConnPtr privconn = conn->privateData; unsigned int n = 0, i; + testDriverLock(privconn); memset(names, 0, sizeof(*names)*maxnames); - for (i = 0 ; i < privconn->domains.count && n < maxnames ; i++) + for (i = 0 ; i < privconn->domains.count && n < maxnames ; i++) { + virDomainObjLock(privconn->domains.objs[i]); if (!virDomainIsActive(privconn->domains.objs[i]) && - !(names[n++] = strdup(privconn->domains.objs[i]->def->name))) + !(names[n++] = strdup(privconn->domains.objs[i]->def->name))) { + virDomainObjUnlock(privconn->domains.objs[i]); goto no_memory; + } + virDomainObjUnlock(privconn->domains.objs[i]); + } + testDriverUnlock(privconn); return n; @@ -1332,6 +1478,7 @@ no_memory: testError(conn, VIR_ERR_NO_MEMORY, NULL); for (n = 0 ; n < maxnames ; n++) VIR_FREE(names[n]); + testDriverUnlock(privconn); return -1; } @@ -1340,8 +1487,9 @@ static virDomainPtr testDomainDefineXML( testConnPtr privconn = conn->privateData; virDomainPtr ret = NULL; virDomainDefPtr def; - virDomainObjPtr dom; + virDomainObjPtr dom = NULL; + testDriverLock(privconn); if ((def = virDomainDefParseString(conn, privconn->caps, xml)) == NULL) goto cleanup; @@ -1359,6 +1507,9 @@ static virDomainPtr testDomainDefineXML( cleanup: virDomainDefFree(def); + if (dom) + virDomainObjUnlock(dom); + testDriverUnlock(privconn); return ret; } @@ -1369,6 +1520,7 @@ static int testNodeGetCellsFreeMemory(vi int i, j; int ret = -1; + testDriverLock(privconn); if (startCell > privconn->numCells) { testError(conn, VIR_ERR_INVALID_ARG, "%s", _("Range exceeds available cells")); @@ -1383,6 +1535,7 @@ static int testNodeGetCellsFreeMemory(vi ret = j; cleanup: + testDriverUnlock(privconn); return ret; } @@ -1392,6 +1545,7 @@ static int testDomainCreate(virDomainPtr virDomainObjPtr privdom; int ret = -1; + testDriverLock(privconn); privdom = virDomainFindByName(&privconn->domains, domain->name); @@ -1411,6 +1565,9 @@ static int testDomainCreate(virDomainPtr ret = 0; cleanup: + if (privdom) + virDomainObjUnlock(privdom); + testDriverUnlock(privconn); return ret; } @@ -1419,6 +1576,7 @@ static int testDomainUndefine(virDomainP virDomainObjPtr privdom; int ret = -1; + testDriverLock(privconn); privdom = virDomainFindByName(&privconn->domains, domain->name); @@ -1434,11 +1592,16 @@ static int testDomainUndefine(virDomainP } privdom->state = VIR_DOMAIN_SHUTOFF; + virDomainObjUnlock(privdom); virDomainRemoveInactive(&privconn->domains, privdom); + privdom = NULL; ret = 0; cleanup: + if (privdom) + virDomainObjUnlock(privdom); + testDriverUnlock(privconn); return ret; } @@ -1449,8 +1612,10 @@ static int testDomainGetAutostart(virDom virDomainObjPtr privdom; int ret = -1; + testDriverLock(privconn); privdom = virDomainFindByName(&privconn->domains, domain->name); + testDriverUnlock(privconn); if (privdom == NULL) { testError(domain->conn, VIR_ERR_INVALID_ARG, __FUNCTION__); @@ -1461,6 +1626,8 @@ static int testDomainGetAutostart(virDom ret = 0; cleanup: + if (privdom) + virDomainObjUnlock(privdom); return ret; } @@ -1472,8 +1639,10 @@ static int testDomainSetAutostart(virDom virDomainObjPtr privdom; int ret = -1; + testDriverLock(privconn); privdom = virDomainFindByName(&privconn->domains, domain->name); + testDriverUnlock(privconn); if (privdom == NULL) { testError(domain->conn, VIR_ERR_INVALID_ARG, __FUNCTION__); @@ -1484,6 +1653,8 @@ static int testDomainSetAutostart(virDom ret = 0; cleanup: + if (privdom) + virDomainObjUnlock(privdom); return ret; } @@ -1508,8 +1679,10 @@ static int testDomainGetSchedulerParams( virDomainObjPtr privdom; int ret = -1; + testDriverLock(privconn); privdom = virDomainFindByName(&privconn->domains, domain->name); + testDriverUnlock(privconn); if (privdom == NULL) { testError(domain->conn, VIR_ERR_INVALID_ARG, __FUNCTION__); @@ -1528,6 +1701,8 @@ static int testDomainGetSchedulerParams( ret = 0; cleanup: + if (privdom) + virDomainObjUnlock(privdom); return ret; } @@ -1540,8 +1715,10 @@ static int testDomainSetSchedulerParams( virDomainObjPtr privdom; int ret = -1; + testDriverLock(privconn); privdom = virDomainFindByName(&privconn->domains, domain->name); + testDriverUnlock(privconn); if (privdom == NULL) { testError(domain->conn, VIR_ERR_INVALID_ARG, __FUNCTION__); @@ -1565,6 +1742,8 @@ static int testDomainSetSchedulerParams( ret = 0; cleanup: + if (privdom) + virDomainObjUnlock(privdom); return ret; } @@ -1591,7 +1770,11 @@ static virNetworkPtr testLookupNetworkBy virNetworkObjPtr net; virNetworkPtr ret = NULL; - if ((net = virNetworkFindByUUID(&privconn->networks, uuid)) == NULL) { + testDriverLock(privconn); + net = virNetworkFindByUUID(&privconn->networks, uuid); + testDriverUnlock(privconn); + + if (net == NULL) { testError (conn, VIR_ERR_NO_NETWORK, NULL); goto cleanup; } @@ -1599,6 +1782,8 @@ static virNetworkPtr testLookupNetworkBy ret = virGetNetwork(conn, net->def->name, net->def->uuid); cleanup: + if (net) + virNetworkObjUnlock(net); return ret; } @@ -1609,7 +1794,11 @@ static virNetworkPtr testLookupNetworkBy virNetworkObjPtr net; virNetworkPtr ret = NULL; - if ((net = virNetworkFindByName(&privconn->networks, name)) == NULL) { + testDriverLock(privconn); + net = virNetworkFindByName(&privconn->networks, name); + testDriverUnlock(privconn); + + if (net == NULL) { testError (conn, VIR_ERR_NO_NETWORK, NULL); goto cleanup; } @@ -1617,6 +1806,8 @@ static virNetworkPtr testLookupNetworkBy ret = virGetNetwork(conn, net->def->name, net->def->uuid); cleanup: + if (net) + virNetworkObjUnlock(net); return ret; } @@ -1625,9 +1816,14 @@ static int testNumNetworks(virConnectPtr testConnPtr privconn = conn->privateData; int numActive = 0, i; - for (i = 0 ; i < privconn->networks.count ; i++) + testDriverLock(privconn); + for (i = 0 ; i < privconn->networks.count ; i++) { + virNetworkObjLock(privconn->networks.objs[i]); if (virNetworkIsActive(privconn->networks.objs[i])) numActive++; + virNetworkObjUnlock(privconn->networks.objs[i]); + } + testDriverUnlock(privconn); return numActive; } @@ -1636,11 +1832,18 @@ static int testListNetworks(virConnectPt testConnPtr privconn = conn->privateData; int n = 0, i; + testDriverLock(privconn); memset(names, 0, sizeof(*names)*nnames); - for (i = 0 ; i < privconn->networks.count && n < nnames ; i++) + for (i = 0 ; i < privconn->networks.count && n < nnames ; i++) { + virNetworkObjLock(privconn->networks.objs[i]); if (virNetworkIsActive(privconn->networks.objs[i]) && - !(names[n++] = strdup(privconn->networks.objs[i]->def->name))) + !(names[n++] = strdup(privconn->networks.objs[i]->def->name))) { + virNetworkObjUnlock(privconn->networks.objs[i]); goto no_memory; + } + virNetworkObjUnlock(privconn->networks.objs[i]); + } + testDriverUnlock(privconn); return n; @@ -1648,6 +1851,7 @@ no_memory: testError(conn, VIR_ERR_NO_MEMORY, NULL); for (n = 0 ; n < nnames ; n++) VIR_FREE(names[n]); + testDriverUnlock(privconn); return -1; } @@ -1655,9 +1859,14 @@ static int testNumDefinedNetworks(virCon testConnPtr privconn = conn->privateData; int numInactive = 0, i; - for (i = 0 ; i < privconn->networks.count ; i++) + testDriverLock(privconn); + for (i = 0 ; i < privconn->networks.count ; i++) { + virNetworkObjLock(privconn->networks.objs[i]); if (!virNetworkIsActive(privconn->networks.objs[i])) numInactive++; + virNetworkObjUnlock(privconn->networks.objs[i]); + } + testDriverUnlock(privconn); return numInactive; } @@ -1666,11 +1875,18 @@ static int testListDefinedNetworks(virCo testConnPtr privconn = conn->privateData; int n = 0, i; + testDriverLock(privconn); memset(names, 0, sizeof(*names)*nnames); - for (i = 0 ; i < privconn->networks.count && n < nnames ; i++) + for (i = 0 ; i < privconn->networks.count && n < nnames ; i++) { + virNetworkObjLock(privconn->networks.objs[i]); if (!virNetworkIsActive(privconn->networks.objs[i]) && - !(names[n++] = strdup(privconn->networks.objs[i]->def->name))) + !(names[n++] = strdup(privconn->networks.objs[i]->def->name))) { + virNetworkObjUnlock(privconn->networks.objs[i]); goto no_memory; + } + virNetworkObjUnlock(privconn->networks.objs[i]); + } + testDriverUnlock(privconn); return n; @@ -1678,15 +1894,17 @@ no_memory: testError(conn, VIR_ERR_NO_MEMORY, NULL); for (n = 0 ; n < nnames ; n++) VIR_FREE(names[n]); + testDriverUnlock(privconn); return -1; } static virNetworkPtr testNetworkCreate(virConnectPtr conn, const char *xml) { testConnPtr privconn = conn->privateData; virNetworkDefPtr def; - virNetworkObjPtr net; + virNetworkObjPtr net = NULL; virNetworkPtr ret = NULL; + testDriverLock(privconn); if ((def = virNetworkDefParseString(conn, xml)) == NULL) goto cleanup; @@ -1701,15 +1919,19 @@ static virNetworkPtr testNetworkCreate(v cleanup: virNetworkDefFree(def); + if (net) + virNetworkObjUnlock(net); + testDriverUnlock(privconn); return ret; } static virNetworkPtr testNetworkDefine(virConnectPtr conn, const char *xml) { testConnPtr privconn = conn->privateData; virNetworkDefPtr def; - virNetworkObjPtr net; + virNetworkObjPtr net = NULL; virNetworkPtr ret = NULL; + testDriverLock(privconn); if ((def = virNetworkDefParseString(conn, xml)) == NULL) goto cleanup; @@ -1724,6 +1946,9 @@ static virNetworkPtr testNetworkDefine(v cleanup: virNetworkDefFree(def); + if (net) + virNetworkObjUnlock(net); + testDriverUnlock(privconn); return ret; } @@ -1732,6 +1957,7 @@ static int testNetworkUndefine(virNetwor virNetworkObjPtr privnet; int ret = -1; + testDriverLock(privconn); privnet = virNetworkFindByName(&privconn->networks, network->name); @@ -1748,9 +1974,13 @@ static int testNetworkUndefine(virNetwor virNetworkRemoveInactive(&privconn->networks, privnet); + privnet = NULL; ret = 0; cleanup: + if (privnet) + virNetworkObjUnlock(privnet); + testDriverUnlock(privconn); return ret; } @@ -1759,8 +1989,10 @@ static int testNetworkStart(virNetworkPt virNetworkObjPtr privnet; int ret = -1; + testDriverLock(privconn); privnet = virNetworkFindByName(&privconn->networks, network->name); + testDriverUnlock(privconn); if (privnet == NULL) { testError(network->conn, VIR_ERR_INVALID_ARG, __FUNCTION__); @@ -1777,6 +2009,8 @@ static int testNetworkStart(virNetworkPt ret = 0; cleanup: + if (privnet) + virNetworkObjUnlock(privnet); return ret; } @@ -1785,6 +2019,7 @@ static int testNetworkDestroy(virNetwork virNetworkObjPtr privnet; int ret = -1; + testDriverLock(privconn); privnet = virNetworkFindByName(&privconn->networks, network->name); @@ -1797,10 +2032,14 @@ static int testNetworkDestroy(virNetwork if (!privnet->persistent) { virNetworkRemoveInactive(&privconn->networks, privnet); + privnet = NULL; } ret = 0; cleanup: + if (privnet) + virNetworkObjUnlock(privnet); + testDriverUnlock(privconn); return ret; } @@ -1809,8 +2048,10 @@ static char *testNetworkDumpXML(virNetwo virNetworkObjPtr privnet; char *ret = NULL; + testDriverLock(privconn); privnet = virNetworkFindByName(&privconn->networks, network->name); + testDriverUnlock(privconn); if (privnet == NULL) { testError(network->conn, VIR_ERR_INVALID_ARG, __FUNCTION__); @@ -1820,6 +2061,8 @@ static char *testNetworkDumpXML(virNetwo ret = virNetworkDefFormat(network->conn, privnet->def); cleanup: + if (privnet) + virNetworkObjUnlock(privnet); return ret; } @@ -1828,8 +2071,10 @@ static char *testNetworkGetBridgeName(vi char *bridge = NULL; virNetworkObjPtr privnet; + testDriverLock(privconn); privnet = virNetworkFindByName(&privconn->networks, network->name); + testDriverUnlock(privconn); if (privnet == NULL) { testError(network->conn, VIR_ERR_INVALID_ARG, __FUNCTION__); @@ -1843,6 +2088,8 @@ static char *testNetworkGetBridgeName(vi } cleanup: + if (privnet) + virNetworkObjUnlock(privnet); return bridge; } @@ -1852,8 +2099,10 @@ static int testNetworkGetAutostart(virNe virNetworkObjPtr privnet; int ret = -1; + testDriverLock(privconn); privnet = virNetworkFindByName(&privconn->networks, network->name); + testDriverUnlock(privconn); if (privnet == NULL) { testError(network->conn, VIR_ERR_INVALID_ARG, __FUNCTION__); @@ -1864,6 +2113,8 @@ static int testNetworkGetAutostart(virNe ret = 0; cleanup: + if (privnet) + virNetworkObjUnlock(privnet); return ret; } @@ -1873,8 +2124,10 @@ static int testNetworkSetAutostart(virNe virNetworkObjPtr privnet; int ret = -1; + testDriverLock(privconn); privnet = virNetworkFindByName(&privconn->networks, network->name); + testDriverUnlock(privconn); if (privnet == NULL) { testError(network->conn, VIR_ERR_INVALID_ARG, __FUNCTION__); @@ -1885,6 +2138,8 @@ static int testNetworkSetAutostart(virNe ret = 0; cleanup: + if (privnet) + virNetworkObjUnlock(privnet); return ret; } @@ -1930,7 +2185,9 @@ testStoragePoolLookupByUUID(virConnectPt virStoragePoolObjPtr pool; virStoragePoolPtr ret = NULL; + testDriverLock(privconn); pool = virStoragePoolObjFindByUUID(&privconn->pools, uuid); + testDriverUnlock(privconn); if (pool == NULL) { testError (conn, VIR_ERR_NO_STORAGE_POOL, NULL); @@ -1940,6 +2197,8 @@ testStoragePoolLookupByUUID(virConnectPt ret = virGetStoragePool(conn, pool->def->name, pool->def->uuid); cleanup: + if (pool) + virStoragePoolObjUnlock(pool); return ret; } @@ -1950,7 +2209,9 @@ testStoragePoolLookupByName(virConnectPt virStoragePoolObjPtr pool; virStoragePoolPtr ret = NULL; + testDriverLock(privconn); pool = virStoragePoolObjFindByName(&privconn->pools, name); + testDriverUnlock(privconn); if (pool == NULL) { testError (conn, VIR_ERR_NO_STORAGE_POOL, NULL); @@ -1960,6 +2221,8 @@ testStoragePoolLookupByName(virConnectPt ret = virGetStoragePool(conn, pool->def->name, pool->def->uuid); cleanup: + if (pool) + virStoragePoolObjUnlock(pool); return ret; } @@ -1973,9 +2236,11 @@ testStorageNumPools(virConnectPtr conn) testConnPtr privconn = conn->privateData; int numActive = 0, i; + testDriverLock(privconn); for (i = 0 ; i < privconn->pools.count ; i++) if (virStoragePoolObjIsActive(privconn->pools.objs[i])) numActive++; + testDriverUnlock(privconn); return numActive; } @@ -1987,11 +2252,18 @@ testStorageListPools(virConnectPtr conn, testConnPtr privconn = conn->privateData; int n = 0, i; + testDriverLock(privconn); memset(names, 0, sizeof(*names)*nnames); - for (i = 0 ; i < privconn->pools.count && n < nnames ; i++) + for (i = 0 ; i < privconn->pools.count && n < nnames ; i++) { + virStoragePoolObjLock(privconn->pools.objs[i]); if (virStoragePoolObjIsActive(privconn->pools.objs[i]) && - !(names[n++] = strdup(privconn->pools.objs[i]->def->name))) + !(names[n++] = strdup(privconn->pools.objs[i]->def->name))) { + virStoragePoolObjUnlock(privconn->pools.objs[i]); goto no_memory; + } + virStoragePoolObjUnlock(privconn->pools.objs[i]); + } + testDriverUnlock(privconn); return n; @@ -1999,6 +2271,7 @@ no_memory: testError(conn, VIR_ERR_NO_MEMORY, NULL); for (n = 0 ; n < nnames ; n++) VIR_FREE(names[n]); + testDriverUnlock(privconn); return -1; } @@ -2007,9 +2280,14 @@ testStorageNumDefinedPools(virConnectPtr testConnPtr privconn = conn->privateData; int numInactive = 0, i; - for (i = 0 ; i < privconn->pools.count ; i++) + testDriverLock(privconn); + for (i = 0 ; i < privconn->pools.count ; i++) { + virStoragePoolObjLock(privconn->pools.objs[i]); if (!virStoragePoolObjIsActive(privconn->pools.objs[i])) numInactive++; + virStoragePoolObjUnlock(privconn->pools.objs[i]); + } + testDriverUnlock(privconn); return numInactive; } @@ -2021,11 +2299,18 @@ testStorageListDefinedPools(virConnectPt testConnPtr privconn = conn->privateData; int n = 0, i; + testDriverLock(privconn); memset(names, 0, sizeof(*names)*nnames); - for (i = 0 ; i < privconn->pools.count && n < nnames ; i++) + for (i = 0 ; i < privconn->pools.count && n < nnames ; i++) { + virStoragePoolObjLock(privconn->pools.objs[i]); if (!virStoragePoolObjIsActive(privconn->pools.objs[i]) && - !(names[n++] = strdup(privconn->pools.objs[i]->def->name))) + !(names[n++] = strdup(privconn->pools.objs[i]->def->name))) { + virStoragePoolObjUnlock(privconn->pools.objs[i]); goto no_memory; + } + virStoragePoolObjUnlock(privconn->pools.objs[i]); + } + testDriverUnlock(privconn); return n; @@ -2033,6 +2318,7 @@ no_memory: testError(conn, VIR_ERR_NO_MEMORY, NULL); for (n = 0 ; n < nnames ; n++) VIR_FREE(names[n]); + testDriverUnlock(privconn); return -1; } @@ -2047,8 +2333,10 @@ testStoragePoolStart(virStoragePoolPtr p virStoragePoolObjPtr privpool; int ret = -1; + testDriverLock(privconn); privpool = virStoragePoolObjFindByName(&privconn->pools, pool->name); + testDriverUnlock(privconn); if (privpool == NULL) { testError(pool->conn, VIR_ERR_INVALID_ARG, __FUNCTION__); @@ -2067,6 +2355,8 @@ testStoragePoolStart(virStoragePoolPtr p ret = 0; cleanup: + if (privpool) + virStoragePoolObjUnlock(privpool); return ret; } @@ -2086,9 +2376,10 @@ testStoragePoolCreate(virConnectPtr conn unsigned int flags ATTRIBUTE_UNUSED) { testConnPtr privconn = conn->privateData; virStoragePoolDefPtr def; - virStoragePoolObjPtr pool; + virStoragePoolObjPtr pool = NULL; virStoragePoolPtr ret = NULL; + testDriverLock(privconn); if (!(def = virStoragePoolDefParse(conn, xml, NULL))) goto cleanup; @@ -2117,6 +2408,9 @@ testStoragePoolCreate(virConnectPtr conn cleanup: virStoragePoolDefFree(def); + if (pool) + virStoragePoolObjUnlock(pool); + testDriverUnlock(privconn); return ret; } @@ -2126,9 +2420,10 @@ testStoragePoolDefine(virConnectPtr conn unsigned int flags ATTRIBUTE_UNUSED) { testConnPtr privconn = conn->privateData; virStoragePoolDefPtr def; - virStoragePoolObjPtr pool; + virStoragePoolObjPtr pool = NULL; virStoragePoolPtr ret = NULL; + testDriverLock(privconn); if (!(def = virStoragePoolDefParse(conn, xml, NULL))) goto cleanup; @@ -2151,6 +2446,9 @@ testStoragePoolDefine(virConnectPtr conn cleanup: virStoragePoolDefFree(def); + if (pool) + virStoragePoolObjUnlock(pool); + testDriverUnlock(privconn); return ret; } @@ -2160,6 +2458,7 @@ testStoragePoolUndefine(virStoragePoolPt virStoragePoolObjPtr privpool; int ret = -1; + testDriverLock(privconn); privpool = virStoragePoolObjFindByName(&privconn->pools, pool->name); @@ -2178,6 +2477,9 @@ testStoragePoolUndefine(virStoragePoolPt ret = 0; cleanup: + if (privpool) + virStoragePoolObjUnlock(privpool); + testDriverUnlock(privconn); return ret; } @@ -2188,8 +2490,10 @@ testStoragePoolBuild(virStoragePoolPtr p virStoragePoolObjPtr privpool; int ret = -1; + testDriverLock(privconn); privpool = virStoragePoolObjFindByName(&privconn->pools, pool->name); + testDriverUnlock(privconn); if (privpool == NULL) { testError(pool->conn, VIR_ERR_INVALID_ARG, __FUNCTION__); @@ -2203,6 +2507,8 @@ testStoragePoolBuild(virStoragePoolPtr p } cleanup: + if (privpool) + virStoragePoolObjUnlock(privpool); return ret; } @@ -2213,6 +2519,7 @@ testStoragePoolDestroy(virStoragePoolPtr virStoragePoolObjPtr privpool; int ret = -1; + testDriverLock(privconn); privpool = virStoragePoolObjFindByName(&privconn->pools, pool->name); @@ -2229,11 +2536,16 @@ testStoragePoolDestroy(virStoragePoolPtr privpool->active = 0; - if (privpool->configFile == NULL) + if (privpool->configFile == NULL) { virStoragePoolObjRemove(&privconn->pools, privpool); + privpool = NULL; + } ret = 0; cleanup: + if (privpool) + virStoragePoolObjUnlock(privpool); + testDriverUnlock(privconn); return ret; } @@ -2245,8 +2557,10 @@ testStoragePoolDelete(virStoragePoolPtr virStoragePoolObjPtr privpool; int ret = -1; + testDriverLock(privconn); privpool = virStoragePoolObjFindByName(&privconn->pools, pool->name); + testDriverUnlock(privconn); if (privpool == NULL) { testError(pool->conn, VIR_ERR_INVALID_ARG, __FUNCTION__); @@ -2262,6 +2576,8 @@ testStoragePoolDelete(virStoragePoolPtr ret = 0; cleanup: + if (privpool) + virStoragePoolObjUnlock(privpool); return ret; } @@ -2273,8 +2589,10 @@ testStoragePoolRefresh(virStoragePoolPtr virStoragePoolObjPtr privpool; int ret = -1; + testDriverLock(privconn); privpool = virStoragePoolObjFindByName(&privconn->pools, pool->name); + testDriverUnlock(privconn); if (privpool == NULL) { testError(pool->conn, VIR_ERR_INVALID_ARG, __FUNCTION__); @@ -2289,6 +2607,8 @@ testStoragePoolRefresh(virStoragePoolPtr ret = 0; cleanup: + if (privpool) + virStoragePoolObjUnlock(privpool); return ret; } @@ -2300,8 +2620,10 @@ testStoragePoolGetInfo(virStoragePoolPtr virStoragePoolObjPtr privpool; int ret = -1; + testDriverLock(privconn); privpool = virStoragePoolObjFindByName(&privconn->pools, pool->name); + testDriverUnlock(privconn); if (privpool == NULL) { testError(pool->conn, VIR_ERR_INVALID_ARG, __FUNCTION__); @@ -2319,6 +2641,8 @@ testStoragePoolGetInfo(virStoragePoolPtr ret = 0; cleanup: + if (privpool) + virStoragePoolObjUnlock(privpool); return ret; } @@ -2329,8 +2653,10 @@ testStoragePoolDumpXML(virStoragePoolPtr virStoragePoolObjPtr privpool; char *ret = NULL; + testDriverLock(privconn); privpool = virStoragePoolObjFindByName(&privconn->pools, pool->name); + testDriverUnlock(privconn); if (privpool == NULL) { testError(pool->conn, VIR_ERR_INVALID_ARG, __FUNCTION__); @@ -2340,6 +2666,8 @@ testStoragePoolDumpXML(virStoragePoolPtr ret = virStoragePoolDefFormat(pool->conn, privpool->def); cleanup: + if (privpool) + virStoragePoolObjUnlock(privpool); return ret; } @@ -2350,8 +2678,10 @@ testStoragePoolGetAutostart(virStoragePo virStoragePoolObjPtr privpool; int ret = -1; + testDriverLock(privconn); privpool = virStoragePoolObjFindByName(&privconn->pools, pool->name); + testDriverUnlock(privconn); if (privpool == NULL) { testError(pool->conn, VIR_ERR_INVALID_ARG, __FUNCTION__); @@ -2366,6 +2696,8 @@ testStoragePoolGetAutostart(virStoragePo ret = 0; cleanup: + if (privpool) + virStoragePoolObjUnlock(privpool); return ret; } @@ -2376,8 +2708,10 @@ testStoragePoolSetAutostart(virStoragePo virStoragePoolObjPtr privpool; int ret = -1; + testDriverLock(privconn); privpool = virStoragePoolObjFindByName(&privconn->pools, pool->name); + testDriverUnlock(privconn); if (privpool == NULL) { testError(pool->conn, VIR_ERR_INVALID_ARG, __FUNCTION__); @@ -2395,6 +2729,8 @@ testStoragePoolSetAutostart(virStoragePo ret = 0; cleanup: + if (privpool) + virStoragePoolObjUnlock(privpool); return ret; } @@ -2405,8 +2741,10 @@ testStoragePoolNumVolumes(virStoragePool virStoragePoolObjPtr privpool; int ret = -1; + testDriverLock(privconn); privpool = virStoragePoolObjFindByName(&privconn->pools, pool->name); + testDriverUnlock(privconn); if (privpool == NULL) { testError(pool->conn, VIR_ERR_INVALID_ARG, __FUNCTION__); @@ -2422,6 +2760,8 @@ testStoragePoolNumVolumes(virStoragePool ret = privpool->volumes.count; cleanup: + if (privpool) + virStoragePoolObjUnlock(privpool); return ret; } @@ -2434,9 +2774,10 @@ testStoragePoolListVolumes(virStoragePoo int i = 0, n = 0; memset(names, 0, maxnames); - + testDriverLock(privconn); privpool = virStoragePoolObjFindByName(&privconn->pools, pool->name); + testDriverUnlock(privconn); if (privpool == NULL) { testError(pool->conn, VIR_ERR_INVALID_ARG, __FUNCTION__); @@ -2457,6 +2798,7 @@ testStoragePoolListVolumes(virStoragePoo } } + virStoragePoolObjUnlock(privpool); return n; cleanup: @@ -2464,6 +2806,8 @@ testStoragePoolListVolumes(virStoragePoo VIR_FREE(names[i]); memset(names, 0, maxnames); + if (privpool) + virStoragePoolObjUnlock(privpool); return -1; } @@ -2476,8 +2820,10 @@ testStorageVolumeLookupByName(virStorage virStorageVolDefPtr privvol; virStorageVolPtr ret = NULL; + testDriverLock(privconn); privpool = virStoragePoolObjFindByName(&privconn->pools, pool->name); + testDriverUnlock(privconn); if (privpool == NULL) { testError(pool->conn, VIR_ERR_INVALID_ARG, __FUNCTION__); @@ -2503,6 +2849,8 @@ testStorageVolumeLookupByName(virStorage privvol->name, privvol->key); cleanup: + if (privpool) + virStoragePoolObjUnlock(privpool); return ret; } @@ -2514,7 +2862,9 @@ testStorageVolumeLookupByKey(virConnectP unsigned int i; virStorageVolPtr ret = NULL; + testDriverLock(privconn); for (i = 0 ; i < privconn->pools.count ; i++) { + virStoragePoolObjLock(privconn->pools.objs[i]); if (virStoragePoolObjIsActive(privconn->pools.objs[i])) { virStorageVolDefPtr privvol = virStorageVolDefFindByKey(privconn->pools.objs[i], key); @@ -2524,10 +2874,13 @@ testStorageVolumeLookupByKey(virConnectP privconn->pools.objs[i]->def->name, privvol->name, privvol->key); + virStoragePoolObjUnlock(privconn->pools.objs[i]); break; } } + virStoragePoolObjUnlock(privconn->pools.objs[i]); } + testDriverUnlock(privconn); if (!ret) testError(conn, VIR_ERR_INVALID_STORAGE_VOL, @@ -2543,7 +2896,9 @@ testStorageVolumeLookupByPath(virConnect unsigned int i; virStorageVolPtr ret = NULL; + testDriverLock(privconn); for (i = 0 ; i < privconn->pools.count ; i++) { + virStoragePoolObjLock(privconn->pools.objs[i]); if (virStoragePoolObjIsActive(privconn->pools.objs[i])) { virStorageVolDefPtr privvol = virStorageVolDefFindByPath(privconn->pools.objs[i], path); @@ -2553,10 +2908,13 @@ testStorageVolumeLookupByPath(virConnect privconn->pools.objs[i]->def->name, privvol->name, privvol->key); + virStoragePoolObjUnlock(privconn->pools.objs[i]); break; } + virStoragePoolObjUnlock(privconn->pools.objs[i]); } } + testDriverUnlock(privconn); if (!ret) testError(conn, VIR_ERR_INVALID_STORAGE_VOL, @@ -2574,8 +2932,10 @@ testStorageVolumeCreateXML(virStoragePoo virStorageVolDefPtr privvol = NULL; virStorageVolPtr ret = NULL; + testDriverLock(privconn); privpool = virStoragePoolObjFindByName(&privconn->pools, pool->name); + testDriverUnlock(privconn); if (privpool == NULL) { testError(pool->conn, VIR_ERR_INVALID_ARG, __FUNCTION__); @@ -2646,6 +3006,8 @@ testStorageVolumeCreateXML(virStoragePoo cleanup: virStorageVolDefFree(privvol); + if (privpool) + virStoragePoolObjUnlock(privpool); return ret; } @@ -2658,8 +3020,10 @@ testStorageVolumeDelete(virStorageVolPtr int i; int ret = -1; + testDriverLock(privconn); privpool = virStoragePoolObjFindByName(&privconn->pools, vol->pool); + testDriverUnlock(privconn); if (privpool == NULL) { testError(vol->conn, VIR_ERR_INVALID_ARG, __FUNCTION__); @@ -2709,6 +3073,8 @@ testStorageVolumeDelete(virStorageVolPtr ret = 0; cleanup: + if (privpool) + virStoragePoolObjUnlock(privpool); return ret; } @@ -2733,8 +3099,10 @@ testStorageVolumeGetInfo(virStorageVolPt virStorageVolDefPtr privvol; int ret = -1; + testDriverLock(privconn); privpool = virStoragePoolObjFindByName(&privconn->pools, vol->pool); + testDriverUnlock(privconn); if (privpool == NULL) { testError(vol->conn, VIR_ERR_INVALID_ARG, __FUNCTION__); @@ -2763,6 +3131,8 @@ testStorageVolumeGetInfo(virStorageVolPt ret = 0; cleanup: + if (privpool) + virStoragePoolObjUnlock(privpool); return ret; } @@ -2774,8 +3144,10 @@ testStorageVolumeGetXMLDesc(virStorageVo virStorageVolDefPtr privvol; char *ret = NULL; + testDriverLock(privconn); privpool = virStoragePoolObjFindByName(&privconn->pools, vol->pool); + testDriverUnlock(privconn); if (privpool == NULL) { testError(vol->conn, VIR_ERR_INVALID_ARG, __FUNCTION__); @@ -2800,6 +3172,8 @@ testStorageVolumeGetXMLDesc(virStorageVo ret = virStorageVolDefFormat(vol->conn, privpool->def, privvol); cleanup: + if (privpool) + virStoragePoolObjUnlock(privpool); return ret; } @@ -2810,8 +3184,10 @@ testStorageVolumeGetPath(virStorageVolPt virStorageVolDefPtr privvol; char *ret = NULL; + testDriverLock(privconn); privpool = virStoragePoolObjFindByName(&privconn->pools, vol->pool); + testDriverUnlock(privconn); if (privpool == NULL) { testError(vol->conn, VIR_ERR_INVALID_ARG, __FUNCTION__); @@ -2838,6 +3214,8 @@ testStorageVolumeGetPath(virStorageVolPt testError(vol->conn, VIR_ERR_NO_MEMORY, "%s", _("path")); cleanup: + if (privpool) + virStoragePoolObjUnlock(privpool); return ret; } diff --git a/tests/virsh-all b/tests/virsh-all --- a/tests/virsh-all +++ b/tests/virsh-all @@ -22,6 +22,7 @@ fi fi test -z "$srcdir" && srcdir=$(pwd) +test -z "$abs_top_srcdir" && abs_top_srcdir=$(pwd)/.. . "$srcdir/test-lib.sh" fail=0 -- |: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :| |: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :| -- Libvir-list mailing list Libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list