summaryrefslogtreecommitdiff
path: root/src/udev/udev-event.c
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2021-03-07 15:35:33 +0900
committerYu Watanabe <watanabe.yu+github@gmail.com>2021-04-30 19:41:41 +0900
commite7f781e473f5119bf9246208a6de9f6b76a39c5d (patch)
tree80ce166a1fea649dc0b61efcf32c54d4027619cf /src/udev/udev-event.c
parent5e0d05106747d2ee25ce19a51ed8a5669ea93bf9 (diff)
downloadsystemd-e7f781e473f5119bf9246208a6de9f6b76a39c5d.tar.gz
udev,sd_device: also save map from device ID to watch handle in /run/udev/watch
Previously, watch handle is saved in the udev databse. But in most cases, the handle saved in the database is not updated. Especially, when udevd is restarted, the inotify watch is restarted, but the database is not updated. Moreover, it is not necessary to save watch handle in the database, as the handle is only take a effect during udevd is running, and the value is meaningless when udevd is restarted. So, this makes the opposite map from device ID to watch handle is saved in /run/udev/watch as a symbolic link, and the handle not saved in the database anymore. Fixes #18525.
Diffstat (limited to 'src/udev/udev-event.c')
-rw-r--r--src/udev/udev-event.c19
1 files changed, 6 insertions, 13 deletions
diff --git a/src/udev/udev-event.c b/src/udev/udev-event.c
index c613916d18..f40b3120ca 100644
--- a/src/udev/udev-event.c
+++ b/src/udev/udev-event.c
@@ -997,6 +997,9 @@ int udev_event_execute_rules(
if (action == SD_DEVICE_REMOVE)
return event_execute_rules_on_remove(event, inotify_fd, timeout_usec, timeout_signal, properties_list, rules);
+ /* Disable watch during event processing. */
+ (void) udev_watch_end(inotify_fd, event->dev);
+
r = device_clone_with_db(dev, &event->dev_db_clone);
if (r < 0)
return log_device_debug_errno(dev, r, "Failed to clone sd_device object: %m");
@@ -1005,9 +1008,6 @@ int udev_event_execute_rules(
if (r < 0)
log_device_warning_errno(dev, r, "Failed to copy all tags from old database entry, ignoring: %m");
- /* Disable watch during event processing. */
- (void) udev_watch_end(inotify_fd, event->dev_db_clone);
-
if (action == SD_DEVICE_MOVE) {
r = udev_event_on_move(event->dev);
if (r < 0)
@@ -1083,7 +1083,6 @@ void udev_event_execute_run(UdevEvent *event, usec_t timeout_usec, int timeout_s
int udev_event_process_inotify_watch(UdevEvent *event, int inotify_fd) {
sd_device *dev;
- int r;
assert(event);
assert(inotify_fd >= 0);
@@ -1095,16 +1094,10 @@ int udev_event_process_inotify_watch(UdevEvent *event, int inotify_fd) {
if (device_for_action(dev, SD_DEVICE_REMOVE))
return 0;
- if (!event->inotify_watch) {
+ if (event->inotify_watch)
+ (void) udev_watch_begin(inotify_fd, dev);
+ else
(void) udev_watch_end(inotify_fd, dev);
- return 0;
- }
-
- (void) udev_watch_begin(inotify_fd, dev);
-
- r = device_update_db(dev);
- if (r < 0)
- return log_device_debug_errno(dev, r, "Failed to update database under /run/udev/data/: %m");
return 0;
}