[libvirt] node device libudev backend second look
Chris Lalancette
clalance at redhat.com
Fri Oct 16 07:47:28 UTC 2009
Dave Allan wrote:
> Attached is a patch against the current head containing an
> implementation of node device enumeration using libudev. It is complete
> except for the monitor, but I'm submitting it now as I have a few
> questions about the implementation that I'd like advice on. They are
> marked XXX in comments in the patch.
>
> The other thing that's not clear to me is how the code generates the
> tree structure for nodedev-list --tree. I'm setting the parent pointer
> to what I think is correct, but the tree output is broken. I can dig
> through it until I understand it, but if anyone is familiar with the
> implementation and would be willing to take a few minutes to walk me
> through it, it would save me a bunch of time.
>
> I think it's also important that people get the code installed on a
> variety of systems as soon as possible to shake out the inevitable bugs
> that will arise from differing device models and code versions, and I'll
> have the final version with the monitor shortly.
(very early feedback...I've only read it briefly and tried to compile it so far)
<snip>
> diff --git a/src/conf/node_device_conf.c b/src/conf/node_device_conf.c
> index f09f814..2322819 100644
> --- a/src/conf/node_device_conf.c
> +++ b/src/conf/node_device_conf.c
> @@ -325,6 +325,9 @@ char *virNodeDeviceDefFormat(virConnectPtr conn,
> data->usb_if.subclass);
> virBufferVSprintf(&buf, " <protocol>%d</protocol>\n",
> data->usb_if.protocol);
> + if (data->usb_if.interface_name)
> + virBufferVSprintf(&buf, " <interface_name>%s</interface_name>\n",
> + data->usb_if.interface_name);
> if (data->usb_if.description)
> virBufferVSprintf(&buf, " <description>%s</description>\n",
> data->usb_if.description);
> @@ -394,10 +397,19 @@ char *virNodeDeviceDefFormat(virConnectPtr conn,
> "</media_available>\n", avl ? 1 : 0);
> virBufferVSprintf(&buf, " <media_size>%llu</media_size>\n",
> data->storage.removable_media_size);
> - virBufferAddLit(&buf, " </capability>\n");
> + virBufferVSprintf(&buf, " <logical_block_size>%llu"
> + "</logical_block_size>\n",
> + data->storage.logical_block_size);
> + virBufferVSprintf(&buf, " <num_blocks>%llu</num_blocks>\n",
> + data->storage.num_blocks);
This code is a bit difficult to read, but I think you still need the closing
</capability> tag here. There's a high-level <capability> tag, but then this is
sort of a sub-capability, and I think you need to close it off.
> } else {
> virBufferVSprintf(&buf, " <size>%llu</size>\n",
> data->storage.size);
> + virBufferVSprintf(&buf, " <logical_block_size>%llu"
> + "</logical_block_size>\n",
> + data->storage.logical_block_size);
> + virBufferVSprintf(&buf, " <num_blocks>%llu</num_blocks>\n",
> + data->storage.num_blocks);
> }
> if (data->storage.flags & VIR_NODE_DEV_CAP_STORAGE_HOTPLUGGABLE)
> virBufferAddLit(&buf,
> @@ -1239,6 +1251,7 @@ void virNodeDevCapsDefFree(virNodeDevCapsDefPtr caps)
> VIR_FREE(data->usb_dev.vendor_name);
> break;
> case VIR_NODE_DEV_CAP_USB_INTERFACE:
> + VIR_FREE(data->usb_if.interface_name);
> VIR_FREE(data->usb_if.description);
> break;
> case VIR_NODE_DEV_CAP_NET:
> diff --git a/src/conf/node_device_conf.h b/src/conf/node_device_conf.h
> index 29a4d43..95910c5 100644
> --- a/src/conf/node_device_conf.h
> +++ b/src/conf/node_device_conf.h
> @@ -101,6 +101,7 @@ struct _virNodeDevCapsDef {
> unsigned function;
> unsigned product;
> unsigned vendor;
> + unsigned class;
> char *product_name;
> char *vendor_name;
> } pci_dev;
> @@ -117,10 +118,12 @@ struct _virNodeDevCapsDef {
> unsigned _class; /* "class" is reserved in C */
> unsigned subclass;
> unsigned protocol;
> + char *interface_name;
> char *description;
> } usb_if;
> struct {
> char *address;
> + unsigned address_len;
> char *ifname;
> enum virNodeDevNetCapType subtype; /* LAST -> no subtype */
> } net;
> @@ -139,6 +142,8 @@ struct _virNodeDevCapsDef {
> } scsi;
> struct {
> unsigned long long size;
> + unsigned long long num_blocks;
> + unsigned long long logical_block_size;
> unsigned long long removable_media_size;
> char *block;
> char *bus;
> diff --git a/src/node_device/node_device_driver.c b/src/node_device/node_device_driver.c
> index 14b3098..f3bd45d 100644
> --- a/src/node_device/node_device_driver.c
> +++ b/src/node_device/node_device_driver.c
> @@ -70,9 +70,12 @@ static int update_caps(virNodeDeviceObjPtr dev)
> }
>
>
> -#ifdef __linux__
> -static int update_driver_name(virConnectPtr conn,
> - virNodeDeviceObjPtr dev)
> +#if defined (__linux__) && defined (HAVE_HAL)
> +/* XXX Why does this function exist? Are there devices that change
> + * their drivers while running? Under libudev, most devices seem to
> + * provide their driver name as a property "DRIVER" */
> +static int update_driver_name_hal_linux(virConnectPtr conn,
> + virNodeDeviceObjPtr dev)
Oops, renaming this causes the build to fail. I've switched it back to
"update_driver_name" for the time being.
I'm also getting:
CCLD libvirt_driver_network.la
CCLD libvirt_driver_storage.la
CC libvirt_driver_nodedev_la-node_device_driver.lo
make[3]: *** No rule to make target `node_device/node_device_linux_sysfs.c',
needed by `libvirt_driver_nodedev_la-node_device_linux_sysfs.lo'. Stop.
make[3]: Leaving directory `/root/libvirt/src'
While trying to compile. Any thoughts?
--
Chris Lalancette
More information about the libvir-list
mailing list