]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
udev-worker: allocate UdevEvent object just before use
authorYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 6 May 2025 15:59:56 +0000 (00:59 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 7 May 2025 19:46:01 +0000 (04:46 +0900)
No functional change, just refactoring.

src/udev/udev-worker.c

index f6b86e5e4f5236bdbea59904725f55773494d1cc..56d9f63900138b38c856db8c943984105e78a56d 100644 (file)
@@ -173,8 +173,6 @@ static int worker_mark_block_device_read_only(sd_device *dev) {
 }
 
 static int worker_process_device(UdevWorker *worker, sd_device *dev) {
-        _cleanup_(udev_event_unrefp) UdevEvent *udev_event = NULL;
-        _cleanup_close_ int fd_lock = -EBADF;
         int r;
 
         assert(worker);
@@ -182,16 +180,12 @@ static int worker_process_device(UdevWorker *worker, sd_device *dev) {
 
         log_device_uevent(dev, "Processing device");
 
-        udev_event = udev_event_new(dev, worker, EVENT_UDEV_WORKER);
-        if (!udev_event)
-                return -ENOMEM;
-        udev_event->trace = worker->config.trace;
-
         /* If this is a block device and the device is locked currently via the BSD advisory locks,
          * someone else is using it exclusively. We don't run our udev rules now to not interfere.
          * Instead of processing the event, we requeue the event and will try again after a delay.
          *
          * The user-facing side of this: https://systemd.io/BLOCK_DEVICE_LOCKING */
+        _cleanup_close_ int fd_lock = -EBADF;
         r = worker_lock_whole_disk(dev, &fd_lock);
         if (r == -EAGAIN) {
                 log_device_debug(dev, "Block device is currently locked, requeuing the event.");
@@ -215,6 +209,11 @@ static int worker_process_device(UdevWorker *worker, sd_device *dev) {
         if (r < 0)
                 log_device_warning_errno(dev, r, "Failed to remove inotify watch, ignoring: %m");
 
+        _cleanup_(udev_event_unrefp) UdevEvent *udev_event = udev_event_new(dev, worker, EVENT_UDEV_WORKER);
+        if (!udev_event)
+                return -ENOMEM;
+        udev_event->trace = worker->config.trace;
+
         /* apply rules, create node, symlinks */
         r = udev_event_execute_rules(udev_event, worker->rules);
         if (r < 0)