summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGabriel <g2p.code@gmail.com>2013-10-05 21:16:21 +0200
committerGabriel <g2p.code@gmail.com>2013-10-05 22:16:22 +0200
commit0c7a484a5b09d710814451c06ad30e894deb7ff5 (patch)
treea2112a892f9f11c157c6b9c4d47db4f27e6fb6d0
parent866e21a35d40e8c5df75cdc7146da88c17cc18d1 (diff)
downloadbcache-tools-0c7a484a5b09d710814451c06ad30e894deb7ff5.tar.zst
udev: Fit into the standard rule sequencev1.0.2
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.
-rw-r--r--69-bcache.rules (renamed from 61-bcache.rules)13
-rw-r--r--Makefile5
-rwxr-xr-xinitramfs/hook2
-rw-r--r--probe-bcache.c14
4 files changed, 27 insertions, 7 deletions
diff --git a/61-bcache.rules b/69-bcache.rules
index dd85e69..3f89b12 100644
--- a/61-bcache.rules
+++ b/69-bcache.rules
@@ -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"
diff --git a/Makefile b/Makefile
index 1f3caa4..b31e080 100644
--- 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
diff --git a/initramfs/hook b/initramfs/hook
index ce328f3..5890fe2 100755
--- a/initramfs/hook
+++ b/initramfs/hook
@@ -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
diff --git a/probe-bcache.c b/probe-bcache.c
index e1ad614..c94c972 100644
--- a/probe-bcache.c
+++ b/probe-bcache.c
@@ -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;