diff --git a/61-bcache.rules b/69-bcache.rules similarity index 69% rename from 61-bcache.rules rename to 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 #include #include #include @@ -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;