From 4b2f8c89c540bff750de618c5031c188eb9bc566 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82?= Date: Wed, 14 Oct 2026 10:33:19 +0200 Subject: [PATCH] keventd: don't publish whole-disk by-id links for partitions disk_serial_id() falls back to /../serial so a partition got a by-id link named after its parent disk's serial, clobbering the link created for the whole disk. --- keventd/uevent.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/keventd/uevent.c b/keventd/uevent.c index a8fe68c2..cae5428b 100644 --- a/keventd/uevent.c +++ b/keventd/uevent.c @@ -792,7 +792,7 @@ static int disk_path_id(struct uevent *ev, char *id, size_t len) static int symlink_add_disk(struct uevent *ev) { char target[PATH_MAX], link[PATH_MAX], id[256]; - const char *name; + const char *name, *devtype; if (!ev->devname) return -1; @@ -801,13 +801,22 @@ static int symlink_add_disk(struct uevent *ev) name = strrchr(ev->devname, '/'); name = name ? name + 1 : ev->devname; - /* by-id: serial-based identifier */ + /* + * by-id: serial-based identifier. + * Partitions are skipped, as their serial lives on the parent disk and would + * clobber its by-id link, partitions get theirs from the udev rules instead. + */ + devtype = uevent_getenv(ev, "DEVTYPE"); + if (devtype && !strcmp(devtype, "partition")) + goto path; + if (!disk_serial_id(ev, id, sizeof(id))) { snprintf(target, sizeof(target), "../../%s", name); snprintf(link, sizeof(link), "/dev/disk/by-id/%s", id); symlink_create(target, link, ev->devpath); } +path: /* by-path: topology-based identifier */ if (!disk_path_id(ev, id, sizeof(id))) { snprintf(target, sizeof(target), "../../%s", name);