}
+static int
+nodeDeviceWaitInit(void)
+{
+ nodeDeviceLock();
+ while (!driver->initialized) {
+ if (virCondWait(&driver->initCond, &driver->lock) < 0) {
+ virReportSystemError(errno, "%s",
+ _("failed to wait on condition"));
+ nodeDeviceUnlock();
+ return -1;
+ }
+ }
+ nodeDeviceUnlock();
+ return 0;
+}
+
int
nodeNumOfDevices(virConnectPtr conn,
const char *cap,
virCheckFlags(0, -1);
+ if (nodeDeviceWaitInit() < 0)
+ return -1;
+
return virNodeDeviceObjListNumOfDevices(driver->devs, conn, cap,
virNodeNumOfDevicesCheckACL);
}
virCheckFlags(0, -1);
+ if (nodeDeviceWaitInit() < 0)
+ return -1;
+
return virNodeDeviceObjListGetNames(driver->devs, conn,
virNodeListDevicesCheckACL,
cap, names, maxnames);
if (virConnectListAllNodeDevicesEnsureACL(conn) < 0)
return -1;
+ if (nodeDeviceWaitInit() < 0)
+ return -1;
+
return virNodeDeviceObjListExport(conn, driver->devs, devices,
virConnectListAllNodeDevicesCheckACL,
flags);
virNodeDeviceDefPtr def;
virNodeDevicePtr device = NULL;
+ if (nodeDeviceWaitInit() < 0)
+ return NULL;
+
if (!(obj = nodeDeviceObjFindByName(name)))
return NULL;
def = virNodeDeviceObjGetDef(obj);
virCheckFlags(0, NULL);
+ if (nodeDeviceWaitInit() < 0)
+ return NULL;
+
if (!(obj = virNodeDeviceObjListFindSCSIHostByWWNs(driver->devs,
wwnn, wwpn)))
return NULL;
const char *virt_type = NULL;
virCheckFlags(0, NULL);
+
+ if (nodeDeviceWaitInit() < 0)
+ return NULL;
+
virt_type = virConnectGetType(conn);
if (!(def = virNodeDeviceDefParseString(xmlDesc, CREATE_DEVICE, virt_type)))
g_autofree char *wwpn = NULL;
unsigned int parent_host;
+ if (nodeDeviceWaitInit() < 0)
+ return -1;
+
if (!(obj = nodeDeviceObjFindByName(device->name)))
return -1;
def = virNodeDeviceObjGetDef(obj);
if (virConnectNodeDeviceEventRegisterAnyEnsureACL(conn) < 0)
return -1;
+ if (nodeDeviceWaitInit() < 0)
+ return -1;
+
if (virNodeDeviceEventStateRegisterID(conn, driver->nodeDeviceEventState,
device, eventID, callback,
opaque, freecb, &callbackID) < 0)
if (virConnectNodeDeviceEventDeregisterAnyEnsureACL(conn) < 0)
return -1;
+ if (nodeDeviceWaitInit() < 0)
+ return -1;
+
if (virObjectEventStateDeregisterID(conn,
driver->nodeDeviceEventState,
callbackID, true) < 0)
VIR_FREE(driver);
return VIR_DRV_STATE_INIT_ERROR;
}
+
+ if (virCondInit(&driver->initCond) < 0) {
+ virReportSystemError(errno, "%s",
+ _("Unable to initialize condition variable"));
+ virMutexDestroy(&driver->lock);
+ VIR_FREE(driver);
+ return VIR_DRV_STATE_INIT_ERROR;
+ }
+
nodeDeviceLock();
if (privileged) {
}
VIR_FREE(udi);
+ nodeDeviceLock();
+ driver->initialized = true;
+ nodeDeviceUnlock();
+ virCondBroadcast(&driver->initCond);
+
return VIR_DRV_STATE_INIT_COMPLETE;
failure:
VIR_FREE(driver->stateDir);
nodeDeviceUnlock();
+ virCondDestroy(&driver->initCond);
virMutexDestroy(&driver->lock);
VIR_FREE(driver);
return 0;
virPidFileRelease(driver->stateDir, "driver", driver->lockFD);
VIR_FREE(driver->stateDir);
+ virCondDestroy(&driver->initCond);
virMutexDestroy(&driver->lock);
VIR_FREE(driver);
if (udevEnumerateDevices(udev) != 0)
goto error;
+ nodeDeviceLock();
+ driver->initialized = true;
+ nodeDeviceUnlock();
+ virCondBroadcast(&driver->initCond);
+
return;
error:
VIR_FREE(driver);
return VIR_DRV_STATE_INIT_ERROR;
}
+ if (virCondInit(&driver->initCond) < 0) {
+ virReportSystemError(errno, "%s",
+ _("Unable to initialize condition variable"));
+ virMutexDestroy(&driver->lock);
+ VIR_FREE(driver);
+ return VIR_DRV_STATE_INIT_ERROR;
+ }
driver->privileged = privileged;