From: Yu Watanabe Date: Sat, 4 Dec 2021 16:58:01 +0000 (+0900) Subject: udev/path_id: fix skip_subsystem() X-Git-Tag: v250-rc1~64^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=56615f203bf78684d05828c2718325016f0d025f;p=thirdparty%2Fsystemd.git udev/path_id: fix skip_subsystem() 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 --- diff --git a/src/udev/udev-builtin-path_id.c b/src/udev/udev-builtin-path_id.c index b46a1e5af63..9f71fadeea8 100644 --- a/src/udev/udev-builtin-path_id.c +++ b/src/udev/udev-builtin-path_id.c @@ -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; }