From 77c99b61c09725c418d0abf2be26bb9bc24d1a19 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Wed, 18 Jun 2025 09:31:06 +0200 Subject: [PATCH] Revert "sd-device: use sd_device_get_sysattr_value() to read special symlinks" Revert systemd commit 6ebbdcc0ddba ("sd-device: use sd_device_get_sysattr_value() to read special symlinks"). In the NM codebase sd_device_get_sysattr_value() is currently commented out because it depends on file chase.c which is not imported. Importing that file would require another long chain of imports. Therefore, revert the commit. This reverts commit 6ebbdcc0ddbacce732001823cf2be2a1d4381c60. Fixes: 6a4e6fab403b ('merge: branch 'systemd' into jv/systemd-merge') --- .../src/libsystemd/sd-device/sd-device.c | 39 +++++++++++++------ 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/src/libnm-systemd-core/src/libsystemd/sd-device/sd-device.c b/src/libnm-systemd-core/src/libsystemd/sd-device/sd-device.c index 43c601fca..fce184df0 100644 --- a/src/libnm-systemd-core/src/libsystemd/sd-device/sd-device.c +++ b/src/libnm-systemd-core/src/libsystemd/sd-device/sd-device.c @@ -1263,24 +1263,35 @@ _public_ int sd_device_get_subsystem(sd_device *device, const char **ret) { return r; if (!device->subsystem_set) { - const char *subsystem; + _cleanup_free_ char *subsystem = NULL; + const char *syspath; + char *path; - r = sd_device_get_sysattr_value(device, "subsystem", &subsystem); + r = sd_device_get_syspath(device, &syspath); + if (r < 0) + return r; + + /* read 'subsystem' link */ + path = strjoina(syspath, "/subsystem"); + r = readlink_value(path, &subsystem); if (r < 0 && r != -ENOENT) return log_device_debug_errno(device, r, "sd-device: Failed to read subsystem for %s: %m", device->devpath); - if (r >= 0) + + if (subsystem) r = device_set_subsystem(device, subsystem); /* use implicit names */ else if (!isempty(path_startswith(device->devpath, "/module/"))) r = device_set_subsystem(device, "module"); - else if (strstr(device->devpath, "/drivers/") || endswith(device->devpath, "/drivers")) + else if (strstr(syspath, "/drivers/") || endswith(syspath, "/drivers")) r = device_set_drivers_subsystem(device); else if (!isempty(PATH_STARTSWITH_SET(device->devpath, "/class/", "/bus/"))) r = device_set_subsystem(device, "subsystem"); - else - r = device_set_subsystem(device, NULL); + else { + device->subsystem_set = true; + r = 0; + } if (r < 0) return log_device_debug_errno(device, r, "sd-device: Failed to set subsystem for %s: %m", @@ -1392,8 +1403,6 @@ int device_set_driver(sd_device *device, const char *driver) { #if 0 /* NM_IGNORED */ _public_ int sd_device_get_driver(sd_device *device, const char **ret) { - int r; - assert_return(device, -EINVAL); r = device_read_uevent_file(device); @@ -1401,12 +1410,20 @@ _public_ int sd_device_get_driver(sd_device *device, const char **ret) { return r; if (!device->driver_set) { - const char *driver = NULL; + _cleanup_free_ char *driver = NULL; + const char *syspath; + char *path; + int r; - r = sd_device_get_sysattr_value(device, "driver", &driver); + r = sd_device_get_syspath(device, &syspath); + if (r < 0) + return r; + + path = strjoina(syspath, "/driver"); + r = readlink_value(path, &driver); if (r < 0 && r != -ENOENT) return log_device_debug_errno(device, r, - "sd-device: Failed to read driver: %m"); + "sd-device: readlink(\"%s\") failed: %m", path); r = device_set_driver(device, driver); if (r < 0)