]> git.sesse.net Git - bcachefs-tools-debian/commitdiff
udev: Fit into the standard rule sequence
authorGabriel <g2p.code@gmail.com>
Sat, 5 Oct 2013 19:16:21 +0000 (21:16 +0200)
committerGabriel <g2p.code@gmail.com>
Sat, 5 Oct 2013 20:16:22 +0000 (22:16 +0200)
Move the rule to run a bit later, after
the standard udev rules have called blkid.

Don't run blkid manually, and run probe-bcache
as a fallback which can be patched out in a
package that depends on util-linux 2.24+.

probe-bcache: bail if libblkid finds anything
Preserve our last-resort safety check here
in case earlier rules fail to call blkid.

69-bcache.rules [moved from 61-bcache.rules with 69% similarity]
Makefile
initramfs/hook
probe-bcache.c

similarity index 69%
rename from 61-bcache.rules
rename to 69-bcache.rules
index dd85e69adda36e8280cdf19d7a6c3525c0bd7475..3f89b1252562765f17ab9e9bb4406a391783f0e3 100644 (file)
@@ -4,13 +4,18 @@
 SUBSYSTEM!="block", GOTO="bcache_end"
 ACTION=="remove", GOTO="bcache_end"
 
-# Backing devices: scan, symlink, register
-IMPORT{program}="/sbin/blkid -o udev $tempnode"
-# blkid and probe-bcache can disagree, in which case don't register
-ENV{ID_FS_TYPE}=="?*", ENV{ID_FS_TYPE}!="bcache", GOTO="bcache_backing_end"
+# blkid was run by the standard udev rules
+# It recognised bcache (util-linux 2.24+)
+ENV{ID_FS_TYPE}=="bcache", GOTO="bcache_backing_found"
+# It recognised something else; bail
+ENV{ID_FS_TYPE}=="?*", GOTO="bcache_backing_end"
 
+# Backing devices: scan, symlink, register
 IMPORT{program}="/sbin/probe-bcache -o udev $tempnode"
+ENV{ID_FS_TYPE}!="bcache", GOTO="bcache_backing_end"
 ENV{ID_FS_UUID_ENC}=="?*", SYMLINK+="disk/by-uuid/$env{ID_FS_UUID_ENC}"
+
+LABEL="bcache_backing_found"
 SUBSYSTEM=="block", ACTION=="add|change", ENV{ID_FS_TYPE}=="bcache", \
         RUN+="bcache-register $tempnode"
 LABEL="bcache_backing_end"
index 1f3caa48f6fdbadc29d920ad7fdaa4a3cb698d47..b31e080e4f7d44dbff0978746a6d7946ee0da2dd 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -7,7 +7,7 @@ all: make-bcache probe-bcache bcache-super-show
 install: make-bcache probe-bcache bcache-super-show
        install -m0755 make-bcache bcache-super-show    $(DESTDIR)${PREFIX}/sbin/
        install -m0755 probe-bcache     $(DESTDIR)/sbin/
-       install -m0644 61-bcache.rules  $(DESTDIR)/lib/udev/rules.d/
+       install -m0644 69-bcache.rules  $(DESTDIR)/lib/udev/rules.d/
        install -m0755 bcache-register  $(DESTDIR)/lib/udev/
        -install -T -m0755 initramfs/hook       $(DESTDIR)/usr/share/initramfs-tools/hooks/bcache
        install -m0644 -- *.8 $(DESTDIR)${PREFIX}/share/man/man8/
@@ -20,7 +20,8 @@ bcache-test: LDLIBS += `pkg-config --libs openssl`
 make-bcache: LDLIBS += `pkg-config --libs uuid blkid`
 make-bcache: CFLAGS += `pkg-config --cflags uuid blkid`
 make-bcache: bcache.o
-probe-bcache: LDLIBS += `pkg-config --libs uuid`
+probe-bcache: LDLIBS += `pkg-config --libs uuid blkid`
+probe-bcache: CFLAGS += `pkg-config --cflags uuid blkid`
 bcache-super-show: LDLIBS += `pkg-config --libs uuid`
 bcache-super-show: CFLAGS += -std=gnu99
 bcache-super-show: bcache.o
index ce328f3a6bc9695ffcf9b0084ce41e22194171a9..5890fe2ae8ebb6b147a3dc4739acf79ecfa4a94c 100755 (executable)
@@ -16,7 +16,7 @@ esac
 
 . /usr/share/initramfs-tools/hook-functions
 
-cp -pt "${DESTDIR}/lib/udev/rules.d" /lib/udev/rules.d/61-bcache.rules
+cp -pt "${DESTDIR}/lib/udev/rules.d" /lib/udev/rules.d/69-bcache.rules
 copy_exec /lib/udev/bcache-register
 copy_exec /sbin/probe-bcache
 manual_add_modules bcache
index e1ad61467c0acf54035b4134633f009ec4530281..c94c9722573fdca3f0b017d9cf673d203dfb1f11 100644 (file)
@@ -8,6 +8,7 @@
 #define __USE_FILE_OFFSET64
 #define _XOPEN_SOURCE 500
 
+#include <blkid.h>
 #include <fcntl.h>
 #include <linux/fs.h>
 #include <stdbool.h>
@@ -30,6 +31,7 @@ int main(int argc, char **argv)
        extern char *optarg;
        struct cache_sb sb;
        char uuid[40];
+       blkid_probe pr;
 
        while ((o = getopt(argc, argv, "o:")) != EOF)
                switch (o) {
@@ -51,6 +53,18 @@ int main(int argc, char **argv)
                if (fd == -1)
                        continue;
 
+               if (!(pr = blkid_new_probe()))
+                       continue;
+               if (blkid_probe_set_device(pr, fd, 0, 0))
+                       continue;
+               /* probe partitions too */
+               if (blkid_probe_enable_partitions(pr, true))
+                       continue;
+               /* bail if anything was found
+                * probe-bcache isn't needed once blkid recognizes bcache */
+               if (!blkid_do_probe(pr)) {
+                       continue;
+               }
 
                if (pread(fd, &sb, sizeof(sb), SB_START) != sizeof(sb))
                        continue;