Daniel P. Berrangé writes: > When running in libvirtd, we are happy for any of the drivers to simply > skip their initialization in virStateInitialize, as other drivers are > still potentially useful. > > When running in per-driver daemons though, we want the daemon to abort > startup if the driver cannot initialize itself, as the daemon will be > useless without it. > > Reviewed-by: Andrea Bolognani <abologna@xxxxxxxxxx> > Signed-off-by: Daniel P. Berrangé <berrange@xxxxxxxxxx> > --- > src/bhyve/bhyve_driver.c | 10 +++++----- > src/driver-state.h | 8 +++++++- > src/interface/interface_backend_netcf.c | 8 ++++---- > src/interface/interface_backend_udev.c | 4 ++-- > src/libvirt.c | 15 ++++++++++++--- > src/libvirt_internal.h | 1 + > src/libxl/libxl_driver.c | 10 +++++----- > src/lxc/lxc_driver.c | 12 ++++++------ > src/network/bridge_driver.c | 4 ++-- > src/node_device/node_device_hal.c | 12 ++++++------ > src/node_device/node_device_udev.c | 8 ++++---- > src/nwfilter/nwfilter_driver.c | 12 ++++++------ > src/qemu/qemu_driver.c | 8 ++++---- > src/remote/remote_daemon.c | 6 ++++++ > src/remote/remote_driver.c | 2 +- > src/secret/secret_driver.c | 8 ++++---- > src/storage/storage_driver.c | 8 ++++---- > src/vz/vz_driver.c | 14 +++++++------- > 18 files changed, 86 insertions(+), 64 deletions(-) > > diff --git a/src/bhyve/bhyve_driver.c b/src/bhyve/bhyve_driver.c > index 5387ac5570..e2c1b00080 100644 > --- a/src/bhyve/bhyve_driver.c > +++ b/src/bhyve/bhyve_driver.c > @@ -1220,16 +1220,16 @@ bhyveStateInitialize(bool privileged, > { > if (!privileged) { > VIR_INFO("Not running privileged, disabling driver"); > - return 0; > + return VIR_DRV_STATE_INIT_SKIPPED; > } > > if (VIR_ALLOC(bhyve_driver) < 0) > - return -1; > + return VIR_DRV_STATE_INIT_ERROR; > > bhyve_driver->lockFD = -1; > if (virMutexInit(&bhyve_driver->lock) < 0) { > VIR_FREE(bhyve_driver); > - return -1; > + return VIR_DRV_STATE_INIT_ERROR; > } > > if (!(bhyve_driver->closeCallbacks = virCloseCallbacksNew())) > @@ -1303,11 +1303,11 @@ bhyveStateInitialize(bool privileged, > > bhyveAutostartDomains(bhyve_driver); > > - return 0; > + return VIR_DRV_STATE_INIT_COMPLETE; > > cleanup: > bhyveStateCleanup(); > - return -1; > + return VIR_DRV_STATE_INIT_ERROR; > } > > unsigned > diff --git a/src/driver-state.h b/src/driver-state.h > index 974b2252ee..69e2678dfc 100644 > --- a/src/driver-state.h > +++ b/src/driver-state.h > @@ -24,7 +24,13 @@ > # error "Don't include this file directly, only use driver.h" > #endif > > -typedef int > +typedef enum { > + VIR_DRV_STATE_INIT_ERROR = -1, > + VIR_DRV_STATE_INIT_SKIPPED, > + VIR_DRV_STATE_INIT_COMPLETE, > +} virDrvStateInitResult; > + > +typedef virDrvStateInitResult > (*virDrvStateInitialize)(bool privileged, > virStateInhibitCallback callback, > void *opaque); > diff --git a/src/interface/interface_backend_netcf.c b/src/interface/interface_backend_netcf.c > index 0000587cee..eb509ccc13 100644 > --- a/src/interface/interface_backend_netcf.c > +++ b/src/interface/interface_backend_netcf.c > @@ -93,10 +93,10 @@ netcfStateInitialize(bool privileged, > void *opaque ATTRIBUTE_UNUSED) > { > if (virNetcfDriverStateInitialize() < 0) > - return -1; > + return VIR_DRV_STATE_INIT_ERROR; > > if (!(driver = virObjectLockableNew(virNetcfDriverStateClass))) > - return -1; > + return VIR_DRV_STATE_INIT_ERROR; > > driver->privileged = privileged; > > @@ -129,12 +129,12 @@ netcfStateInitialize(bool privileged, > _("failed to initialize netcf")); > goto error; > } > - return 0; > + return VIR_DRV_STATE_INIT_COMPLETE; > > error: > virObjectUnref(driver); > driver = NULL; > - return -1; > + return VIR_DRV_STATE_INIT_ERROR; > } > > > diff --git a/src/interface/interface_backend_udev.c b/src/interface/interface_backend_udev.c > index fea5108dbc..ef748540d1 100644 > --- a/src/interface/interface_backend_udev.c > +++ b/src/interface/interface_backend_udev.c > @@ -1172,7 +1172,7 @@ udevStateInitialize(bool privileged, > virStateInhibitCallback callback ATTRIBUTE_UNUSED, > void *opaque ATTRIBUTE_UNUSED) > { > - int ret = -1; > + int ret = VIR_DRV_STATE_INIT_ERROR; > > if (VIR_ALLOC(driver) < 0) > goto cleanup; > @@ -1210,7 +1210,7 @@ udevStateInitialize(bool privileged, > } > driver->privileged = privileged; > > - ret = 0; > + ret = VIR_DRV_STATE_INIT_COMPLETE; > > cleanup: > if (ret < 0) > diff --git a/src/libvirt.c b/src/libvirt.c > index f0a768fc7e..9390a767f9 100644 > --- a/src/libvirt.c > +++ b/src/libvirt.c > @@ -629,6 +629,7 @@ virRegisterStateDriver(virStateDriverPtr driver) > /** > * virStateInitialize: > * @privileged: set to true if running with root privilege, false otherwise > + * @mandatory: set to true if all drivers must report success, not skipped > * @callback: callback to invoke to inhibit shutdown of the daemon > * @opaque: data to pass to @callback > * > @@ -638,6 +639,7 @@ virRegisterStateDriver(virStateDriverPtr driver) > */ > int > virStateInitialize(bool privileged, > + bool mandatory, > virStateInhibitCallback callback, > void *opaque) > { > @@ -648,15 +650,22 @@ virStateInitialize(bool privileged, > > for (i = 0; i < virStateDriverTabCount; i++) { > if (virStateDriverTab[i]->stateInitialize) { > + virDrvStateInitResult ret; > VIR_DEBUG("Running global init for %s state driver", > virStateDriverTab[i]->name); > - if (virStateDriverTab[i]->stateInitialize(privileged, > - callback, > - opaque) < 0) { > + ret = virStateDriverTab[i]->stateInitialize(privileged, > + callback, > + opaque); > + VIR_DEBUG("State init result %d (mandatory=%d)", ret, mandatory); > + if (ret == VIR_DRV_STATE_INIT_ERROR) { I'm a bit conflicted here. I like the explicit "error" in the name, but all the code checks for errors with < 0, and that would work here too. But then, you also just replied to me that libvirt only uses -1 as an error value, so the < 0 really means == -1... Not sure what to prefer here ;-) > VIR_ERROR(_("Initialization of %s state driver failed: %s"), > virStateDriverTab[i]->name, > virGetLastErrorMessage()); > return -1; > + } else if (ret == VIR_DRV_STATE_INIT_SKIPPED && mandatory) { > + VIR_ERROR(_("Initialization of mandatory %s state driver skipped"), > + virStateDriverTab[i]->name); > + return -1; > } > } > } > diff --git a/src/libvirt_internal.h b/src/libvirt_internal.h > index 3f012fdd4b..4a74dbc2af 100644 > --- a/src/libvirt_internal.h > +++ b/src/libvirt_internal.h > @@ -30,6 +30,7 @@ typedef void (*virStateInhibitCallback)(bool inhibit, > void *opaque); > > int virStateInitialize(bool privileged, > + bool mandatory, > virStateInhibitCallback inhibit, > void *opaque); > int virStateCleanup(void); > diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c > index 492028c487..231960b817 100644 > --- a/src/libxl/libxl_driver.c > +++ b/src/libxl/libxl_driver.c > @@ -657,17 +657,17 @@ libxlStateInitialize(bool privileged, > char ebuf[1024]; > > if (!libxlDriverShouldLoad(privileged)) > - return 0; > + return VIR_DRV_STATE_INIT_SKIPPED; > > if (VIR_ALLOC(libxl_driver) < 0) > - return -1; > + return VIR_DRV_STATE_INIT_ERROR; > > libxl_driver->lockFD = -1; > if (virMutexInit(&libxl_driver->lock) < 0) { > virReportError(VIR_ERR_INTERNAL_ERROR, > "%s", _("cannot initialize mutex")); > VIR_FREE(libxl_driver); > - return -1; > + return VIR_DRV_STATE_INIT_ERROR; > } > > /* Allocate bitmap for vnc port reservation */ > @@ -806,12 +806,12 @@ libxlStateInitialize(bool privileged, > virDomainObjListForEach(libxl_driver->domains, libxlDomainManagedSaveLoad, > libxl_driver); > > - return 0; > + return VIR_DRV_STATE_INIT_COMPLETE; > > error: > VIR_FREE(driverConf); > libxlStateCleanup(); > - return -1; > + return VIR_DRV_STATE_INIT_ERROR; > } > > static int > diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c > index d0b6703101..0baf18f3ef 100644 > --- a/src/lxc/lxc_driver.c > +++ b/src/lxc/lxc_driver.c > @@ -1545,7 +1545,7 @@ static int lxcStateInitialize(bool privileged, > /* Check that the user is root, silently disable if not */ > if (!privileged) { > VIR_INFO("Not running privileged, disabling driver"); > - return 0; > + return VIR_DRV_STATE_INIT_SKIPPED; > } > > /* Check that this is a container enabled kernel */ > @@ -1554,15 +1554,15 @@ static int lxcStateInitialize(bool privileged, > VIR_PROCESS_NAMESPACE_UTS | > VIR_PROCESS_NAMESPACE_IPC) < 0) { > VIR_INFO("LXC support not available in this kernel, disabling driver"); > - return 0; > + return VIR_DRV_STATE_INIT_SKIPPED; > } > > if (VIR_ALLOC(lxc_driver) < 0) > - return -1; > + return VIR_DRV_STATE_INIT_ERROR; > lxc_driver->lockFD = -1; > if (virMutexInit(&lxc_driver->lock) < 0) { > VIR_FREE(lxc_driver); > - return -1; > + return VIR_DRV_STATE_INIT_ERROR; > } > > if (!(lxc_driver->domains = virDomainObjListNew())) > @@ -1633,12 +1633,12 @@ static int lxcStateInitialize(bool privileged, > virLXCProcessAutostartAll(lxc_driver); > > virObjectUnref(caps); > - return 0; > + return VIR_DRV_STATE_INIT_COMPLETE; > > cleanup: > virObjectUnref(caps); > lxcStateCleanup(); > - return -1; > + return VIR_DRV_STATE_INIT_ERROR; > } > > static void lxcNotifyLoadDomain(virDomainObjPtr vm, int newVM, void *opaque) > diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c > index 41fa89a4af..2b1fa59390 100644 > --- a/src/network/bridge_driver.c > +++ b/src/network/bridge_driver.c > @@ -713,7 +713,7 @@ networkStateInitialize(bool privileged, > virStateInhibitCallback callback ATTRIBUTE_UNUSED, > void *opaque ATTRIBUTE_UNUSED) > { > - int ret = -1; > + int ret = VIR_DRV_STATE_INIT_ERROR; > char *configdir = NULL; > char *rundir = NULL; > #ifdef WITH_FIREWALLD > @@ -847,7 +847,7 @@ networkStateInitialize(bool privileged, > } > #endif > > - ret = 0; > + ret = VIR_DRV_STATE_INIT_COMPLETE; > cleanup: > VIR_FREE(configdir); > VIR_FREE(rundir); > diff --git a/src/node_device/node_device_hal.c b/src/node_device/node_device_hal.c > index 1f3f867599..d46e4e98f3 100644 > --- a/src/node_device/node_device_hal.c > +++ b/src/node_device/node_device_hal.c > @@ -599,7 +599,7 @@ nodeStateInitialize(bool privileged ATTRIBUTE_UNUSED, > char **udi = NULL; > int num_devs; > size_t i; > - int ret = -1; > + int ret = VIR_DRV_STATE_INIT_ERROR; > DBusConnection *sysbus; > DBusError err; > > @@ -608,12 +608,12 @@ nodeStateInitialize(bool privileged ATTRIBUTE_UNUSED, > cmpstringp); > > if (VIR_ALLOC(driver) < 0) > - return -1; > + return VIR_DRV_STATE_INIT_ERROR; > > driver->lockFD = -1; > if (virMutexInit(&driver->lock) < 0) { > VIR_FREE(driver); > - return -1; > + return VIR_DRV_STATE_INIT_ERROR; > } > nodeDeviceLock(); > > @@ -648,7 +648,7 @@ nodeStateInitialize(bool privileged ATTRIBUTE_UNUSED, > virReportError(VIR_ERR_INTERNAL_ERROR, > _("DBus not available, disabling HAL driver: %s"), > virGetLastErrorMessage()); > - ret = 0; > + ret = VIR_DRV_STATE_INIT_SKIPPED; > goto failure; > } > > @@ -671,7 +671,7 @@ nodeStateInitialize(bool privileged ATTRIBUTE_UNUSED, > /* We don't want to show a fatal error here, > otherwise entire libvirtd shuts down when > hald isn't running */ > - ret = 0; > + ret = VIR_DRV_STATE_INIT_SKIPPED; > goto failure; > } > > @@ -709,7 +709,7 @@ nodeStateInitialize(bool privileged ATTRIBUTE_UNUSED, > } > VIR_FREE(udi); > > - return 0; > + return VIR_DRV_STATE_INIT_COMPLETE; > > failure: > if (dbus_error_is_set(&err)) { > diff --git a/src/node_device/node_device_udev.c b/src/node_device/node_device_udev.c > index 8bc63c506c..adf60e4537 100644 > --- a/src/node_device/node_device_udev.c > +++ b/src/node_device/node_device_udev.c > @@ -1816,14 +1816,14 @@ nodeStateInitialize(bool privileged, > virThread enumThread; > > if (VIR_ALLOC(driver) < 0) > - return -1; > + return VIR_DRV_STATE_INIT_ERROR; > > driver->lockFD = -1; > if (virMutexInit(&driver->lock) < 0) { > virReportError(VIR_ERR_INTERNAL_ERROR, "%s", > _("Unable to initialize mutex")); > VIR_FREE(driver); > - return -1; > + return VIR_DRV_STATE_INIT_ERROR; > } > > driver->privileged = privileged; > @@ -1919,11 +1919,11 @@ nodeStateInitialize(bool privileged, > goto cleanup; > } > > - return 0; > + return VIR_DRV_STATE_INIT_COMPLETE; > > cleanup: > nodeStateCleanup(); > - return -1; > + return VIR_DRV_STATE_INIT_ERROR; > > unlock: > virObjectUnlock(priv); > diff --git a/src/nwfilter/nwfilter_driver.c b/src/nwfilter/nwfilter_driver.c > index 530e4f5872..6073143437 100644 > --- a/src/nwfilter/nwfilter_driver.c > +++ b/src/nwfilter/nwfilter_driver.c > @@ -184,10 +184,10 @@ nwfilterStateInitialize(bool privileged, > > if (virDBusHasSystemBus() && > !(sysbus = virDBusGetSystemBus())) > - return -1; > + return VIR_DRV_STATE_INIT_ERROR; > > if (VIR_ALLOC(driver) < 0) > - return -1; > + return VIR_DRV_STATE_INIT_ERROR; > > driver->lockFD = -1; > if (virMutexInit(&driver->lock) < 0) > @@ -201,7 +201,7 @@ nwfilterStateInitialize(bool privileged, > goto error; > > if (!privileged) > - return 0; > + return VIR_DRV_STATE_INIT_SKIPPED; > > nwfilterDriverLock(); > > @@ -281,13 +281,13 @@ nwfilterStateInitialize(bool privileged, > > nwfilterDriverUnlock(); > > - return 0; > + return VIR_DRV_STATE_INIT_COMPLETE; > > error: > nwfilterDriverUnlock(); > nwfilterStateCleanup(); > > - return -1; > + return VIR_DRV_STATE_INIT_ERROR; > > err_techdrivers_shutdown: > virNWFilterTechDriversShutdown(); > @@ -302,7 +302,7 @@ nwfilterStateInitialize(bool privileged, > virNWFilterObjListFree(driver->nwfilters); > VIR_FREE(driver); > > - return -1; > + return VIR_DRV_STATE_INIT_ERROR; > } > > /** > diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c > index 4ca3eb7bde..d4fc8bbbd6 100644 > --- a/src/qemu/qemu_driver.c > +++ b/src/qemu/qemu_driver.c > @@ -730,7 +730,7 @@ qemuStateInitialize(bool privileged, > size_t i; > > if (VIR_ALLOC(qemu_driver) < 0) > - return -1; > + return VIR_DRV_STATE_INIT_ERROR; > > qemu_driver->lockFD = -1; > > @@ -738,7 +738,7 @@ qemuStateInitialize(bool privileged, > virReportError(VIR_ERR_INTERNAL_ERROR, "%s", > _("cannot initialize mutex")); > VIR_FREE(qemu_driver); > - return -1; > + return VIR_DRV_STATE_INIT_ERROR; > } > > qemu_driver->inhibitCallback = callback; > @@ -1074,14 +1074,14 @@ qemuStateInitialize(bool privileged, > > qemuAutostartDomains(qemu_driver); > > - return 0; > + return VIR_DRV_STATE_INIT_COMPLETE; > > error: > VIR_FREE(driverConf); > VIR_FREE(hugepagePath); > VIR_FREE(memoryBackingPath); > qemuStateCleanup(); > - return -1; > + return VIR_DRV_STATE_INIT_ERROR; > } > > static void qemuNotifyLoadDomain(virDomainObjPtr vm, int newVM, void *opaque) > diff --git a/src/remote/remote_daemon.c b/src/remote/remote_daemon.c > index fadfc7c016..42c51c1329 100644 > --- a/src/remote/remote_daemon.c > +++ b/src/remote/remote_daemon.c > @@ -792,6 +792,11 @@ static void daemonRunStateInit(void *opaque) > { > virNetDaemonPtr dmn = opaque; > virIdentityPtr sysident = virIdentityGetSystem(); > +#ifdef MODULE_NAME > + bool mandatory = true; > +#else /* ! MODULE_NAME */ > + bool mandatory = false; > +#endif /* ! MODULE_NAME */ > > virIdentitySetCurrent(sysident); > > @@ -804,6 +809,7 @@ static void daemonRunStateInit(void *opaque) > * we're ready, since it can take a long time and this will > * seriously delay OS bootup process */ > if (virStateInitialize(virNetDaemonIsPrivileged(dmn), > + mandatory, > daemonInhibitCallback, > dmn) < 0) { > VIR_ERROR(_("Driver state initialization failed")); > diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c > index 72c2336b7a..8e1024dca3 100644 > --- a/src/remote/remote_driver.c > +++ b/src/remote/remote_driver.c > @@ -195,7 +195,7 @@ remoteStateInitialize(bool privileged ATTRIBUTE_UNUSED, > * re-entering ourselves > */ > inside_daemon = true; > - return 0; > + return VIR_DRV_STATE_INIT_COMPLETE; > } > > > diff --git a/src/secret/secret_driver.c b/src/secret/secret_driver.c > index 0af2bcef96..0d5ea05f56 100644 > --- a/src/secret/secret_driver.c > +++ b/src/secret/secret_driver.c > @@ -457,12 +457,12 @@ secretStateInitialize(bool privileged, > void *opaque ATTRIBUTE_UNUSED) > { > if (VIR_ALLOC(driver) < 0) > - return -1; > + return VIR_DRV_STATE_INIT_ERROR; > > driver->lockFD = -1; > if (virMutexInit(&driver->lock) < 0) { > VIR_FREE(driver); > - return -1; > + return VIR_DRV_STATE_INIT_ERROR; > } > secretDriverLock(); > > @@ -514,12 +514,12 @@ secretStateInitialize(bool privileged, > goto error; > > secretDriverUnlock(); > - return 0; > + return VIR_DRV_STATE_INIT_COMPLETE; > > error: > secretDriverUnlock(); > secretStateCleanup(); > - return -1; > + return VIR_DRV_STATE_INIT_ERROR; > } > > > diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c > index 03ac6a6845..dfa654178b 100644 > --- a/src/storage/storage_driver.c > +++ b/src/storage/storage_driver.c > @@ -255,12 +255,12 @@ storageStateInitialize(bool privileged, > VIR_AUTOFREE(char *) rundir = NULL; > > if (VIR_ALLOC(driver) < 0) > - return -1; > + return VIR_DRV_STATE_INIT_ERROR; > > driver->lockFD = -1; > if (virMutexInit(&driver->lock) < 0) { > VIR_FREE(driver); > - return -1; > + return VIR_DRV_STATE_INIT_ERROR; > } > storageDriverLock(); > > @@ -326,12 +326,12 @@ storageStateInitialize(bool privileged, > > storageDriverUnlock(); > > - return 0; > + return VIR_DRV_STATE_INIT_COMPLETE; > > error: > storageDriverUnlock(); > storageStateCleanup(); > - return -1; > + return VIR_DRV_STATE_INIT_ERROR; > } > > /** > diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c > index f5d05a7f43..da72b209d1 100644 > --- a/src/vz/vz_driver.c > +++ b/src/vz/vz_driver.c > @@ -4118,36 +4118,36 @@ vzStateInitialize(bool privileged, > void *opaque ATTRIBUTE_UNUSED) > { > if (!privileged) > - return 0; > + return VIR_DRV_STATE_INIT_SKIPPED; > > vz_driver_privileged = privileged; > > if (virFileMakePathWithMode(VZ_STATEDIR, S_IRWXU) < 0) { > virReportSystemError(errno, _("cannot create state directory '%s'"), > VZ_STATEDIR); > - return -1; > + return VIR_DRV_STATE_INIT_ERROR; > } > > if ((vz_driver_lock_fd = > virPidFileAcquire(VZ_STATEDIR, "driver", false, getpid())) < 0) > - return -1; > + return VIR_DRV_STATE_INIT_ERROR; > > if (prlsdkInit() < 0) { > VIR_DEBUG("%s", _("Can't initialize Parallels SDK")); > - return -1; > + return VIR_DRV_STATE_INIT_ERROR; > } > > - if (virMutexInit(&vz_driver_lock) < 0) > + if (virMutexInit(&vz_driver_lock) < 0) > goto error; > > /* Failing to create driver here is not fatal and only means > * that next driver client will try once more when connecting */ > vz_driver = vzDriverObjNew(); > - return 0; > + return VIR_DRV_STATE_INIT_COMPLETE; > > error: > vzStateCleanup(); > - return -1; > + return VIR_DRV_STATE_INIT_ERROR; > } > > static virStateDriver vzStateDriver = { > -- > 2.21.0 Reviewed-by: Christophe de Dinechin <dinechin@xxxxxxxxxx> -- Cheers, Christophe de Dinechin (IRC c3d) -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list