diff --git a/ChangeLog b/ChangeLog index dec23d04dc..4c206155cb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +Fri Nov 21 12:46:14 BST 2008 Daniel P. Berrange + + Misc tweaks to node device impl + * src/libvirt.c: Log registration of new node device driver impls + * src/node_device_conf.h, src/node_device.c: Merge block capability + into storage. Print vendor/product IDs in hex + * src/node_device_devkit.c: Change block to storage + * src/node_device_hal.c: Merge block cap into storage. Skip + devices without any capabilities listed + * src/virsh.c: Sort device list alphabetically + Fri Nov 21 12:40:14 BST 2008 Daniel P. Berrange Python binding for node device APIs (David Lively) diff --git a/src/libvirt.c b/src/libvirt.c index 32dc3cc2c3..f4453332e7 100644 --- a/src/libvirt.c +++ b/src/libvirt.c @@ -562,6 +562,9 @@ virRegisterDeviceMonitor(virDeviceMonitorPtr driver) return(-1); } + DEBUG ("registering %s as device driver %d", + driver->name, virDeviceMonitorTabCount); + virDeviceMonitorTab[virDeviceMonitorTabCount] = driver; return virDeviceMonitorTabCount++; } diff --git a/src/node_device_conf.c b/src/node_device_conf.c index d04b73d29d..6e0c19fdb9 100644 --- a/src/node_device_conf.c +++ b/src/node_device_conf.c @@ -43,7 +43,6 @@ VIR_ENUM_IMPL(virNodeDevCap, VIR_NODE_DEV_CAP_LAST, "usb_device", "usb", "net", - "block", "scsi_host", "scsi", "storage"); @@ -221,14 +220,14 @@ char *virNodeDeviceDefFormat(virConnectPtr conn, data->pci_dev.slot); virBufferVSprintf(&buf, " %d\n", data->pci_dev.function); - virBufferVSprintf(&buf, " pci_dev.product); if (data->pci_dev.product_name) virBufferEscapeString(&buf, ">%s\n", data->pci_dev.product_name); else virBufferAddLit(&buf, " />\n"); - virBufferVSprintf(&buf, " pci_dev.vendor); if (data->pci_dev.vendor_name) virBufferEscapeString(&buf, ">%s\n", @@ -240,14 +239,14 @@ char *virNodeDeviceDefFormat(virConnectPtr conn, virBufferVSprintf(&buf, " %d\n", data->usb_dev.bus); virBufferVSprintf(&buf, " %d\n", data->usb_dev.device); - virBufferVSprintf(&buf, " usb_dev.product); if (data->usb_dev.product_name) virBufferEscapeString(&buf, ">%s\n", data->usb_dev.product_name); else virBufferAddLit(&buf, " />\n"); - virBufferVSprintf(&buf, " usb_dev.vendor); if (data->usb_dev.vendor_name) virBufferEscapeString(&buf, ">%s\n", @@ -280,10 +279,6 @@ char *virNodeDeviceDefFormat(virConnectPtr conn, virBufferVSprintf(&buf, " \n", subtyp); } break; - case VIR_NODE_DEV_CAP_BLOCK: - virBufferVSprintf(&buf, " %s\n", - data->block.device); - break; case VIR_NODE_DEV_CAP_SCSI_HOST: virBufferVSprintf(&buf, " %d\n", data->scsi_host.host); @@ -299,6 +294,8 @@ char *virNodeDeviceDefFormat(virConnectPtr conn, data->scsi.type); break; case VIR_NODE_DEV_CAP_STORAGE: + virBufferVSprintf(&buf, " %s\n", + data->storage.block); if (data->storage.bus) virBufferVSprintf(&buf, " %s\n", data->storage.bus); @@ -380,15 +377,13 @@ void virNodeDevCapsDefFree(virNodeDevCapsDefPtr caps) VIR_FREE(data->net.interface); VIR_FREE(data->net.address); break; - case VIR_NODE_DEV_CAP_BLOCK: - VIR_FREE(data->block.device); - break; case VIR_NODE_DEV_CAP_SCSI_HOST: break; case VIR_NODE_DEV_CAP_SCSI: VIR_FREE(data->scsi.type); break; case VIR_NODE_DEV_CAP_STORAGE: + VIR_FREE(data->storage.block); VIR_FREE(data->storage.bus); VIR_FREE(data->storage.drive_type); VIR_FREE(data->storage.model); diff --git a/src/node_device_conf.h b/src/node_device_conf.h index 37a7941a32..a2cd844c0c 100644 --- a/src/node_device_conf.h +++ b/src/node_device_conf.h @@ -34,7 +34,6 @@ enum virNodeDevCapType { VIR_NODE_DEV_CAP_USB_DEV, /* USB device */ VIR_NODE_DEV_CAP_USB_INTERFACE, /* USB interface */ VIR_NODE_DEV_CAP_NET, /* Network device */ - VIR_NODE_DEV_CAP_BLOCK, /* Block device */ VIR_NODE_DEV_CAP_SCSI_HOST, /* SCSI Host Bus Adapter */ VIR_NODE_DEV_CAP_SCSI, /* SCSI device */ VIR_NODE_DEV_CAP_STORAGE, /* Storage device */ @@ -106,9 +105,6 @@ struct _virNodeDevCapsDef { char *interface; enum virNodeDevNetCapType subtype; /* LAST -> no subtype */ } net; - struct { - char *device; - } block; struct { unsigned host; } scsi_host; @@ -122,6 +118,7 @@ struct _virNodeDevCapsDef { struct { unsigned long long size; unsigned long long removable_media_size; + char *block; char *bus; char *drive_type; char *model; diff --git a/src/node_device_devkit.c b/src/node_device_devkit.c index 2679f61bb9..846df8c720 100644 --- a/src/node_device_devkit.c +++ b/src/node_device_devkit.c @@ -31,6 +31,7 @@ #include "event.h" #include "memory.h" #include "uuid.h" +#include "logging.h" #include "node_device.h" @@ -133,12 +134,12 @@ static int gather_net_cap(DevkitDevice *dkdev, } -static int gather_block_cap(DevkitDevice *dkdev, - union _virNodeDevCapData *d) +static int gather_storage_cap(DevkitDevice *dkdev, + union _virNodeDevCapData *d) { const char *device = devkit_device_get_device_file(dkdev); - if (device && ((d->block.device = strdup(device)) == NULL)) + if (device && ((d->storage.block = strdup(device)) == NULL)) return -1; return 0; @@ -158,7 +159,7 @@ static caps_tbl_entry caps_tbl[] = { { "pci", VIR_NODE_DEV_CAP_PCI_DEV, gather_pci_cap }, { "usb", VIR_NODE_DEV_CAP_USB_DEV, gather_usb_cap }, { "net", VIR_NODE_DEV_CAP_NET, gather_net_cap }, - { "block", VIR_NODE_DEV_CAP_BLOCK, gather_block_cap }, + { "block", VIR_NODE_DEV_CAP_STORAGE, gather_storage_cap }, // TODO: more caps! }; diff --git a/src/node_device_hal.c b/src/node_device_hal.c index ad36778295..6bca284b36 100644 --- a/src/node_device_hal.c +++ b/src/node_device_hal.c @@ -211,14 +211,6 @@ static int gather_net_cap(LibHalContext *ctx, const char *udi, } -static int gather_block_cap(LibHalContext *ctx, const char *udi, - union _virNodeDevCapData *d) -{ - (void)get_str_prop(ctx, udi, "block.device", &d->block.device); - return 0; -} - - static int gather_scsi_host_cap(LibHalContext *ctx, const char *udi, union _virNodeDevCapData *d) { @@ -243,6 +235,7 @@ static int gather_storage_cap(LibHalContext *ctx, const char *udi, union _virNodeDevCapData *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); @@ -307,7 +300,6 @@ static caps_tbl_entry caps_tbl[] = { { "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 }, - { "block", VIR_NODE_DEV_CAP_BLOCK, gather_block_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 }, @@ -438,6 +430,13 @@ static void dev_create(char *udi) rv = gather_capabilities(ctx, udi, &dev->def->caps); if (rv != 0) goto failure; + if (dev->def->caps == NULL) { + virNodeDeviceDefFree(dev->def); + VIR_FREE(dev); + VIR_FREE(udi); + return; + } + if (VIR_REALLOC_N(driverState->devs.objs, driverState->devs.count + 1) < 0) goto failure; diff --git a/src/virsh.c b/src/virsh.c index 193afba880..c6b02ee4a1 100644 --- a/src/virsh.c +++ b/src/virsh.c @@ -4462,6 +4462,7 @@ cmdNodeListDevices (vshControl *ctl, const vshCmd *cmd ATTRIBUTE_UNUSED) free(devices); return FALSE; } + qsort(&devices[0], num_devices, sizeof(char*), namesorter); for (i = 0; i < num_devices; i++) { vshPrint(ctl, "%s\n", devices[i]); free(devices[i]);