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)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Fri, 12 Mar 2021 17:21:36 +0000 (18:21 +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.

(cherry picked from commit 97e535c7248cc0457395e2d62b6e7d6c342a0bd2)
(cherry picked from commit 3f94149a9bdf7267453f614aa85f1735913d91a2)

src/udev/udev-builtin-btrfs.c

index 1f0073e5cde74a510f80094f2788ff2c23360148..d313e09731baa3664daa98e50b30af6bc3390e21 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);