]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
udev: call udev_watch_end() before udev_event_execute_rules()
authorYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 19 Dec 2023 15:14:21 +0000 (00:14 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Sun, 24 Dec 2023 08:20:23 +0000 (17:20 +0900)
No functional change, just refactoring.

src/udev/test-udev-rule-runner.c
src/udev/udev-event.c
src/udev/udev-event.h
src/udev/udev-watch.c
src/udev/udev-worker.c
src/udev/udevadm-test.c

index 72296b3f0e69cbf0fc3b4edeabbe49cfbff53af9..c661ac7189e9a4a8527138b94ddf79bd755f6523 100644 (file)
@@ -169,7 +169,7 @@ static int run(int argc, char *argv[]) {
                 }
         }
 
-        udev_event_execute_rules(event, -1, 3 * USEC_PER_SEC, SIGKILL, NULL, rules);
+        udev_event_execute_rules(event, 3 * USEC_PER_SEC, SIGKILL, NULL, rules);
         udev_event_execute_run(event, 3 * USEC_PER_SEC, SIGKILL);
 
         return 0;
index ed22c8b6793f301571edc7cc39dcd606ad8bef09..2cb74711a82ae26f400ec78e9f9790944e68c2a5 100644 (file)
@@ -14,7 +14,6 @@
 #include "udev-node.h"
 #include "udev-trace.h"
 #include "udev-util.h"
-#include "udev-watch.h"
 #include "user-util.h"
 
 UdevEvent *udev_event_new(sd_device *dev, usec_t exec_delay_usec, sd_netlink *rtnl, int log_level) {
@@ -278,7 +277,6 @@ static int update_devnode(UdevEvent *event) {
 
 static int event_execute_rules_on_remove(
                 UdevEvent *event,
-                int inotify_fd,
                 usec_t timeout_usec,
                 int timeout_signal,
                 Hashmap *properties_list,
@@ -299,10 +297,6 @@ static int event_execute_rules_on_remove(
         if (r < 0)
                 log_device_debug_errno(dev, r, "Failed to delete database under /run/udev/data/, ignoring: %m");
 
-        r = udev_watch_end(inotify_fd, dev);
-        if (r < 0)
-                log_device_warning_errno(dev, r, "Failed to remove inotify watch, ignoring: %m");
-
         r = udev_rules_apply_to_event(rules, event, timeout_usec, timeout_signal, properties_list);
 
         if (sd_device_get_devnum(dev, NULL) >= 0)
@@ -330,7 +324,6 @@ static int copy_all_tags(sd_device *d, sd_device *s) {
 
 int udev_event_execute_rules(
                 UdevEvent *event,
-                int inotify_fd, /* This may be negative */
                 usec_t timeout_usec,
                 int timeout_signal,
                 Hashmap *properties_list,
@@ -348,12 +341,7 @@ int udev_event_execute_rules(
                 return log_device_error_errno(dev, r, "Failed to get ACTION: %m");
 
         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. */
-        r = udev_watch_end(inotify_fd, dev);
-        if (r < 0)
-                log_device_warning_errno(dev, r, "Failed to remove inotify watch, ignoring: %m");
+                return event_execute_rules_on_remove(event, timeout_usec, timeout_signal, properties_list, rules);
 
         r = device_clone_with_db(dev, &event->dev_db_clone);
         if (r < 0)
index 6b94fd08aba29af39908da1fc4492074c7d0ded5..24bd3229c668a6a25205017b64baedd0fd3fecbc 100644 (file)
@@ -53,7 +53,6 @@ DEFINE_TRIVIAL_CLEANUP_FUNC(UdevEvent*, udev_event_free);
 
 int udev_event_execute_rules(
                 UdevEvent *event,
-                int inotify_fd,
                 usec_t timeout_usec,
                 int timeout_signal,
                 Hashmap *properties_list,
index 58c82794f0f8384ab1c984fd5e6803f4d9819965..258eb26a65feae5713b4d87459be6c08ddc9614c 100644 (file)
@@ -232,12 +232,9 @@ int udev_watch_end(int inotify_fd, sd_device *dev) {
         _cleanup_close_ int dirfd = -EBADF;
         int wd, r;
 
+        assert(inotify_fd >= 0);
         assert(dev);
 
-        /* This may be called by 'udevadm test'. In that case, inotify_fd is not initialized. */
-        if (inotify_fd < 0)
-                return 0;
-
         if (sd_device_get_devname(dev, NULL) < 0)
                 return 0;
 
index 2dc7bd082001db2d9e5a6b4dd9eb418cc3988964..7165ed9542bc5f9c68e7a463635dbccb6b5072aa 100644 (file)
@@ -194,10 +194,14 @@ static int worker_process_device(UdevWorker *worker, sd_device *dev) {
         if (worker->blockdev_read_only)
                 (void) worker_mark_block_device_read_only(dev);
 
+        /* Disable watch during event processing. */
+        r = udev_watch_end(worker->inotify_fd, dev);
+        if (r < 0)
+                log_device_warning_errno(dev, r, "Failed to remove inotify watch, ignoring: %m");
+
         /* apply rules, create node, symlinks */
         r = udev_event_execute_rules(
                           udev_event,
-                          worker->inotify_fd,
                           worker->timeout_usec,
                           worker->timeout_signal,
                           worker->properties,
index 809143ede0bc584ad15ff079307a8fa6444386fb..9d1c99ed75b492b43c7aa704d54e2a63ad10e188 100644 (file)
@@ -129,7 +129,7 @@ int test_main(int argc, char *argv[], void *userdata) {
         assert_se(sigfillset(&mask) >= 0);
         assert_se(sigprocmask(SIG_SETMASK, &mask, &sigmask_orig) >= 0);
 
-        udev_event_execute_rules(event, -1, 60 * USEC_PER_SEC, SIGKILL, NULL, rules);
+        udev_event_execute_rules(event, 60 * USEC_PER_SEC, SIGKILL, NULL, rules);
 
         FOREACH_DEVICE_PROPERTY(dev, key, value)
                 printf("%s=%s\n", key, value);