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

Daniel P. Berrange berrange at redhat.com
Wed Jan 13 10:34:01 UTC 2010


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 at 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 :|




More information about the libvir-list mailing list