From 0bd0407efcdd88614b2b948952c0bb071f73a317 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Tue, 29 Jan 2019 13:53:13 +0100 Subject: [PATCH 1/3] udevd: trivial refactoring of is_device_busy() --- src/udev/udevd.c | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/src/udev/udevd.c b/src/udev/udevd.c index c637b98c7c..488a980742 100644 --- a/src/udev/udevd.c +++ b/src/udev/udevd.c @@ -743,10 +743,8 @@ static int is_device_busy(Manager *manager, struct event *event) { continue; /* check our old name */ - if (devpath_old && streq(devpath_old, loop_devpath)) { - event->delaying_seqnum = loop_event->seqnum; - return true; - } + if (devpath_old && streq(devpath_old, loop_devpath)) + goto set_delaying_seqnum; loop_devpath_len = strlen(loop_devpath); @@ -762,24 +760,23 @@ static int is_device_busy(Manager *manager, struct event *event) { /* devices names might have changed/swapped in the meantime */ if (major(devnum) != 0 || ifindex > 0) continue; - event->delaying_seqnum = loop_event->seqnum; - return true; + goto set_delaying_seqnum; } /* parent device event found */ - if (devpath[common] == '/') { - event->delaying_seqnum = loop_event->seqnum; - return true; - } + if (devpath[common] == '/') + goto set_delaying_seqnum; /* child device event found */ - if (loop_devpath[common] == '/') { - event->delaying_seqnum = loop_event->seqnum; - return true; - } + if (loop_devpath[common] == '/') + goto set_delaying_seqnum; } return false; + +set_delaying_seqnum: + event->delaying_seqnum = loop_event->seqnum; + return true; } static int on_exit_timeout(sd_event_source *s, uint64_t usec, void *userdata) { From baa461fc05934d02ece3abd7666c144549c695cf Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Tue, 29 Jan 2019 13:55:27 +0100 Subject: [PATCH 2/3] udevd: always block follwoing events with same devpath Originally commented as "devices names might have changed/swapped in the meantime", but may not. For safety, let's block the following events with same devpath. This may fix #6514. --- src/udev/udevd.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/udev/udevd.c b/src/udev/udevd.c index 488a980742..79191ffaf1 100644 --- a/src/udev/udevd.c +++ b/src/udev/udevd.c @@ -756,12 +756,8 @@ static int is_device_busy(Manager *manager, struct event *event) { continue; /* identical device event found */ - if (devpath_len == loop_devpath_len) { - /* devices names might have changed/swapped in the meantime */ - if (major(devnum) != 0 || ifindex > 0) - continue; + if (devpath_len == loop_devpath_len) goto set_delaying_seqnum; - } /* parent device event found */ if (devpath[common] == '/') From 8671411668e9b15bc3dadcb4e48ff43f6a8461d3 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Tue, 29 Jan 2019 14:03:29 +0100 Subject: [PATCH 3/3] udevd: save the result of devnum or ifindex blocker --- src/udev/udevd.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/udev/udevd.c b/src/udev/udevd.c index 79191ffaf1..2b7775f724 100644 --- a/src/udev/udevd.c +++ b/src/udev/udevd.c @@ -727,7 +727,7 @@ static int is_device_busy(Manager *manager, struct event *event) { if (sd_device_get_devnum(loop_event->dev, &d) >= 0 && devnum == d && is_block == streq(s, "block")) - return true; + goto set_delaying_seqnum; } /* check network device ifindex */ @@ -736,7 +736,7 @@ static int is_device_busy(Manager *manager, struct event *event) { if (sd_device_get_ifindex(loop_event->dev, &i) >= 0 && ifindex == i) - return true; + goto set_delaying_seqnum; } if (sd_device_get_devpath(loop_event->dev, &loop_devpath) < 0)