From: Zbigniew JÄ™drzejewski-Szmek Date: Thu, 24 Jul 2025 08:42:50 +0000 (+0200) Subject: udev: downgrade ENOMEDIUM warnings X-Git-Tag: v258-rc2~87^2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=refs%2Fpull%2F38313%2Fhead;p=thirdparty%2Fsystemd.git udev: downgrade ENOMEDIUM warnings I noticed similar warnings in many VM boots: fedora (udev-worker)[475]: sr0: Failed to open device node: No medium found This particular one is from src/udev/udev-builtin-uaccess.c:125, but I think the same principle should be used in all places: if we are ignoring errors that the device has been removed, we should also ignore ENOMEDIUM. --- diff --git a/src/basic/errno-util.h b/src/basic/errno-util.h index 05d416d7ae9..5fe337cfb1e 100644 --- a/src/basic/errno-util.h +++ b/src/basic/errno-util.h @@ -212,6 +212,13 @@ static inline bool ERRNO_IS_NEG_DEVICE_ABSENT(intmax_t r) { } _DEFINE_ABS_WRAPPER(DEVICE_ABSENT); +/* Device is absent or "empty". We get -ENOMEDIUM from CD/DVD devices, also in VMs. */ +static inline bool ERRNO_IS_NEG_DEVICE_ABSENT_OR_EMPTY(intmax_t r) { + return ERRNO_IS_NEG_DEVICE_ABSENT(r) || + r == -ENOMEDIUM; +} +_DEFINE_ABS_WRAPPER(DEVICE_ABSENT_OR_EMPTY); + /* Quite often we want to handle cases where the backing FS doesn't support extended attributes at all and * where it simply doesn't have the requested xattr the same way */ static inline bool ERRNO_IS_NEG_XATTR_ABSENT(intmax_t r) { diff --git a/src/udev/ata_id/ata_id.c b/src/udev/ata_id/ata_id.c index 6a3614acac0..508f99b01a0 100644 --- a/src/udev/ata_id/ata_id.c +++ b/src/udev/ata_id/ata_id.c @@ -413,7 +413,7 @@ static int run(int argc, char *argv[]) { fd = open(ASSERT_PTR(arg_device), O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_NOCTTY); if (fd < 0) { - bool ignore = ERRNO_IS_DEVICE_ABSENT(errno); + bool ignore = ERRNO_IS_DEVICE_ABSENT_OR_EMPTY(errno); log_full_errno(ignore ? LOG_DEBUG : LOG_WARNING, errno, "Failed to open device node '%s'%s: %m", arg_device, ignore ? ", ignoring" : ""); diff --git a/src/udev/mtd_probe/mtd_probe.c b/src/udev/mtd_probe/mtd_probe.c index 5899f5ae9c5..d79a0617e21 100644 --- a/src/udev/mtd_probe/mtd_probe.c +++ b/src/udev/mtd_probe/mtd_probe.c @@ -75,7 +75,7 @@ static int run(int argc, char** argv) { mtd_fd = open(argv[1], O_RDONLY|O_CLOEXEC|O_NOCTTY); if (mtd_fd < 0) { - bool ignore = ERRNO_IS_DEVICE_ABSENT(errno); + bool ignore = ERRNO_IS_DEVICE_ABSENT_OR_EMPTY(errno); log_full_errno(ignore ? LOG_DEBUG : LOG_WARNING, errno, "Failed to open device node '%s'%s: %m", argv[1], ignore ? ", ignoring" : ""); diff --git a/src/udev/udev-builtin-blkid.c b/src/udev/udev-builtin-blkid.c index c5d3e89c778..1480efd743c 100644 --- a/src/udev/udev-builtin-blkid.c +++ b/src/udev/udev-builtin-blkid.c @@ -499,7 +499,7 @@ static int builtin_blkid(UdevEvent *event, int argc, char *argv[]) { fd = sd_device_open(dev, O_RDONLY|O_CLOEXEC|O_NONBLOCK|O_NOCTTY); if (fd < 0) { - bool ignore = ERRNO_IS_DEVICE_ABSENT(fd); + bool ignore = ERRNO_IS_DEVICE_ABSENT_OR_EMPTY(fd); log_device_debug_errno(dev, fd, "Failed to open block device %s%s: %m", devnode, ignore ? ", ignoring" : ""); return ignore ? 0 : fd; diff --git a/src/udev/udev-builtin-btrfs.c b/src/udev/udev-builtin-btrfs.c index 4b5a5fc610e..c96d8e97322 100644 --- a/src/udev/udev-builtin-btrfs.c +++ b/src/udev/udev-builtin-btrfs.c @@ -35,7 +35,7 @@ static int builtin_btrfs(UdevEvent *event, int argc, char *argv[]) { _cleanup_close_ int fd = open("/dev/btrfs-control", O_RDWR|O_CLOEXEC|O_NOCTTY); if (fd < 0) { - if (ERRNO_IS_DEVICE_ABSENT(errno)) { + if (ERRNO_IS_DEVICE_ABSENT_OR_EMPTY(errno)) { /* Driver not installed? Then we aren't ready. This is useful in initrds that lack * btrfs.ko. After the host transition (where btrfs.ko will hopefully become * available) the device can be retriggered and will then be considered ready. */ diff --git a/src/udev/udev-builtin-keyboard.c b/src/udev/udev-builtin-keyboard.c index 93a20639b8f..5ab40a35526 100644 --- a/src/udev/udev-builtin-keyboard.c +++ b/src/udev/udev-builtin-keyboard.c @@ -201,7 +201,7 @@ static int builtin_keyboard(UdevEvent *event, int argc, char *argv[]) { if (fd < 0) { fd = sd_device_open(dev, O_RDWR|O_CLOEXEC|O_NONBLOCK|O_NOCTTY); if (fd < 0) { - bool ignore = ERRNO_IS_DEVICE_ABSENT(fd); + bool ignore = ERRNO_IS_DEVICE_ABSENT_OR_EMPTY(fd); log_device_full_errno(dev, ignore ? LOG_DEBUG : LOG_WARNING, fd, "Failed to open device '%s'%s: %m", node, ignore ? ", ignoring" : ""); @@ -223,7 +223,7 @@ static int builtin_keyboard(UdevEvent *event, int argc, char *argv[]) { if (fd < 0) { fd = sd_device_open(dev, O_RDWR|O_CLOEXEC|O_NONBLOCK|O_NOCTTY); if (fd < 0) { - bool ignore = ERRNO_IS_DEVICE_ABSENT(fd); + bool ignore = ERRNO_IS_DEVICE_ABSENT_OR_EMPTY(fd); log_device_full_errno(dev, ignore ? LOG_DEBUG : LOG_WARNING, fd, "Failed to open device '%s'%s: %m", node, ignore ? ", ignoring" : ""); diff --git a/src/udev/udev-builtin-uaccess.c b/src/udev/udev-builtin-uaccess.c index 1f09ec36cd1..c382f957cfa 100644 --- a/src/udev/udev-builtin-uaccess.c +++ b/src/udev/udev-builtin-uaccess.c @@ -122,7 +122,7 @@ static int builtin_uaccess(UdevEvent *event, int argc, char *argv[]) { _cleanup_close_ int fd = sd_device_open(dev, O_CLOEXEC|O_PATH); if (fd < 0) { - bool ignore = ERRNO_IS_DEVICE_ABSENT(fd); + bool ignore = ERRNO_IS_DEVICE_ABSENT_OR_EMPTY(fd); log_device_full_errno(dev, ignore ? LOG_DEBUG : LOG_WARNING, fd, "Failed to open device node%s: %m", ignore ? ", ignoring" : ""); diff --git a/src/udev/udev-node.c b/src/udev/udev-node.c index 849de60177a..75e8b09e89f 100644 --- a/src/udev/udev-node.c +++ b/src/udev/udev-node.c @@ -431,7 +431,7 @@ static int link_update(sd_device *dev, const char *slink, bool add) { return r; r = node_get_current(slink, dirfd, ¤t_id, add ? ¤t_prio : NULL); - if (r < 0 && !ERRNO_IS_DEVICE_ABSENT(r)) + if (r < 0 && !ERRNO_IS_DEVICE_ABSENT_OR_EMPTY(r)) return log_device_debug_errno(dev, r, "Failed to get the current device node priority for '%s': %m", slink); r = stack_directory_update(dev, dirfd, add); @@ -702,7 +702,7 @@ int udev_node_apply_permissions( node_fd = sd_device_open(dev, O_PATH|O_CLOEXEC); if (node_fd < 0) { - if (ERRNO_IS_DEVICE_ABSENT(node_fd)) { + if (ERRNO_IS_DEVICE_ABSENT_OR_EMPTY(node_fd)) { log_device_debug_errno(dev, node_fd, "Device node %s is missing, skipping handling.", devnode); return 0; /* This is necessarily racey, so ignore missing the device */ } @@ -735,7 +735,7 @@ int static_node_apply_permissions( node_fd = open(devnode, O_PATH|O_CLOEXEC); if (node_fd < 0) { - bool ignore = ERRNO_IS_DEVICE_ABSENT(errno); + bool ignore = ERRNO_IS_DEVICE_ABSENT_OR_EMPTY(errno); log_full_errno(ignore ? LOG_DEBUG : LOG_WARNING, errno, "Failed to open device node '%s'%s: %m", devnode, ignore ? ", ignoring" : ""); diff --git a/src/udev/udev-worker.c b/src/udev/udev-worker.c index 2a7235589bb..c75947a0cbc 100644 --- a/src/udev/udev-worker.c +++ b/src/udev/udev-worker.c @@ -112,7 +112,7 @@ static int worker_lock_whole_disk(UdevWorker *worker, sd_device *dev, int *ret_f fd = sd_device_open(dev_whole_disk, O_RDONLY|O_CLOEXEC|O_NONBLOCK|O_NOCTTY); if (fd < 0) { - bool ignore = ERRNO_IS_DEVICE_ABSENT(fd); + bool ignore = ERRNO_IS_DEVICE_ABSENT_OR_EMPTY(fd); log_device_debug_errno(dev, fd, "Failed to open '%s'%s: %m", whole_disk, ignore ? ", ignoring" : ""); if (!ignore) @@ -178,7 +178,7 @@ static int worker_mark_block_device_read_only(sd_device *dev) { _cleanup_close_ int fd = sd_device_open(dev, O_RDONLY|O_CLOEXEC|O_NONBLOCK|O_NOCTTY); if (fd < 0) { - bool ignore = ERRNO_IS_DEVICE_ABSENT(fd); + bool ignore = ERRNO_IS_DEVICE_ABSENT_OR_EMPTY(fd); log_device_full_errno(dev, ignore ? LOG_DEBUG : LOG_WARNING, fd, "Failed to open device node '%s'%s: %m", node, ignore ? ", ignoring" : ""); diff --git a/src/udev/v4l_id/v4l_id.c b/src/udev/v4l_id/v4l_id.c index cab1308d670..1e374c393c3 100644 --- a/src/udev/v4l_id/v4l_id.c +++ b/src/udev/v4l_id/v4l_id.c @@ -61,7 +61,7 @@ static int run(int argc, char *argv[]) { fd = open(arg_device, O_RDONLY|O_CLOEXEC|O_NOCTTY); if (fd < 0) { - bool ignore = ERRNO_IS_DEVICE_ABSENT(errno); + bool ignore = ERRNO_IS_DEVICE_ABSENT_OR_EMPTY(errno); log_full_errno(ignore ? LOG_DEBUG : LOG_WARNING, errno, "Failed to open device node '%s'%s: %m", arg_device, ignore ? ", ignoring" : "");