summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2021-02-25 15:04:25 +0100
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2021-03-12 17:35:57 +0100
commit3f94149a9bdf7267453f614aa85f1735913d91a2 (patch)
tree232ff2ffea814946b81d9d31b6af7b15bd48c9db
parent101273ff131a607fa47f6e58e5c3513e78df8d46 (diff)
downloadsystemd-3f94149a9bdf7267453f614aa85f1735913d91a2.tar.gz
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. (cherry picked from commit 97e535c7248cc0457395e2d62b6e7d6c342a0bd2)
-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);