[libvirt PATCH] remove HAL node device driver

Daniel Henrique Barboza danielhb413 at gmail.com
Fri Sep 4 17:59:33 UTC 2020


This makes meson complains about POTFILES.in:


po_check
--- /home/danielhb/kvm-project/libvirt/po/POTFILES.in
+++ /home/danielhb/kvm-project/libvirt/po/POTFILES.in
@@ -130,7 +130,6 @@
  @SRCDIR at src/network/bridge_driver_linux.c
  @SRCDIR at src/network/leaseshelper.c
  @SRCDIR at src/node_device/node_device_driver.c
- at SRCDIR@src/node_device/node_device_hal.c
  @SRCDIR at src/node_device/node_device_udev.c
  @SRCDIR at src/nwfilter/nwfilter_dhcpsnoop.c
  @SRCDIR at src/nwfilter/nwfilter_driver.c
make: Leaving directory '/home/danielhb/kvm-project/libvirt/build/build-aux'
--- stderr ---
build-aux/syntax-check.mk: you have changed the set of files with translatable diagnostics;
  apply the above patch
make: *** [/home/danielhb/kvm-project/libvirt/build-aux/syntax-check.mk:1798: sc_po_check] Error 1
-------

Full log written to /home/danielhb/kvm-project/libvirt/build/meson-logs/testlog.txt
FAILED: meson-test



Thanks,


DHB

On 9/3/20 9:46 AM, Pavel Hrdina wrote:
> There was one attempt a year ago done by me to drop HAL [1] but it was
> never resolved. There was another time when Dan suggested to drop HAL
> driver [2] but it was decided to keep it around in case device
> assignment will be implemented for FreeBSD and the fact that
> virt-manager uses node device driver [3].
> 
> I checked git history and code and it doesn't look like bhyve supports
> device assignment so from that POV it should not block removing HAL.
> 
> The argument about virt-manager is not strong as well because libvirt
> installed from FreeBSD packages doesn't have HAL support so it will not
> affect these users as well [4].
> 
> The only users affected by this change would be the ones compiling
> libvirt from GIT on FreeBSD.
> 
> I looked into alternatives and there is libudev-devd package on FreeBSD
> but unfortunately it doesn't work as it doesn't list any devices when
> used with libvirt. It provides libudev APIs using devd.
> 
> I also looked into devd directly and it provides some APIs but there are
> no APIs for device monitoring and events so that would have to be
> somehow done by libvirt.
> 
> Main motivation for dropping HAL support is to replace libdbus with GLib
> dbus implementation and it cannot be done with HAL driver present in
> libvirt because HAL APIs heavily depends on symbols provided by libdbus.
> 
> [1] <https://www.redhat.com/archives/libvir-list/2019-May/msg00203.html>
> [2] <https://www.redhat.com/archives/libvir-list/2016-April/msg00992.html>
> [3] <https://www.redhat.com/archives/libvir-list/2016-April/msg00994.html>
> [4] <https://svnweb.freebsd.org/ports/head/devel/libvirt/Makefile?view=markup>
> 
> Signed-off-by: Pavel Hrdina <phrdina at redhat.com>
> ---
>   meson.build                          |   9 +-
>   meson_options.txt                    |   1 -
>   src/node_device/meson.build          |   5 -
>   src/node_device/node_device_driver.c |  10 +-
>   src/node_device/node_device_driver.h |   5 -
>   src/node_device/node_device_hal.c    | 843 ---------------------------
>   src/node_device/node_device_hal.h    |  22 -
>   7 files changed, 3 insertions(+), 892 deletions(-)
>   delete mode 100644 src/node_device/node_device_hal.c
>   delete mode 100644 src/node_device/node_device_hal.h
> 
> diff --git a/meson.build b/meson.build
> index 1aad385ad1..d9c91d88dd 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -1079,12 +1079,6 @@ glusterfs_dep = dependency('glusterfs-api', version: '>=' + glusterfs_version, r
>   gnutls_version = '3.2.0'
>   gnutls_dep = dependency('gnutls', version: '>=' + gnutls_version)
>   
> -hal_version = '0.5.0'
> -hal_dep = dependency('hal', version: '>=' + hal_version, required: get_option('hal'))
> -if hal_dep.found()
> -  conf.set('WITH_HAL', 1)
> -endif
> -
>   # Check for BSD kvm (kernel memory interface)
>   if host_machine.system() == 'freebsd'
>     kvm_dep = cc.find_library('kvm')
> @@ -1728,7 +1722,7 @@ if not get_option('driver_network').disabled() and conf.has('WITH_LIBVIRTD') and
>     conf.set('WITH_NETWORK', 1)
>   endif
>   
> -if hal_dep.found() or udev_dep.found()
> +if udev_dep.found()
>     conf.set('WITH_NODE_DEVICES', 1)
>   endif
>   
> @@ -2433,7 +2427,6 @@ libs_summary = {
>     'glib_dep': glib_dep.found(),
>     'glusterfs': glusterfs_dep.found(),
>     'gnutls': gnutls_dep.found(),
> -  'hal': hal_dep.found(),
>     'libiscsi': libiscsi_dep.found(),
>     'libnl': libnl_dep.found(),
>     'libpcap': libpcap_dep.found(),
> diff --git a/meson_options.txt b/meson_options.txt
> index 7838630c1e..c8886e1430 100644
> --- a/meson_options.txt
> +++ b/meson_options.txt
> @@ -23,7 +23,6 @@ option('firewalld', type: 'feature', value: 'auto', description: 'firewalld supp
>   option('firewalld_zone', type: 'feature', value: 'auto', description: 'whether to install firewalld libvirt zone')
>   option('fuse', type: 'feature', value: 'auto', description: 'fuse support')
>   option('glusterfs', type: 'feature', value: 'auto', description: 'glusterfs support')
> -option('hal', type: 'feature', value: 'auto', description: 'hal support')
>   option('libiscsi', type: 'feature', value: 'auto', description: 'libiscsi support')
>   option('libpcap', type: 'feature', value: 'auto', description: 'libpcap support')
>   option('libssh', type: 'feature', value: 'auto', description: 'libssh support')
> diff --git a/src/node_device/meson.build b/src/node_device/meson.build
> index 5953c6b8ed..c4e4c3906b 100644
> --- a/src/node_device/meson.build
> +++ b/src/node_device/meson.build
> @@ -4,10 +4,6 @@ node_device_driver_sources = [
>   
>   stateful_driver_source_files += files(node_device_driver_sources)
>   
> -if conf.has('WITH_HAL')
> -  node_device_driver_sources += 'node_device_hal.c'
> -endif
> -
>   if conf.has('WITH_UDEV')
>     node_device_driver_sources += 'node_device_udev.c'
>   endif
> @@ -22,7 +18,6 @@ if conf.has('WITH_NODE_DEVICES')
>       ],
>       dependencies: [
>         access_dep,
> -      hal_dep,
>         libnl_dep,
>         pciaccess_dep,
>         src_dep,
> diff --git a/src/node_device/node_device_driver.c b/src/node_device/node_device_driver.c
> index e89c8b0ee5..d5f5611361 100644
> --- a/src/node_device/node_device_driver.c
> +++ b/src/node_device/node_device_driver.c
> @@ -35,7 +35,6 @@
>   #include "node_device_conf.h"
>   #include "node_device_event.h"
>   #include "node_device_driver.h"
> -#include "node_device_hal.h"
>   #include "node_device_util.h"
>   #include "virvhba.h"
>   #include "viraccessapicheck.h"
> @@ -97,14 +96,13 @@ int nodeConnectIsAlive(virConnectPtr conn G_GNUC_UNUSED)
>       return 1;
>   }
>   
> -#if defined (__linux__) && ( defined (WITH_HAL) || defined(WITH_UDEV))
> +#if defined (__linux__) && defined(WITH_UDEV)
>   /* NB: It was previously believed that changes in driver name were
>    * relayed to libvirt as "change" events by udev, and the udev event
>    * notification is setup to recognize such events and effectively
>    * recreate the device entry in the cache. However, neither the kernel
>    * nor udev sends such an event, so it is necessary to manually update
> - * the driver name for a device each time its entry is used, both for
> - * udev *and* HAL backends.
> + * the driver name for a device each time its entry is used.
>    */
>   static int
>   nodeDeviceUpdateDriverName(virNodeDeviceDefPtr def)
> @@ -925,9 +923,5 @@ nodedevRegister(void)
>   {
>   #ifdef WITH_UDEV
>       return udevNodeRegister();
> -#else
> -# ifdef WITH_HAL
> -    return halNodeRegister();
> -# endif
>   #endif
>   }
> diff --git a/src/node_device/node_device_driver.h b/src/node_device/node_device_driver.h
> index be5d397828..2113d2b0a5 100644
> --- a/src/node_device/node_device_driver.h
> +++ b/src/node_device/node_device_driver.h
> @@ -28,11 +28,6 @@
>   
>   #define LINUX_NEW_DEVICE_WAIT_TIME 60
>   
> -#ifdef WITH_HAL
> -int
> -halNodeRegister(void);
> -#endif
> -
>   #ifdef WITH_UDEV
>   int
>   udevNodeRegister(void);
> diff --git a/src/node_device/node_device_hal.c b/src/node_device/node_device_hal.c
> deleted file mode 100644
> index 53a49ba2aa..0000000000
> --- a/src/node_device/node_device_hal.c
> +++ /dev/null
> @@ -1,843 +0,0 @@
> -/*
> - * node_device_hal.c: node device enumeration - HAL-based implementation
> - *
> - * Copyright (C) 2011-2015 Red Hat, Inc.
> - * Copyright (C) 2008 Virtual Iron Software, Inc.
> - * Copyright (C) 2008 David F. Lively
> - *
> - * This library is free software; you can redistribute it and/or
> - * modify it under the terms of the GNU Lesser General Public
> - * License as published by the Free Software Foundation; either
> - * version 2.1 of the License, or (at your option) any later version.
> - *
> - * This library is distributed in the hope that it will be useful,
> - * but WITHOUT ANY WARRANTY; without even the implied warranty of
> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> - * Lesser General Public License for more details.
> - *
> - * You should have received a copy of the GNU Lesser General Public
> - * License along with this library.  If not, see
> - * <http://www.gnu.org/licenses/>.
> - */
> -
> -#include <config.h>
> -
> -#include <libhal.h>
> -
> -#include "node_device_conf.h"
> -#include "node_device_driver.h"
> -#include "node_device_hal.h"
> -#include "virerror.h"
> -#include "driver.h"
> -#include "datatypes.h"
> -#include "viralloc.h"
> -#include "viruuid.h"
> -#include "virfile.h"
> -#include "virpci.h"
> -#include "virpidfile.h"
> -#include "virlog.h"
> -#include "virdbus.h"
> -#include "virstring.h"
> -#include "virutil.h"
> -
> -#include "configmake.h"
> -
> -#define VIR_FROM_THIS VIR_FROM_NODEDEV
> -
> -VIR_LOG_INIT("node_device.node_device_hal");
> -
> -/*
> - * Host device enumeration (HAL implementation)
> - */
> -
> -#define DRV_STATE_HAL_CTX(ds) ((LibHalContext *)((ds)->privateData))
> -
> -
> -static const char *
> -hal_name(const char *udi)
> -{
> -    const char *name = strrchr(udi, '/');
> -    if (name)
> -        return name + 1;
> -    return udi;
> -}
> -
> -
> -static int
> -get_str_prop(LibHalContext *ctxt, const char *udi,
> -             const char *prop, char **val_p)
> -{
> -    char *val = libhal_device_get_property_string(ctxt, udi, prop, NULL);
> -
> -    if (val) {
> -        if (*val) {
> -            *val_p = val;
> -            return 0;
> -        } else {
> -            /* Treat empty strings as NULL values */
> -            VIR_FREE(val);
> -        }
> -    }
> -
> -    return -1;
> -}
> -
> -static int
> -get_int_prop(LibHalContext *ctxt, const char *udi,
> -             const char *prop, int *val_p)
> -{
> -    DBusError err;
> -    int val;
> -    int rv;
> -
> -    dbus_error_init(&err);
> -    val = libhal_device_get_property_int(ctxt, udi, prop, &err);
> -    rv = dbus_error_is_set(&err);
> -    dbus_error_free(&err);
> -    if (rv == 0)
> -        *val_p = val;
> -
> -    return rv;
> -}
> -
> -static int
> -get_bool_prop(LibHalContext *ctxt, const char *udi,
> -              const char *prop, int *val_p)
> -{
> -    DBusError err;
> -    int val;
> -    int rv;
> -
> -    dbus_error_init(&err);
> -    val = libhal_device_get_property_bool(ctxt, udi, prop, &err);
> -    rv = dbus_error_is_set(&err);
> -    dbus_error_free(&err);
> -    if (rv == 0)
> -        *val_p = val;
> -
> -    return rv;
> -}
> -
> -static int
> -get_uint64_prop(LibHalContext *ctxt, const char *udi,
> -                const char *prop, unsigned long long *val_p)
> -{
> -    DBusError err;
> -    unsigned long long val;
> -    int rv;
> -
> -    dbus_error_init(&err);
> -    val = libhal_device_get_property_uint64(ctxt, udi, prop, &err);
> -    rv = dbus_error_is_set(&err);
> -    dbus_error_free(&err);
> -    if (rv == 0)
> -        *val_p = val;
> -
> -    return rv;
> -}
> -
> -static int
> -gather_pci_cap(LibHalContext *ctx, const char *udi,
> -               virNodeDevCapDataPtr d)
> -{
> -    char *sysfs_path;
> -
> -    if (get_str_prop(ctx, udi, "pci.linux.sysfs_path", &sysfs_path) == 0) {
> -        char *p = strrchr(sysfs_path, '/');
> -        if (p) {
> -            ignore_value(virStrToLong_ui(p+1, &p, 16, &d->pci_dev.domain));
> -            ignore_value(virStrToLong_ui(p+1, &p, 16, &d->pci_dev.bus));
> -            ignore_value(virStrToLong_ui(p+1, &p, 16, &d->pci_dev.slot));
> -            ignore_value(virStrToLong_ui(p+1, &p, 16, &d->pci_dev.function));
> -        }
> -
> -        if (virNodeDeviceGetPCIDynamicCaps(sysfs_path, &d->pci_dev) < 0) {
> -            VIR_FREE(sysfs_path);
> -            return -1;
> -        }
> -        VIR_FREE(sysfs_path);
> -    }
> -
> -    (void)get_int_prop(ctx, udi, "pci.vendor_id", (int *)&d->pci_dev.vendor);
> -    if (get_str_prop(ctx, udi, "pci.vendor", &d->pci_dev.vendor_name) != 0)
> -        (void)get_str_prop(ctx, udi, "info.vendor", &d->pci_dev.vendor_name);
> -    (void)get_int_prop(ctx, udi, "pci.product_id", (int *)&d->pci_dev.product);
> -    if (get_str_prop(ctx, udi, "pci.product", &d->pci_dev.product_name) != 0)
> -        (void)get_str_prop(ctx, udi, "info.product", &d->pci_dev.product_name);
> -
> -    return 0;
> -}
> -
> -
> -static int
> -gather_usb_cap(LibHalContext *ctx, const char *udi,
> -               virNodeDevCapDataPtr d)
> -{
> -    (void)get_int_prop(ctx, udi, "usb.interface.number",
> -                       (int *)&d->usb_if.number);
> -    (void)get_int_prop(ctx, udi, "usb.interface.class",
> -                       (int *)&d->usb_if.klass);
> -    (void)get_int_prop(ctx, udi, "usb.interface.subclass",
> -                       (int *)&d->usb_if.subclass);
> -    (void)get_int_prop(ctx, udi, "usb.interface.protocol",
> -                       (int *)&d->usb_if.protocol);
> -    (void)get_str_prop(ctx, udi, "usb.interface.description",
> -                       &d->usb_if.description);
> -    return 0;
> -}
> -
> -
> -static int
> -gather_usb_device_cap(LibHalContext *ctx, const char *udi,
> -                      virNodeDevCapDataPtr d)
> -{
> -    (void)get_int_prop(ctx, udi, "usb_device.bus_number",
> -                       (int *)&d->usb_dev.bus);
> -    (void)get_int_prop(ctx, udi, "usb_device.linux.device_number",
> -                       (int *)&d->usb_dev.device);
> -    (void)get_int_prop(ctx, udi, "usb_device.vendor_id",
> -                       (int *)&d->usb_dev.vendor);
> -    if (get_str_prop(ctx, udi, "usb_device.vendor",
> -                     &d->usb_dev.vendor_name) != 0)
> -        (void)get_str_prop(ctx, udi, "info.vendor", &d->usb_dev.vendor_name);
> -    (void)get_int_prop(ctx, udi, "usb_device.product_id",
> -                       (int *)&d->usb_dev.product);
> -    if (get_str_prop(ctx, udi, "usb_device.product",
> -                     &d->usb_dev.product_name) != 0)
> -        (void)get_str_prop(ctx, udi, "info.product", &d->usb_dev.product_name);
> -    return 0;
> -}
> -
> -
> -static int
> -gather_net_cap(LibHalContext *ctx, const char *udi,
> -               virNodeDevCapDataPtr d)
> -{
> -    unsigned long long dummy;
> -    (void)get_str_prop(ctx, udi, "net.interface", &d->net.ifname);
> -    (void)get_str_prop(ctx, udi, "net.address", &d->net.address);
> -    if (get_uint64_prop(ctx, udi, "net.80203.mac_address",
> -                        &dummy) == 0)
> -        d->net.subtype = VIR_NODE_DEV_CAP_NET_80203;
> -    else if (get_uint64_prop(ctx, udi, "net.80211.mac_address",
> -                             &dummy) == 0)
> -        d->net.subtype = VIR_NODE_DEV_CAP_NET_80211;
> -    else
> -        d->net.subtype = VIR_NODE_DEV_CAP_NET_LAST;
> -
> -    return 0;
> -}
> -
> -
> -static int
> -gather_scsi_host_cap(LibHalContext *ctx, const char *udi,
> -                     virNodeDevCapDataPtr d)
> -{
> -    (void)get_int_prop(ctx, udi, "scsi_host.host", (int *)&d->scsi_host.host);
> -
> -    return virNodeDeviceGetSCSIHostCaps(&d->scsi_host);
> -}
> -
> -
> -static int
> -gather_scsi_cap(LibHalContext *ctx, const char *udi,
> -                virNodeDevCapDataPtr d)
> -{
> -    (void)get_int_prop(ctx, udi, "scsi.host", (int *)&d->scsi.host);
> -    (void)get_int_prop(ctx, udi, "scsi.bus", (int *)&d->scsi.bus);
> -    (void)get_int_prop(ctx, udi, "scsi.target", (int *)&d->scsi.target);
> -    (void)get_int_prop(ctx, udi, "scsi.lun", (int *)&d->scsi.lun);
> -    (void)get_str_prop(ctx, udi, "scsi.type", &d->scsi.type);
> -    return 0;
> -}
> -
> -
> -static int
> -gather_storage_cap(LibHalContext *ctx, const char *udi,
> -                   virNodeDevCapDataPtr d)
> -{
> -    int val;
> -    (void)get_str_prop(ctx, udi, "block.device", &d->storage.block);
> -    (void)get_str_prop(ctx, udi, "storage.bus", &d->storage.bus);
> -    (void)get_str_prop(ctx, udi, "storage.drive_type", &d->storage.drive_type);
> -    (void)get_str_prop(ctx, udi, "storage.model", &d->storage.model);
> -    (void)get_str_prop(ctx, udi, "storage.vendor", &d->storage.vendor);
> -    (void)get_str_prop(ctx, udi, "storage.serial", &d->storage.serial);
> -    if (get_bool_prop(ctx, udi, "storage.removable", &val) == 0 && val) {
> -        d->storage.flags |= VIR_NODE_DEV_CAP_STORAGE_REMOVABLE;
> -        if (get_bool_prop(ctx, udi, "storage.removable.media_available",
> -                          &val) == 0 && val) {
> -            d->storage.flags |=
> -                VIR_NODE_DEV_CAP_STORAGE_REMOVABLE_MEDIA_AVAILABLE;
> -            (void)get_uint64_prop(ctx, udi, "storage.removable.media_size",
> -                                  &d->storage.removable_media_size);
> -        }
> -    } else {
> -        (void)get_uint64_prop(ctx, udi, "storage.size", &d->storage.size);
> -    }
> -    if (get_bool_prop(ctx, udi, "storage.hotpluggable", &val) == 0 && val)
> -        d->storage.flags |= VIR_NODE_DEV_CAP_STORAGE_HOTPLUGGABLE;
> -    return 0;
> -}
> -
> -static int
> -gather_scsi_generic_cap(LibHalContext *ctx, const char *udi,
> -                        virNodeDevCapDataPtr d)
> -{
> -    (void)get_str_prop(ctx, udi, "scsi_generic.device", &d->sg.path);
> -    return 0;
> -}
> -
> -
> -static int
> -gather_system_cap(LibHalContext *ctx, const char *udi,
> -                  virNodeDevCapDataPtr d)
> -{
> -    char *uuidstr;
> -
> -    (void)get_str_prop(ctx, udi, "system.product", &d->system.product_name);
> -    (void)get_str_prop(ctx, udi, "system.hardware.vendor",
> -                       &d->system.hardware.vendor_name);
> -    (void)get_str_prop(ctx, udi, "system.hardware.version",
> -                       &d->system.hardware.version);
> -    (void)get_str_prop(ctx, udi, "system.hardware.serial",
> -                       &d->system.hardware.serial);
> -    if (get_str_prop(ctx, udi, "system.hardware.uuid", &uuidstr) == 0) {
> -        ignore_value(virUUIDParse(uuidstr, d->system.hardware.uuid));
> -        VIR_FREE(uuidstr);
> -    }
> -    (void)get_str_prop(ctx, udi, "system.firmware.vendor",
> -                       &d->system.firmware.vendor_name);
> -    (void)get_str_prop(ctx, udi, "system.firmware.version",
> -                       &d->system.firmware.version);
> -    (void)get_str_prop(ctx, udi, "system.firmware.release_date",
> -                       &d->system.firmware.release_date);
> -    return 0;
> -}
> -
> -
> -struct _caps_tbl_entry {
> -    const char *cap_name;
> -    virNodeDevCapType type;
> -    int (*gather_fn)(LibHalContext *ctx,
> -                     const char *udi,
> -                     virNodeDevCapDataPtr data);
> -};
> -
> -typedef struct _caps_tbl_entry caps_tbl_entry;
> -
> -static caps_tbl_entry caps_tbl[] = {
> -    { "system",     VIR_NODE_DEV_CAP_SYSTEM,        gather_system_cap },
> -    { "pci",        VIR_NODE_DEV_CAP_PCI_DEV,       gather_pci_cap },
> -    { "usb",        VIR_NODE_DEV_CAP_USB_INTERFACE, gather_usb_cap },
> -    { "usb_device", VIR_NODE_DEV_CAP_USB_DEV,       gather_usb_device_cap },
> -    { "net",        VIR_NODE_DEV_CAP_NET,           gather_net_cap },
> -    { "scsi_host",  VIR_NODE_DEV_CAP_SCSI_HOST,     gather_scsi_host_cap },
> -    { "scsi",       VIR_NODE_DEV_CAP_SCSI,          gather_scsi_cap },
> -    { "storage",    VIR_NODE_DEV_CAP_STORAGE,       gather_storage_cap },
> -    { "scsi_generic", VIR_NODE_DEV_CAP_SCSI_GENERIC, gather_scsi_generic_cap },
> -};
> -
> -
> -/* qsort/bsearch string comparator */
> -static int
> -cmpstringp(const void *p1, const void *p2)
> -{
> -    /* from man 3 qsort */
> -    return strcmp(* (char * const *) p1, * (char * const *) p2);
> -}
> -
> -
> -static int
> -gather_capability(LibHalContext *ctx, const char *udi,
> -                  const char *cap_name,
> -                  virNodeDevCapsDefPtr *caps_p)
> -{
> -    caps_tbl_entry *entry;
> -
> -    entry = bsearch(&cap_name, caps_tbl, G_N_ELEMENTS(caps_tbl),
> -                    sizeof(caps_tbl[0]), cmpstringp);
> -
> -    if (entry) {
> -        virNodeDevCapsDefPtr caps;
> -        if (VIR_ALLOC(caps) < 0)
> -            return ENOMEM;
> -        caps->data.type = entry->type;
> -        if (entry->gather_fn) {
> -            int rv = (*entry->gather_fn)(ctx, udi, &caps->data);
> -            if (rv != 0) {
> -                virNodeDevCapsDefFree(caps);
> -                return rv;
> -            }
> -        }
> -        caps->next = *caps_p;
> -        *caps_p = caps;
> -    }
> -
> -    return 0;
> -}
> -
> -
> -static int
> -gather_capabilities(LibHalContext *ctx, const char *udi,
> -                    virNodeDevCapsDefPtr *caps_p)
> -{
> -    char *bus_name = NULL;
> -    virNodeDevCapsDefPtr caps = NULL;
> -    char **hal_cap_names = NULL;
> -    int rv;
> -    size_t i;
> -
> -    if (STREQ(udi, "/org/freedesktop/Hal/devices/computer")) {
> -        rv = gather_capability(ctx, udi, "system", &caps);
> -        if (rv != 0)
> -            goto failure;
> -    }
> -
> -    if (get_str_prop(ctx, udi, "info.subsystem", &bus_name) == 0 ||
> -        get_str_prop(ctx, udi, "linux.subsystem", &bus_name) == 0) {
> -        rv = gather_capability(ctx, udi, bus_name, &caps);
> -        if (rv != 0)
> -            goto failure;
> -    }
> -
> -    hal_cap_names = libhal_device_get_property_strlist(ctx, udi,
> -                                                       "info.capabilities",
> -                                                       NULL);
> -    if (hal_cap_names) {
> -        for (i = 0; hal_cap_names[i]; i++) {
> -            if (! (bus_name && STREQ(hal_cap_names[i], bus_name))) {
> -                rv = gather_capability(ctx, udi, hal_cap_names[i], &caps);
> -                if (rv != 0)
> -                    goto failure;
> -            }
> -        }
> -        for (i = 0; hal_cap_names[i]; i++)
> -            VIR_FREE(hal_cap_names[i]);
> -        VIR_FREE(hal_cap_names);
> -    }
> -    VIR_FREE(bus_name);
> -
> -    *caps_p = caps;
> -    return 0;
> -
> - failure:
> -    VIR_FREE(bus_name);
> -    if (hal_cap_names) {
> -        for (i = 0; hal_cap_names[i]; i++)
> -            VIR_FREE(hal_cap_names[i]);
> -        VIR_FREE(hal_cap_names);
> -    }
> -    while (caps) {
> -        virNodeDevCapsDefPtr next = caps->next;
> -        virNodeDevCapsDefFree(caps);
> -        caps = next;
> -    }
> -    return rv;
> -}
> -
> -static void
> -dev_create(const char *udi)
> -{
> -    LibHalContext *ctx;
> -    char *parent_key = NULL;
> -    virNodeDeviceObjPtr obj = NULL;
> -    virNodeDeviceDefPtr def = NULL;
> -    virNodeDeviceDefPtr objdef;
> -    const char *name = hal_name(udi);
> -    int rv;
> -    char *devicePath = NULL;
> -
> -    nodeDeviceLock();
> -    ctx = DRV_STATE_HAL_CTX(driver);
> -
> -    if (VIR_ALLOC(def) < 0)
> -        goto failure;
> -
> -    def->name = g_strdup(name);
> -
> -    if (get_str_prop(ctx, udi, "info.parent", &parent_key) == 0) {
> -        def->parent = g_strdup(hal_name(parent_key));
> -        VIR_FREE(parent_key);
> -    }
> -
> -    rv = gather_capabilities(ctx, udi, &def->caps);
> -    if (rv != 0) goto failure;
> -
> -    if (def->caps == NULL)
> -        goto cleanup;
> -
> -    /* Some devices don't have a path in sysfs, so ignore failure */
> -    (void)get_str_prop(ctx, udi, "linux.sysfs_path", &devicePath);
> -
> -    if (!(obj = virNodeDeviceObjListAssignDef(driver->devs, def))) {
> -        VIR_FREE(devicePath);
> -        goto failure;
> -    }
> -    objdef = virNodeDeviceObjGetDef(obj);
> -
> -    objdef->sysfs_path = devicePath;
> -
> -    virNodeDeviceObjEndAPI(&obj);
> -
> -    nodeDeviceUnlock();
> -    return;
> -
> - failure:
> -    VIR_DEBUG("FAILED TO ADD dev %s", name);
> - cleanup:
> -    virNodeDeviceDefFree(def);
> -    nodeDeviceUnlock();
> -}
> -
> -static void
> -dev_refresh(const char *udi)
> -{
> -    const char *name = hal_name(udi);
> -    virNodeDeviceObjPtr obj;
> -
> -    if ((obj = virNodeDeviceObjListFindByName(driver->devs, name))) {
> -        /* Simply "rediscover" device -- incrementally handling changes
> -         * to sub-capabilities (like net.80203) is nasty ... so avoid it.
> -         */
> -        virNodeDeviceObjListRemove(driver->devs, obj);
> -        virObjectUnref(obj);
> -        dev_create(udi);
> -    } else {
> -        VIR_DEBUG("no device named %s", name);
> -    }
> -}
> -
> -static void
> -device_added(LibHalContext *ctx G_GNUC_UNUSED,
> -             const char *udi)
> -{
> -    VIR_DEBUG("%s", hal_name(udi));
> -    dev_create(udi);
> -}
> -
> -
> -static void
> -device_removed(LibHalContext *ctx G_GNUC_UNUSED,
> -               const char *udi)
> -{
> -    const char *name = hal_name(udi);
> -    virNodeDeviceObjPtr obj;
> -
> -    obj = virNodeDeviceObjListFindByName(driver->devs, name);
> -    VIR_DEBUG("%s", name);
> -    if (obj)
> -        virNodeDeviceObjListRemove(driver->devs, obj);
> -    else
> -        VIR_DEBUG("no device named %s", name);
> -    virObjectUnref(obj);
> -}
> -
> -
> -static void
> -device_cap_added(LibHalContext *ctx,
> -                 const char *udi, const char *cap)
> -{
> -    const char *name = hal_name(udi);
> -    virNodeDeviceObjPtr obj;
> -    virNodeDeviceDefPtr def;
> -
> -    VIR_DEBUG("%s %s", cap, name);
> -    if ((obj = virNodeDeviceObjListFindByName(driver->devs, name))) {
> -        def = virNodeDeviceObjGetDef(obj);
> -        (void)gather_capability(ctx, udi, cap, &def->caps);
> -        virNodeDeviceObjEndAPI(&obj);
> -    } else {
> -        VIR_DEBUG("no device named %s", name);
> -    }
> -}
> -
> -
> -static void
> -device_cap_lost(LibHalContext *ctx G_GNUC_UNUSED,
> -                const char *udi,
> -                const char *cap)
> -{
> -    const char *name = hal_name(udi);
> -    VIR_DEBUG("%s %s", cap, name);
> -
> -    dev_refresh(udi);
> -}
> -
> -
> -static void
> -device_prop_modified(LibHalContext *ctx G_GNUC_UNUSED,
> -                     const char *udi,
> -                     const char *key,
> -                     dbus_bool_t is_removed G_GNUC_UNUSED,
> -                     dbus_bool_t is_added G_GNUC_UNUSED)
> -{
> -    const char *name = hal_name(udi);
> -    VIR_DEBUG("%s %s", name, key);
> -
> -    dev_refresh(udi);
> -}
> -
> -
> -static int
> -nodeStateInitialize(bool privileged G_GNUC_UNUSED,
> -                    const char *root,
> -                    virStateInhibitCallback callback G_GNUC_UNUSED,
> -                    void *opaque G_GNUC_UNUSED)
> -{
> -    LibHalContext *hal_ctx = NULL;
> -    char **udi = NULL;
> -    int num_devs;
> -    size_t i;
> -    int ret = VIR_DRV_STATE_INIT_ERROR;
> -    DBusConnection *sysbus;
> -    DBusError err;
> -
> -    if (root != NULL) {
> -        virReportError(VIR_ERR_INVALID_ARG, "%s",
> -                       _("Driver does not support embedded mode"));
> -        return -1;
> -    }
> -
> -    /* Ensure caps_tbl is sorted by capability name */
> -    qsort(caps_tbl, G_N_ELEMENTS(caps_tbl), sizeof(caps_tbl[0]),
> -          cmpstringp);
> -
> -    if (VIR_ALLOC(driver) < 0)
> -        return VIR_DRV_STATE_INIT_ERROR;
> -
> -    driver->lockFD = -1;
> -    if (virMutexInit(&driver->lock) < 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) {
> -        driver->stateDir = g_strdup_printf("%s/libvirt/nodedev", RUNSTATEDIR);
> -    } else {
> -        g_autofree char *rundir = NULL;
> -
> -        rundir = virGetUserRuntimeDirectory();
> -        driver->stateDir = g_strdup_printf("%s/nodedev/run", rundir);
> -    }
> -
> -    if (virFileMakePathWithMode(driver->stateDir, S_IRWXU) < 0) {
> -        virReportSystemError(errno, _("cannot create state directory '%s'"),
> -                             driver->stateDir);
> -        goto failure;
> -    }
> -
> -    if ((driver->lockFD =
> -         virPidFileAcquire(driver->stateDir, "driver", false, getpid())) < 0)
> -        goto failure;
> -
> -    if (!(driver->devs = virNodeDeviceObjListNew()))
> -        goto failure;
> -
> -    dbus_error_init(&err);
> -    if (!(sysbus = virDBusGetSystemBus())) {
> -        virReportError(VIR_ERR_INTERNAL_ERROR,
> -                       _("DBus not available, disabling HAL driver: %s"),
> -                       virGetLastErrorMessage());
> -        ret = VIR_DRV_STATE_INIT_SKIPPED;
> -        goto failure;
> -    }
> -
> -    hal_ctx = libhal_ctx_new();
> -    if (hal_ctx == NULL) {
> -        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> -                       _("libhal_ctx_new returned NULL"));
> -        goto failure;
> -    }
> -
> -    if (!libhal_ctx_set_dbus_connection(hal_ctx, sysbus)) {
> -        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> -                       _("libhal_ctx_set_dbus_connection failed"));
> -        goto failure;
> -    }
> -    if (!libhal_ctx_init(hal_ctx, &err)) {
> -        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> -                       _("libhal_ctx_init failed, haldaemon is probably "
> -                         "not running"));
> -        /* We don't want to show a fatal error here,
> -           otherwise entire libvirtd shuts down when
> -           hald isn't running */
> -        ret = VIR_DRV_STATE_INIT_SKIPPED;
> -        goto failure;
> -    }
> -
> -    /* Populate with known devices */
> -    driver->privateData = hal_ctx;
> -
> -    /* We need to unlock state now, since setting these callbacks cause
> -     * a dbus RPC call, and while this call is waiting for the reply,
> -     * a signal may already arrive, triggering the callback and thus
> -     * requiring the lock !
> -     */
> -    nodeDeviceUnlock();
> -
> -    /* Register HAL event callbacks */
> -    if (!libhal_ctx_set_device_added(hal_ctx, device_added) ||
> -        !libhal_ctx_set_device_removed(hal_ctx, device_removed) ||
> -        !libhal_ctx_set_device_new_capability(hal_ctx, device_cap_added) ||
> -        !libhal_ctx_set_device_lost_capability(hal_ctx, device_cap_lost) ||
> -        !libhal_ctx_set_device_property_modified(hal_ctx, device_prop_modified) ||
> -        !libhal_device_property_watch_all(hal_ctx, &err)) {
> -        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> -                       _("setting up HAL callbacks failed"));
> -        goto failure;
> -    }
> -
> -    udi = libhal_get_all_devices(hal_ctx, &num_devs, &err);
> -    if (udi == NULL) {
> -        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> -                       _("libhal_get_all_devices failed"));
> -        goto failure;
> -    }
> -    for (i = 0; i < num_devs; i++) {
> -        dev_create(udi[i]);
> -        VIR_FREE(udi[i]);
> -    }
> -    VIR_FREE(udi);
> -
> -    nodeDeviceLock();
> -    driver->initialized = true;
> -    nodeDeviceUnlock();
> -    virCondBroadcast(&driver->initCond);
> -
> -    return VIR_DRV_STATE_INIT_COMPLETE;
> -
> - failure:
> -    if (dbus_error_is_set(&err)) {
> -        virReportError(VIR_ERR_INTERNAL_ERROR,
> -                       _("%s: %s"), err.name, err.message);
> -        dbus_error_free(&err);
> -    }
> -    virNodeDeviceObjListFree(driver->devs);
> -    if (hal_ctx)
> -        (void)libhal_ctx_free(hal_ctx);
> -    nodeDeviceUnlock();
> -    VIR_FREE(driver);
> -
> -    return ret;
> -}
> -
> -
> -static int
> -nodeStateCleanup(void)
> -{
> -    if (driver) {
> -        nodeDeviceLock();
> -        LibHalContext *hal_ctx = DRV_STATE_HAL_CTX(driver);
> -        virNodeDeviceObjListFree(driver->devs);
> -        (void)libhal_ctx_shutdown(hal_ctx, NULL);
> -        (void)libhal_ctx_free(hal_ctx);
> -        if (driver->lockFD != -1)
> -            virPidFileRelease(driver->stateDir, "driver", driver->lockFD);
> -
> -        VIR_FREE(driver->stateDir);
> -        nodeDeviceUnlock();
> -        virCondDestroy(&driver->initCond);
> -        virMutexDestroy(&driver->lock);
> -        VIR_FREE(driver);
> -        return 0;
> -    }
> -    return -1;
> -}
> -
> -
> -static int
> -nodeStateReload(void)
> -{
> -    DBusError err;
> -    char **udi = NULL;
> -    int num_devs;
> -    size_t i;
> -    LibHalContext *hal_ctx;
> -
> -    VIR_INFO("Reloading HAL device state");
> -    nodeDeviceLock();
> -    VIR_INFO("Removing existing objects");
> -    virNodeDeviceObjListFree(driver->devs);
> -    nodeDeviceUnlock();
> -
> -    hal_ctx = DRV_STATE_HAL_CTX(driver);
> -    VIR_INFO("Creating new objects");
> -    dbus_error_init(&err);
> -    udi = libhal_get_all_devices(hal_ctx, &num_devs, &err);
> -    if (udi == NULL) {
> -        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> -                       _("libhal_get_all_devices failed"));
> -        return -1;
> -    }
> -    for (i = 0; i < num_devs; i++) {
> -        dev_create(udi[i]);
> -        VIR_FREE(udi[i]);
> -    }
> -    VIR_FREE(udi);
> -    VIR_INFO("HAL device reload complete");
> -
> -    return 0;
> -}
> -
> -
> -static virNodeDeviceDriver halNodeDeviceDriver = {
> -    .name = "HAL",
> -    .nodeNumOfDevices = nodeNumOfDevices, /* 0.5.0 */
> -    .nodeListDevices = nodeListDevices, /* 0.5.0 */
> -    .connectListAllNodeDevices = nodeConnectListAllNodeDevices, /* 0.10.2 */
> -    .nodeDeviceLookupByName = nodeDeviceLookupByName, /* 0.5.0 */
> -    .nodeDeviceLookupSCSIHostByWWN = nodeDeviceLookupSCSIHostByWWN, /* 1.0.2 */
> -    .nodeDeviceGetXMLDesc = nodeDeviceGetXMLDesc, /* 0.5.0 */
> -    .nodeDeviceGetParent = nodeDeviceGetParent, /* 0.5.0 */
> -    .nodeDeviceNumOfCaps = nodeDeviceNumOfCaps, /* 0.5.0 */
> -    .nodeDeviceListCaps = nodeDeviceListCaps, /* 0.5.0 */
> -    .nodeDeviceCreateXML = nodeDeviceCreateXML, /* 0.6.5 */
> -    .nodeDeviceDestroy = nodeDeviceDestroy, /* 0.6.5 */
> -};
> -
> -
> -static virHypervisorDriver halHypervisorDriver = {
> -    .name = "nodedev",
> -    .connectOpen = nodeConnectOpen, /* 4.1.0 */
> -    .connectClose = nodeConnectClose, /* 4.1.0 */
> -    .connectIsEncrypted = nodeConnectIsEncrypted, /* 4.1.0 */
> -    .connectIsSecure = nodeConnectIsSecure, /* 4.1.0 */
> -    .connectIsAlive = nodeConnectIsAlive, /* 4.1.0 */
> -};
> -
> -
> -static virConnectDriver halConnectDriver = {
> -    .localOnly = true,
> -    .uriSchemes = (const char *[]){ "nodedev", NULL },
> -    .hypervisorDriver = &halHypervisorDriver,
> -    .nodeDeviceDriver = &halNodeDeviceDriver,
> -};
> -
> -
> -static virStateDriver halStateDriver = {
> -    .name = "HAL",
> -    .stateInitialize = nodeStateInitialize, /* 0.5.0 */
> -    .stateCleanup = nodeStateCleanup, /* 0.5.0 */
> -    .stateReload = nodeStateReload, /* 0.5.0 */
> -};
> -
> -int
> -halNodeRegister(void)
> -{
> -    if (virRegisterConnectDriver(&halConnectDriver, false) < 0)
> -        return -1;
> -    if (virSetSharedNodeDeviceDriver(&halNodeDeviceDriver) < 0)
> -        return -1;
> -    return virRegisterStateDriver(&halStateDriver);
> -}
> diff --git a/src/node_device/node_device_hal.h b/src/node_device/node_device_hal.h
> deleted file mode 100644
> index 5e9c25ae34..0000000000
> --- a/src/node_device/node_device_hal.h
> +++ /dev/null
> @@ -1,22 +0,0 @@
> -/*
> - * node_device_hal.h: node device enumeration - HAL-based implementation
> - *
> - * Copyright (C) 2009 Red Hat, Inc.
> - *
> - * This library is free software; you can redistribute it and/or
> - * modify it under the terms of the GNU Lesser General Public
> - * License as published by the Free Software Foundation; either
> - * version 2.1 of the License, or (at your option) any later version.
> - *
> - * This library is distributed in the hope that it will be useful,
> - * but WITHOUT ANY WARRANTY; without even the implied warranty of
> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> - * Lesser General Public License for more details.
> - *
> - * You should have received a copy of the GNU Lesser General Public
> - * License along with this library.  If not, see
> - * <http://www.gnu.org/licenses/>.
> - *
> - */
> -
> -#pragma once
> 




More information about the libvir-list mailing list