]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
udev/path_id: fix skip_subsystem()
authorYu Watanabe <watanabe.yu+github@gmail.com>
Sat, 4 Dec 2021 16:58:01 +0000 (01:58 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 6 Dec 2021 07:01:33 +0000 (16:01 +0900)
This partially reverts d340bdd1bd435e9f5524f4246feaf38511b2ff45.

The function previously drops multiple except for the last parents
which matches the specified subsystem.
But the commit d340bdd1bd435e9f5524f4246feaf38511b2ff45 drops all
parents.

E.g. input is pci-pci-pci-usb-usb-usb, then
Before d340bdd: pci-pci-pci-usb
After d340bdd: pci-pci-pci

src/udev/udev-builtin-path_id.c

index b46a1e5af6342faffe055928b3d0c08183325468..9f71fadeea8b1f31446be24d0fc3adaabcaf33d5 100644 (file)
@@ -80,19 +80,29 @@ static int format_lun_number(sd_device *dev, char **path) {
 }
 
 static sd_device *skip_subsystem(sd_device *dev, const char *subsys) {
+        sd_device *parent;
+
         assert(dev);
         assert(subsys);
 
-        for (;;) {
+        /* Unlike the function name, this drops multiple parent devices EXCEPT FOR THE LAST ONE.
+         * The last one will be dropped at the end of the loop in builtin_path_id().
+         * E.g.
+         * Input:  /sys/devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1:1.0
+         * Output: /sys/devices/pci0000:00/0000:00:14.0/usb1
+         */
+
+        for (parent = dev; ; ) {
                 const char *subsystem;
 
-                if (sd_device_get_subsystem(dev, &subsystem) < 0)
+                if (sd_device_get_subsystem(parent, &subsystem) < 0)
                         break;
 
                 if (!streq(subsystem, subsys))
                         break;
 
-                if (sd_device_get_parent(dev, &dev) < 0)
+                dev = parent;
+                if (sd_device_get_parent(dev, &parent) < 0)
                         break;
         }