]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
udev: when btrfs.ko is not available consider btrfs filesystems not ready
authorLennart Poettering <lennart@poettering.net>
Thu, 25 Feb 2021 14:04:25 +0000 (15:04 +0100)
committerLennart Poettering <lennart@poettering.net>
Fri, 26 Feb 2021 13:27:49 +0000 (14:27 +0100)
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

index 9079d1b8e97207c89125ce36b15da53fc791c29d..436bf6bd442d70577a17d5a88a5ba70d672cefed 100644 (file)
@@ -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);