From 2c054ca176c5f53f5acb31f4a48bcf3091110eb8 Mon Sep 17 00:00:00 2001
From: Giuseppe Scrivano <gscrivan@redhat.com>
Date: Wed, 23 Apr 2014 12:42:01 +0200
Subject: [PATCH] udev: consider the device a CDROM when ID_CDROM=1

Some CDROM devices are reported by udev to have an ID_TYPE="generic"
thus it is necessary to check if ID_CDROM is present.

As a side effect, treating ID_TYPE="generic" as a missing ID_TYPE will
enable checks for ID_DRIVE_FLASH_SD and ID_DRIVE_FLOPPY and the
udevKludgeStorageType heuristic.

Signed-off-by: Giuseppe Scrivano <gscrivan@redhat.com>
Signed-off-by: Eric Blake <eblake@redhat.com>
---
 src/node_device/node_device_udev.c | 23 +++++++++++++++--------
 1 file changed, 15 insertions(+), 8 deletions(-)

diff --git a/src/node_device/node_device_udev.c b/src/node_device/node_device_udev.c
index 71b3c79c20..d24f2dc794 100644
--- a/src/node_device/node_device_udev.c
+++ b/src/node_device/node_device_udev.c
@@ -1,7 +1,7 @@
 /*
  * node_device_udev.c: node device enumeration - libudev implementation
  *
- * Copyright (C) 2009-2013 Red Hat, Inc.
+ * Copyright (C) 2009-2014 Red Hat, Inc.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -1093,20 +1093,27 @@ static int udevProcessStorage(struct udev_device *device,
 
     if (udevGetStringProperty(device,
                               "ID_TYPE",
-                              &data->storage.drive_type) != PROPERTY_FOUND) {
+                              &data->storage.drive_type) != PROPERTY_FOUND ||
+        STREQ(def->caps->data.storage.drive_type, "generic")) {
         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)) {
+        if (udevGetIntProperty(device, "ID_DRIVE_FLOPPY",
+                               &tmp_int, 0) == PROPERTY_FOUND &&
+            tmp_int == 1) {
 
             if (VIR_STRDUP(data->storage.drive_type, "floppy") < 0)
                 goto out;
-        } else if ((udevGetIntProperty(device, "ID_DRIVE_FLASH_SD",
-                                       &tmp_int, 0) == PROPERTY_FOUND) &&
-                   (tmp_int == 1)) {
+        } else if (udevGetIntProperty(device, "ID_CDROM",
+                                      &tmp_int, 0) == PROPERTY_FOUND &&
+                   tmp_int == 1) {
+
+            if (VIR_STRDUP(data->storage.drive_type, "cd") < 0)
+                goto out;
+        } else if (udevGetIntProperty(device, "ID_DRIVE_FLASH_SD",
+                                      &tmp_int, 0) == PROPERTY_FOUND &&
+                   tmp_int == 1) {
 
             if (VIR_STRDUP(data->storage.drive_type, "sd") < 0)
                 goto out;
-- 
GitLab