From 97e535c7248cc0457395e2d62b6e7d6c342a0bd2 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Thu, 25 Feb 2021 15:04:25 +0100 Subject: [PATCH] udev: when btrfs.ko is not available consider btrfs filesystems not ready MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Let's add a special tweak to the btrfs builtin: if /dev/btrfs-control is not there, let's consider all btrfs file systems as SYSTEMD_READY=0. This is useful in initrds, where btrfs.ko might be missing. After the initrd → host transition we can then retigger the device and undo the SYSTEMD_READY=0 marking. --- src/udev/udev-builtin-btrfs.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/udev/udev-builtin-btrfs.c b/src/udev/udev-builtin-btrfs.c index 9079d1b8e9..436bf6bd44 100644 --- a/src/udev/udev-builtin-btrfs.c +++ b/src/udev/udev-builtin-btrfs.c @@ -21,8 +21,17 @@ static int builtin_btrfs(sd_device *dev, int argc, char *argv[], bool test) { return log_device_error_errno(dev, SYNTHETIC_ERRNO(EINVAL), "Invalid arguments"); fd = open("/dev/btrfs-control", O_RDWR|O_CLOEXEC); - if (fd < 0) + if (fd < 0) { + if (IN_SET(errno, ENOENT, ENXIO, ENODEV)) { + /* 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. */ + udev_builtin_add_property(dev, test, "ID_BTRFS_READY", "0"); + return 0; + } + return log_device_debug_errno(dev, errno, "Failed to open /dev/btrfs-control: %m"); + } strscpy(args.name, sizeof(args.name), argv[2]); r = ioctl(fd, BTRFS_IOC_DEVICES_READY, &args); -- 2.25.1