From e0a2369dd1ea3b932c6431c015ca275922beb4ac Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Mon, 23 Feb 2026 05:38:03 +0900 Subject: [PATCH] sd-device: do not try to remove previous tag indexes The removed code in device_tag_index() in fact does nothing, as sd_device.all_tags is never cleared. Moreover, not only the code is meaningless, but it is theoretically/logically wrong, as the symlinks in /run/udev/tags/ should be 'sticky', hence we should even not try to remove them. --- src/libsystemd/sd-device/device-private.c | 8 +------- src/libsystemd/sd-device/device-private.h | 2 +- src/udev/udev-error.c | 2 +- src/udev/udev-event.c | 4 ++-- 4 files changed, 5 insertions(+), 11 deletions(-) diff --git a/src/libsystemd/sd-device/device-private.c b/src/libsystemd/sd-device/device-private.c index d640eeb250..054c3545d0 100644 --- a/src/libsystemd/sd-device/device-private.c +++ b/src/libsystemd/sd-device/device-private.c @@ -769,15 +769,9 @@ static int device_tag(sd_device *device, const char *tag, bool add) { return 0; } -int device_tag_index(sd_device *device, sd_device *device_old, bool add) { +int device_tag_index(sd_device *device, bool add) { int r = 0; - if (add && device_old) - /* delete possible left-over tags */ - FOREACH_DEVICE_TAG(device_old, tag) - if (!sd_device_has_tag(device, tag)) - RET_GATHER(r, device_tag(device_old, tag, false)); - FOREACH_DEVICE_TAG(device, tag) RET_GATHER(r, device_tag(device, tag, add)); diff --git a/src/libsystemd/sd-device/device-private.h b/src/libsystemd/sd-device/device-private.h index 90f4e103f5..f2f349f2ac 100644 --- a/src/libsystemd/sd-device/device-private.h +++ b/src/libsystemd/sd-device/device-private.h @@ -59,7 +59,7 @@ int device_get_properties_strv(sd_device *device, char ***ret); int device_clone_with_db(sd_device *device, sd_device **ret); -int device_tag_index(sd_device *device, sd_device *device_old, bool add); +int device_tag_index(sd_device *device, bool add); bool device_should_have_db(sd_device *device); int device_has_db(sd_device *device); int device_update_db(sd_device *device); diff --git a/src/udev/udev-error.c b/src/udev/udev-error.c index 9f06ed4a1c..95739aaee6 100644 --- a/src/udev/udev-error.c +++ b/src/udev/udev-error.c @@ -63,7 +63,7 @@ int device_broadcast_on_error(sd_device *dev, sd_device_monitor *monitor) { /* delete state from disk */ (void) device_delete_db(dev); - (void) device_tag_index(dev, /* device_old= */ NULL, /* add= */ false); + (void) device_tag_index(dev, /* add= */ false); r = device_monitor_send(monitor, /* destination= */ NULL, dev); if (r < 0) { diff --git a/src/udev/udev-event.c b/src/udev/udev-event.c index e09bdd0cfa..49c692944e 100644 --- a/src/udev/udev-event.c +++ b/src/udev/udev-event.c @@ -310,7 +310,7 @@ static int event_execute_rules_on_remove(UdevEvent *event, UdevRules *rules) { log_device_debug_errno(dev, r, "Failed to read database under /run/udev/data/: %m"); if (EVENT_MODE_DESTRUCTIVE(event)) { - r = device_tag_index(dev, NULL, false); + r = device_tag_index(dev, /* add= */ false); if (r < 0) log_device_debug_errno(dev, r, "Failed to remove corresponding tag files under /run/udev/tag/, ignoring: %m"); @@ -416,7 +416,7 @@ int udev_event_execute_rules(UdevEvent *event, UdevRules *rules) { if (EVENT_MODE_DESTRUCTIVE(event)) { /* (re)write database file */ - r = device_tag_index(dev, event->dev_db_clone, true); + r = device_tag_index(dev, /* add= */ true); if (r < 0) return log_device_debug_errno(dev, r, "Failed to update tags under /run/udev/tag/: %m"); }