19.11.2015 15:22, Mikhail Feoktistov пишет:
> Diff from v1:
> Remove vz prefix from the title of this letter. Because this is the
> common case
> for all drivers in libvirt.
>
> Description:
> Built-in drivers in libvirt are initialized before libvirtd
> initialization.
> Libvirt loads shared drivers on libvirtd initialization step.
> For built-in drivers we can't set shared drivers, because they are
> not initialized yet.
> This patch adds function to set shared drivers after libvirtd init.
> ---
> daemon/libvirtd.c | 4 ++++
> src/libvirt.c | 41
> +++++++++++++++++++++++++++++++++++++++++
> src/libvirt_internal.h | 1 +
> src/libvirt_private.syms | 1 +
> 4 files changed, 47 insertions(+)
>
> diff --git a/daemon/libvirtd.c b/daemon/libvirtd.c
> index 250094b..aac1826 100644
> --- a/daemon/libvirtd.c
> +++ b/daemon/libvirtd.c
> @@ -431,6 +431,10 @@ static void daemonInitialize(void)
> bhyveRegister();
> # endif
> #endif
> +# ifdef WITH_VZ
> + virAssignSharedDrivers("vz");
> + virAssignSharedDrivers("Parallels");
> +# endif
> }
> diff --git a/src/libvirt.c b/src/libvirt.c
> index 25a0040..1763be7 100644
> --- a/src/libvirt.c
> +++ b/src/libvirt.c
> @@ -1433,3 +1433,44 @@ virTypedParameterValidateSet(virConnectPtr conn,
> }
> return 0;
> }
> +
> +/**
> + * virAssignSharedDrivers:
> + * @name: name of connection driver
> + *
> + * This function fills in any empty pointers for shared drivers
> + * in connect driver structure
> + *
> + * Returns 0 in case of success, -1 in case of error
> +*/
> +int
> +virAssignSharedDrivers(const char *name)
> +{
> + size_t i;
> +
> + if (name == NULL) {
> + virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> + _("Driver name must be specified"));
> + return -1;
> + }
> +
> + for (i = 0; i < virConnectDriverTabCount; i++) {
> + if (STREQ(virConnectDriverTab[i]->hypervisorDriver->name,
> name)) {
> + if (virConnectDriverTab[i]->interfaceDriver == NULL)
> + virConnectDriverTab[i]->interfaceDriver =
> virSharedInterfaceDriver;
> + if (virConnectDriverTab[i]->networkDriver == NULL)
> + virConnectDriverTab[i]->networkDriver =
> virSharedNetworkDriver;
> + if (virConnectDriverTab[i]->nodeDeviceDriver == NULL)
> + virConnectDriverTab[i]->nodeDeviceDriver =
> virSharedNodeDeviceDriver;
> + if (virConnectDriverTab[i]->nwfilterDriver == NULL)
> + virConnectDriverTab[i]->nwfilterDriver =
> virSharedNWFilterDriver;
> + if (virConnectDriverTab[i]->secretDriver == NULL)
> + virConnectDriverTab[i]->secretDriver =
> virSharedSecretDriver;
> + if (virConnectDriverTab[i]->storageDriver == NULL)
> + virConnectDriverTab[i]->storageDriver =
> virSharedStorageDriver;
> + break;
> + }
> + }
> +
> + return 0;
> +}
> diff --git a/src/libvirt_internal.h b/src/libvirt_internal.h
> index 1313b58..2a7227b 100644
> --- a/src/libvirt_internal.h
> +++ b/src/libvirt_internal.h
> @@ -289,4 +289,5 @@ virTypedParameterValidateSet(virConnectPtr conn,
> virTypedParameterPtr params,
> int nparams);
> +int virAssignSharedDrivers(const char *name);
> #endif
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index a835f18..a0fcdf5 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -943,6 +943,7 @@ virFDStreamSetInternalCloseCb;
> # libvirt_internal.h
> +virAssignSharedDrivers;
> virConnectSupportsFeature;
> virDomainMigrateBegin3;
> virDomainMigrateBegin3Params;
It looks like this patch is not necessary anymore as far as changes
proposed in the series [1] seem to be the better way to use shared
drivers.
Maxim
[1]
https://www.redhat.com/archives/libvir-list/2016-March/msg01357.html