From: Yu Watanabe Date: Tue, 6 May 2025 15:59:56 +0000 (+0900) Subject: udev-worker: allocate UdevEvent object just before use X-Git-Tag: v258-rc1~664^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=356d44a063a425704bd9c35c01c53ff57e512995;p=thirdparty%2Fsystemd.git udev-worker: allocate UdevEvent object just before use No functional change, just refactoring. --- diff --git a/src/udev/udev-worker.c b/src/udev/udev-worker.c index f6b86e5e4f5..56d9f639001 100644 --- a/src/udev/udev-worker.c +++ b/src/udev/udev-worker.c @@ -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)