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@xxxxxxxxxx> > --- > 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 :| -- Libvir-list mailing list Libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list