]> xenbits.xensource.com Git - libvirt.git/commitdiff
Improve nodedev parent/child relationships
authorDavid Allan <dallan@redhat.com>
Thu, 27 May 2010 21:36:54 +0000 (17:36 -0400)
committerDavid Allan <dallan@redhat.com>
Fri, 28 May 2010 16:48:45 +0000 (12:48 -0400)
* If a nodedev has a parent that we don't want to display, we should
  continue walking up the udev device tree to see if any of its
  earlier ancestors are devices that we display.  It makes the tree
  much nicer looking than having a whole lot of devices hanging off
  the root node.

src/node_device/node_device_udev.c

index c437861f815965f0d0f7f762a048ed4b9148049e..6e3ecd7578ccc368d709e3acc294fd2cc1fe0315 100644 (file)
@@ -1223,31 +1223,43 @@ static int udevSetParent(struct udev_device *device,
     virNodeDeviceObjPtr dev = NULL;
     int ret = -1;
 
-    parent_device = udev_device_get_parent(device);
-    if (parent_device == NULL) {
-        VIR_INFO("Could not find udev parent for device with sysfs path '%s'",
-                 udev_device_get_syspath(device));
-    }
+    parent_device = device;
+    do {
 
-    parent_sysfs_path = udev_device_get_syspath(parent_device);
-    if (parent_sysfs_path == NULL) {
-        VIR_INFO("Could not get syspath for parent of '%s'",
-                 udev_device_get_syspath(device));
-        parent_sysfs_path = "";
-    }
+        parent_device = udev_device_get_parent(parent_device);
+        if (parent_device == NULL) {
+            break;
+        }
 
-    def->parent_sysfs_path = strdup(parent_sysfs_path);
-    if (def->parent_sysfs_path == NULL) {
-        virReportOOMError();
-        goto out;
-    }
+        parent_sysfs_path = udev_device_get_syspath(parent_device);
+        if (parent_sysfs_path == NULL) {
+            VIR_INFO("Could not get syspath for parent of '%s'",
+                     udev_device_get_syspath(parent_device));
+        }
 
-    dev = virNodeDeviceFindBySysfsPath(&driverState->devs, parent_sysfs_path);
-    if (dev == NULL) {
+        dev = virNodeDeviceFindBySysfsPath(&driverState->devs,
+                                           parent_sysfs_path);
+        if (dev != NULL) {
+            def->parent = strdup(dev->def->name);
+            virNodeDeviceObjUnlock(dev);
+
+            if (def->parent == NULL) {
+                virReportOOMError();
+                goto out;
+            }
+
+            def->parent_sysfs_path = strdup(parent_sysfs_path);
+            if (def->parent_sysfs_path == NULL) {
+                virReportOOMError();
+                goto out;
+            }
+
+        }
+
+    } while (def->parent == NULL && parent_device != NULL);
+
+    if (def->parent == NULL) {
         def->parent = strdup("computer");
-    } else {
-        def->parent = strdup(dev->def->name);
-        virNodeDeviceObjUnlock(dev);
     }
 
     if (def->parent == NULL) {