diff options
author | Ryan Harper <ryan.harper@canonical.com> | 2020-08-19 18:51:27 +0800 |
---|---|---|
committer | Coly Li <colyli@suse.de> | 2020-08-21 12:13:46 +0800 |
commit | 2cfea71ab753fc65f1d97b0af327e6e9e3fa204b (patch) | |
tree | 5812a308adfb22c8db310564635e5dfbcf3640d3 | |
parent | b0f5169a13976b05b183e0cde1fd23ef4f90101c (diff) | |
download | bcache-tools-2cfea71ab753fc65f1d97b0af327e6e9e3fa204b.tar.gz |
bcache-tools: Export CACHED_UUID and CACHED_LABEL
https://github.com/koverstreet/bcache-tools/pull/1
Add bcache-export-cached helper to export CACHED_UUID and CACHED_LABEL always
Linux kernel bcache driver does not always emit a uevent[1] for when
a backing device is bound to a bcacheN device. When this happens, the udev
rule for creating /dev/bcache/by-uuid or /dev/bcache/by-label symlinks does
not fire and removes any persistent symlink to a specific backing device
since the bcache minor numbers (bcache0, 1, 2) are not guaranteed across reboots.
This script reads the superblock of the bcache device slaves,ensuring the slave
is a backing device via sb.version check, extracts the dev.uuid and
dev.label values and exports them to udev for triggering the symlink rules in
the existing rules file.
1. https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1729145
Signed-off-by: Shaoxiong Li <dahefanteng@gmail.com>
Signed-off-by: Coly Li <colyli@suse.de>
-rw-r--r-- | 69-bcache.rules | 7 | ||||
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | bcache-export-cached | 31 | ||||
-rwxr-xr-x | initcpio/install | 1 | ||||
-rwxr-xr-x | initramfs/hook | 1 |
5 files changed, 37 insertions, 5 deletions
diff --git a/69-bcache.rules b/69-bcache.rules index 9cc7f0d5..fd25f5b1 100644 --- a/69-bcache.rules +++ b/69-bcache.rules @@ -23,10 +23,9 @@ RUN+="bcache-register $tempnode" LABEL="bcache_backing_end" # Cached devices: symlink -DRIVER=="bcache", ENV{CACHED_UUID}=="?*", \ - SYMLINK+="bcache/by-uuid/$env{CACHED_UUID}" -DRIVER=="bcache", ENV{CACHED_LABEL}=="?*", \ - SYMLINK+="bcache/by-label/$env{CACHED_LABEL}" +IMPORT{program}="bcache-export-cached $tempnode" +ENV{CACHED_UUID}=="?*", SYMLINK+="bcache/by-uuid/$env{CACHED_UUID}" +ENV{CACHED_LABEL}=="?*", SYMLINK+="bcache/by-label/$env{CACHED_LABEL}" LABEL="bcache_end" @@ -9,7 +9,7 @@ all: make-bcache probe-bcache bcache-super-show bcache-register bcache install: make-bcache probe-bcache bcache-super-show $(INSTALL) -m0755 make-bcache bcache-super-show bcache $(DESTDIR)${PREFIX}/sbin/ - $(INSTALL) -m0755 probe-bcache bcache-register $(DESTDIR)$(UDEVLIBDIR)/ + $(INSTALL) -m0755 probe-bcache bcache-register bcache-export-cached $(DESTDIR)$(UDEVLIBDIR)/ $(INSTALL) -m0644 69-bcache.rules $(DESTDIR)$(UDEVLIBDIR)/rules.d/ $(INSTALL) -m0644 -- *.8 $(DESTDIR)${PREFIX}/share/man/man8/ $(INSTALL) -D -m0755 initramfs/hook $(DESTDIR)/usr/share/initramfs-tools/hooks/bcache diff --git a/bcache-export-cached b/bcache-export-cached new file mode 100644 index 00000000..b3459220 --- /dev/null +++ b/bcache-export-cached @@ -0,0 +1,31 @@ +#!/bin/sh +# +# This program reads the bcache superblock on bcacheX slaves to extract the +# dev.uuid and dev.label which refer to a specific backing device. +# +# It integrates with udev 'import' by writing CACHED_UUID=X and optionally +# CACHED_LABEL=X for the backing device of the provided bcache device. +# Ignore caching devices by skipping unless sb.version=1 +# +# There is 1 and only 1 backing device (slaves/*) for a bcache device. + +TEMPNODE=${1} # /dev/bcacheN +DEVNAME=${TEMPNODE##*/} # /dev/bcacheN -> bcacheN + +for slave in "/sys/class/block/$DEVNAME/slaves"/*; do + [ -d "$slave" ] || continue + bcache-super-show "/dev/${slave##*/}" | + awk '$1 == "sb.version" { sbver=$2; } + $1 == "dev.uuid" { uuid=$2; } + $1 == "dev.label" && $2 != "(empty)" { label=$2; } + END { + if (sbver == 1 && uuid) { + print("CACHED_UUID=" uuid) + if (label) print("CACHED_LABEL=" label) + exit(0) + } + exit(1); + }' + # awk exits 0 if it found a backing device. + [ $? -eq 0 ] && exit 0 +done diff --git a/initcpio/install b/initcpio/install index 72d4231f..c1a86fee 100755 --- a/initcpio/install +++ b/initcpio/install @@ -1,6 +1,7 @@ #!/bin/bash build() { add_module bcache + add_binary /usr/lib/udev/bcache-export-cached add_binary /usr/lib/udev/bcache-register add_binary /usr/lib/udev/probe-bcache add_file /usr/lib/udev/rules.d/69-bcache.rules diff --git a/initramfs/hook b/initramfs/hook index a6baa243..485491d1 100755 --- a/initramfs/hook +++ b/initramfs/hook @@ -22,6 +22,7 @@ elif [ -e /lib/udev/rules.d/69-bcache.rules ]; then cp -pt "${DESTDIR}/lib/udev/rules.d" /lib/udev/rules.d/69-bcache.rules fi +copy_exec /lib/udev/bcache-export-cached copy_exec /lib/udev/bcache-register copy_exec /lib/udev/probe-bcache manual_add_modules bcache |