[libvirt] [PATCH] node_device: udev: Enumerate floppy devices

There are quite a few differences between how udev exposes legacy and USB floppy devs, but this patch takes care of both variants. Signed-off-by: Cole Robinson <crobinso@redhat.com> --- src/node_device/node_device_udev.c | 88 ++++++++++++++++++++++++++++------- 1 files changed, 70 insertions(+), 18 deletions(-) diff --git a/src/node_device/node_device_udev.c b/src/node_device/node_device_udev.c index 55cfee2..a9e196d 100644 --- a/src/node_device/node_device_udev.c +++ b/src/node_device/node_device_udev.c @@ -840,30 +840,19 @@ out: } -static int udevProcessCDROM(struct udev_device *device, - virNodeDeviceDefPtr def) +static int udevProcessRemoveableMedia(struct udev_device *device, + virNodeDeviceDefPtr def, + int has_media) { union _virNodeDevCapData *data = &def->caps->data; int tmp_int = 0, ret = 0; - /* NB: the drive_type string provided by udev is different from - * that provided by HAL; now it's "cd" instead of "cdrom" We - * change it to cdrom to preserve compatibility with earlier - * versions of libvirt. */ - VIR_FREE(def->caps->data.storage.drive_type); - def->caps->data.storage.drive_type = strdup("cdrom"); - if (def->caps->data.storage.drive_type == NULL) { - virReportOOMError(NULL); - goto out; - } - if ((udevGetIntSysfsAttr(device, "removable", &tmp_int, 0) == PROPERTY_FOUND) && (tmp_int == 1)) { def->caps->data.storage.flags |= VIR_NODE_DEV_CAP_STORAGE_REMOVABLE; } - if ((udevGetIntProperty(device, "ID_CDROM_MEDIA", &tmp_int, 0) - == PROPERTY_FOUND) && (tmp_int == 1)) { + if (has_media) { def->caps->data.storage.flags |= VIR_NODE_DEV_CAP_STORAGE_REMOVABLE_MEDIA_AVAILABLE; @@ -898,6 +887,53 @@ out: return ret; } +static int udevProcessCDROM(struct udev_device *device, + virNodeDeviceDefPtr def) +{ + int ret = -1; + int tmp_int = 0; + int has_media = 0; + + /* NB: the drive_type string provided by udev is different from + * that provided by HAL; now it's "cd" instead of "cdrom" We + * change it to cdrom to preserve compatibility with earlier + * versions of libvirt. */ + VIR_FREE(def->caps->data.storage.drive_type); + def->caps->data.storage.drive_type = strdup("cdrom"); + if (def->caps->data.storage.drive_type == NULL) { + virReportOOMError(NULL); + goto out; + } + + if ((udevGetIntProperty(device, "ID_CDROM_MEDIA", + &tmp_int, 0) == PROPERTY_FOUND)) + has_media = tmp_int; + + ret = udevProcessRemoveableMedia(device, def, has_media); +out: + return ret; +} + +static int udevProcessFloppy(struct udev_device *device, + virNodeDeviceDefPtr def) +{ + int tmp_int = 0; + int has_media = 0; + char *tmp_str = NULL; + + if ((udevGetIntProperty(device, "DKD_MEDIA_AVAILABLE", + &tmp_int, 0) == PROPERTY_FOUND)) + /* USB floppy */ + has_media = tmp_int; + else if (udevGetStringProperty(device, "ID_FS_LABEL", + &tmp_str) == PROPERTY_FOUND) { + /* Legacy floppy */ + has_media = 1; + VIR_FREE(tmp_str); + } + + return udevProcessRemoveableMedia(device, def, has_media); +} /* This function exists to deal with the case in which a driver does * not provide a device type in the usual place, but udev told us it's @@ -996,9 +1032,23 @@ static int udevProcessStorage(struct udev_device *device, if (udevGetStringProperty(device, "ID_TYPE", &data->storage.drive_type) != PROPERTY_FOUND) { - /* If udev doesn't have it, perhaps we can guess it. */ - if (udevKludgeStorageType(def) != 0) { - goto out; + int tmp_int = 0; + + /* All floppy drives have the ID_DRIVE_FLOPPY prop. This is + * needed since legacy floppies don't have a drive_type */ + if ((udevGetIntProperty(device, "ID_DRIVE_FLOPPY", + &tmp_int, 0) == PROPERTY_FOUND) && + (tmp_int == 1)) { + + data->storage.drive_type = strdup("floppy"); + if (!data->storage.drive_type) + goto out; + } else { + + /* If udev doesn't have it, perhaps we can guess it. */ + if (udevKludgeStorageType(def) != 0) { + goto out; + } } } @@ -1006,6 +1056,8 @@ static int udevProcessStorage(struct udev_device *device, ret = udevProcessCDROM(device, def); } else if (STREQ(def->caps->data.storage.drive_type, "disk")) { ret = udevProcessDisk(device, def); + } else if (STREQ(def->caps->data.storage.drive_type, "floppy")) { + ret = udevProcessFloppy(device, def); } else { VIR_INFO("Unsupported storage type '%s'\n", def->caps->data.storage.drive_type); -- 1.6.5.2

On 01/12/2010 03:26 PM, Cole Robinson wrote:
There are quite a few differences between how udev exposes legacy and USB floppy devs, but this patch takes care of both variants.
Signed-off-by: Cole Robinson<crobinso@redhat.com> --- src/node_device/node_device_udev.c | 88 ++++++++++++++++++++++++++++------- 1 files changed, 70 insertions(+), 18 deletions(-)
diff --git a/src/node_device/node_device_udev.c b/src/node_device/node_device_udev.c index 55cfee2..a9e196d 100644 --- a/src/node_device/node_device_udev.c +++ b/src/node_device/node_device_udev.c @@ -840,30 +840,19 @@ out: }
-static int udevProcessCDROM(struct udev_device *device, - virNodeDeviceDefPtr def) +static int udevProcessRemoveableMedia(struct udev_device *device, + virNodeDeviceDefPtr def, + int has_media) { union _virNodeDevCapData *data =&def->caps->data; int tmp_int = 0, ret = 0;
- /* NB: the drive_type string provided by udev is different from - * that provided by HAL; now it's "cd" instead of "cdrom" We - * change it to cdrom to preserve compatibility with earlier - * versions of libvirt. */ - VIR_FREE(def->caps->data.storage.drive_type); - def->caps->data.storage.drive_type = strdup("cdrom"); - if (def->caps->data.storage.drive_type == NULL) { - virReportOOMError(NULL); - goto out; - } - if ((udevGetIntSysfsAttr(device, "removable",&tmp_int, 0) == PROPERTY_FOUND)&& (tmp_int == 1)) { def->caps->data.storage.flags |= VIR_NODE_DEV_CAP_STORAGE_REMOVABLE; }
- if ((udevGetIntProperty(device, "ID_CDROM_MEDIA",&tmp_int, 0) - == PROPERTY_FOUND)&& (tmp_int == 1)) { + if (has_media) {
def->caps->data.storage.flags |= VIR_NODE_DEV_CAP_STORAGE_REMOVABLE_MEDIA_AVAILABLE; @@ -898,6 +887,53 @@ out: return ret; }
+static int udevProcessCDROM(struct udev_device *device, + virNodeDeviceDefPtr def) +{ + int ret = -1; + int tmp_int = 0; + int has_media = 0; + + /* NB: the drive_type string provided by udev is different from + * that provided by HAL; now it's "cd" instead of "cdrom" We + * change it to cdrom to preserve compatibility with earlier + * versions of libvirt. */ + VIR_FREE(def->caps->data.storage.drive_type); + def->caps->data.storage.drive_type = strdup("cdrom"); + if (def->caps->data.storage.drive_type == NULL) { + virReportOOMError(NULL); + goto out; + } + + if ((udevGetIntProperty(device, "ID_CDROM_MEDIA", +&tmp_int, 0) == PROPERTY_FOUND)) + has_media = tmp_int; + + ret = udevProcessRemoveableMedia(device, def, has_media); +out: + return ret; +} + +static int udevProcessFloppy(struct udev_device *device, + virNodeDeviceDefPtr def) +{ + int tmp_int = 0; + int has_media = 0; + char *tmp_str = NULL; + + if ((udevGetIntProperty(device, "DKD_MEDIA_AVAILABLE", +&tmp_int, 0) == PROPERTY_FOUND)) + /* USB floppy */ + has_media = tmp_int; + else if (udevGetStringProperty(device, "ID_FS_LABEL", +&tmp_str) == PROPERTY_FOUND) { + /* Legacy floppy */ + has_media = 1; + VIR_FREE(tmp_str); + } + + return udevProcessRemoveableMedia(device, def, has_media); +}
/* This function exists to deal with the case in which a driver does * not provide a device type in the usual place, but udev told us it's @@ -996,9 +1032,23 @@ static int udevProcessStorage(struct udev_device *device, if (udevGetStringProperty(device, "ID_TYPE", &data->storage.drive_type) != PROPERTY_FOUND) { - /* If udev doesn't have it, perhaps we can guess it. */ - if (udevKludgeStorageType(def) != 0) { - goto out; + int tmp_int = 0; + + /* All floppy drives have the ID_DRIVE_FLOPPY prop. This is + * needed since legacy floppies don't have a drive_type */ + if ((udevGetIntProperty(device, "ID_DRIVE_FLOPPY", +&tmp_int, 0) == PROPERTY_FOUND)&& + (tmp_int == 1)) { + + data->storage.drive_type = strdup("floppy"); + if (!data->storage.drive_type) + goto out; + } else { + + /* If udev doesn't have it, perhaps we can guess it. */ + if (udevKludgeStorageType(def) != 0) { + goto out; + } } }
@@ -1006,6 +1056,8 @@ static int udevProcessStorage(struct udev_device *device, ret = udevProcessCDROM(device, def); } else if (STREQ(def->caps->data.storage.drive_type, "disk")) { ret = udevProcessDisk(device, def); + } else if (STREQ(def->caps->data.storage.drive_type, "floppy")) { + ret = udevProcessFloppy(device, def); } else { VIR_INFO("Unsupported storage type '%s'\n", def->caps->data.storage.drive_type);
ACK to the code. I have no machines with floppy drives, so I can't test it. Dave

On Tue, Jan 12, 2010 at 03:26:30PM -0500, Cole Robinson wrote:
There are quite a few differences between how udev exposes legacy and USB floppy devs, but this patch takes care of both variants.
Signed-off-by: Cole Robinson <crobinso@redhat.com> --- src/node_device/node_device_udev.c | 88 ++++++++++++++++++++++++++++------- 1 files changed, 70 insertions(+), 18 deletions(-)
diff --git a/src/node_device/node_device_udev.c b/src/node_device/node_device_udev.c index 55cfee2..a9e196d 100644 --- a/src/node_device/node_device_udev.c +++ b/src/node_device/node_device_udev.c @@ -840,30 +840,19 @@ out: }
-static int udevProcessCDROM(struct udev_device *device, - virNodeDeviceDefPtr def) +static int udevProcessRemoveableMedia(struct udev_device *device, + virNodeDeviceDefPtr def, + int has_media) { union _virNodeDevCapData *data = &def->caps->data; int tmp_int = 0, ret = 0;
- /* NB: the drive_type string provided by udev is different from - * that provided by HAL; now it's "cd" instead of "cdrom" We - * change it to cdrom to preserve compatibility with earlier - * versions of libvirt. */ - VIR_FREE(def->caps->data.storage.drive_type); - def->caps->data.storage.drive_type = strdup("cdrom"); - if (def->caps->data.storage.drive_type == NULL) { - virReportOOMError(NULL); - goto out; - } - if ((udevGetIntSysfsAttr(device, "removable", &tmp_int, 0) == PROPERTY_FOUND) && (tmp_int == 1)) { def->caps->data.storage.flags |= VIR_NODE_DEV_CAP_STORAGE_REMOVABLE; }
- if ((udevGetIntProperty(device, "ID_CDROM_MEDIA", &tmp_int, 0) - == PROPERTY_FOUND) && (tmp_int == 1)) { + if (has_media) {
def->caps->data.storage.flags |= VIR_NODE_DEV_CAP_STORAGE_REMOVABLE_MEDIA_AVAILABLE; @@ -898,6 +887,53 @@ out: return ret; }
+static int udevProcessCDROM(struct udev_device *device, + virNodeDeviceDefPtr def) +{ + int ret = -1; + int tmp_int = 0; + int has_media = 0; + + /* NB: the drive_type string provided by udev is different from + * that provided by HAL; now it's "cd" instead of "cdrom" We + * change it to cdrom to preserve compatibility with earlier + * versions of libvirt. */ + VIR_FREE(def->caps->data.storage.drive_type); + def->caps->data.storage.drive_type = strdup("cdrom"); + if (def->caps->data.storage.drive_type == NULL) { + virReportOOMError(NULL); + goto out; + } + + if ((udevGetIntProperty(device, "ID_CDROM_MEDIA", + &tmp_int, 0) == PROPERTY_FOUND)) + has_media = tmp_int; + + ret = udevProcessRemoveableMedia(device, def, has_media); +out: + return ret; +} + +static int udevProcessFloppy(struct udev_device *device, + virNodeDeviceDefPtr def) +{ + int tmp_int = 0; + int has_media = 0; + char *tmp_str = NULL; + + if ((udevGetIntProperty(device, "DKD_MEDIA_AVAILABLE", + &tmp_int, 0) == PROPERTY_FOUND)) + /* USB floppy */ + has_media = tmp_int; + else if (udevGetStringProperty(device, "ID_FS_LABEL", + &tmp_str) == PROPERTY_FOUND) { + /* Legacy floppy */ + has_media = 1; + VIR_FREE(tmp_str); + } + + return udevProcessRemoveableMedia(device, def, has_media); +}
/* This function exists to deal with the case in which a driver does * not provide a device type in the usual place, but udev told us it's @@ -996,9 +1032,23 @@ static int udevProcessStorage(struct udev_device *device, if (udevGetStringProperty(device, "ID_TYPE", &data->storage.drive_type) != PROPERTY_FOUND) { - /* If udev doesn't have it, perhaps we can guess it. */ - if (udevKludgeStorageType(def) != 0) { - goto out; + int tmp_int = 0; + + /* All floppy drives have the ID_DRIVE_FLOPPY prop. This is + * needed since legacy floppies don't have a drive_type */ + if ((udevGetIntProperty(device, "ID_DRIVE_FLOPPY", + &tmp_int, 0) == PROPERTY_FOUND) && + (tmp_int == 1)) { + + data->storage.drive_type = strdup("floppy"); + if (!data->storage.drive_type) + goto out; + } else { + + /* If udev doesn't have it, perhaps we can guess it. */ + if (udevKludgeStorageType(def) != 0) { + goto out; + } } }
@@ -1006,6 +1056,8 @@ static int udevProcessStorage(struct udev_device *device, ret = udevProcessCDROM(device, def); } else if (STREQ(def->caps->data.storage.drive_type, "disk")) { ret = udevProcessDisk(device, def); + } else if (STREQ(def->caps->data.storage.drive_type, "floppy")) { + ret = udevProcessFloppy(device, def); } else { VIR_INFO("Unsupported storage type '%s'\n", def->caps->data.storage.drive_type); --
ACK Daniel -- |: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :| |: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|
participants (3)
-
Cole Robinson
-
Daniel P. Berrange
-
Dave Allan