summaryrefslogtreecommitdiffstats
path: root/src/udev/udev-builtin-btrfs.c
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2021-02-25 15:04:25 +0100
committerLennart Poettering <lennart@poettering.net>2021-02-26 14:27:49 +0100
commit97e535c7248cc0457395e2d62b6e7d6c342a0bd2 (patch)
tree082b37eb4b763fdcc8538074972dfb094e84b727 /src/udev/udev-builtin-btrfs.c
parentMerge pull request #18804 from poettering/epoll-wait2 (diff)
downloadsystemd-97e535c7248cc0457395e2d62b6e7d6c342a0bd2.tar.xz
systemd-97e535c7248cc0457395e2d62b6e7d6c342a0bd2.zip
udev: when btrfs.ko is not available consider btrfs filesystems not ready
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.
Diffstat (limited to 'src/udev/udev-builtin-btrfs.c')
-rw-r--r--src/udev/udev-builtin-btrfs.c11
1 files changed, 10 insertions, 1 deletions
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);