diff options
author | Yu Watanabe <watanabe.yu+github@gmail.com> | 2021-03-07 15:35:33 +0900 |
---|---|---|
committer | Yu Watanabe <watanabe.yu+github@gmail.com> | 2021-04-30 19:41:41 +0900 |
commit | e7f781e473f5119bf9246208a6de9f6b76a39c5d (patch) | |
tree | 80ce166a1fea649dc0b61efcf32c54d4027619cf /src/udev/udev-event.c | |
parent | 5e0d05106747d2ee25ce19a51ed8a5669ea93bf9 (diff) | |
download | systemd-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.c | 19 |
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; } |