aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNatanael Copa <ncopa@alpinelinux.org>2019-01-25 18:15:48 +0000
committerNatanael Copa <ncopa@alpinelinux.org>2019-01-25 18:15:48 +0000
commit76530be3c34db2e4fdbe9eefd86384ad5f2f38e2 (patch)
treeb00424534c06cbe796a7d3b5f5c53d3583804b51
parentfd347152fd873803441570c29fbcee90326722d9 (diff)
downloadmkinitfs-76530be3c34db2e4fdbe9eefd86384ad5f2f38e2.tar.bz2
mkinitfs-76530be3c34db2e4fdbe9eefd86384ad5f2f38e2.tar.xz
nlplug-findfs: detect zfs pool
if search device is prefixed with ZFS= then we search for a label with the zpool name in the zfs path. For example, if search device is "ZFS=tank/alpine/root" then we search for device that is type "zfs_member" and label "tank". This makes it work better with grub which creates a boot cmdline with ZFS=
-rw-r--r--nlplug-findfs.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/nlplug-findfs.c b/nlplug-findfs.c
index e037a93..0283161 100644
--- a/nlplug-findfs.c
+++ b/nlplug-findfs.c
@@ -961,6 +961,16 @@ static void founddev(struct ueventconf *conf, int found)
}
}
+static int is_zfs_pool(const char *path, const char *label)
+{
+ char pool_name[256];
+ char *p;
+ snprintf(pool_name, sizeof(pool_name), "%s", path);
+ if ((p = strchr(pool_name, '/')))
+ *p = '\0';
+ return strcmp(label, pool_name) == 0 ? FOUND_DEVICE : 0;
+}
+
static int searchdev(struct uevent *ev, const char *searchdev, int scanbootmedia)
{
struct ueventconf *conf = ev->conf;
@@ -981,10 +991,10 @@ static int searchdev(struct uevent *ev, const char *searchdev, int scanbootmedia
type = blkid_get_tag_value(conf->blkid_cache, "TYPE", ev->devnode);
uuid = blkid_get_tag_value(conf->blkid_cache, "UUID", ev->devnode);
+ label = blkid_get_tag_value(conf->blkid_cache, "LABEL", ev->devnode);
if (searchdev != NULL) {
if (strncmp("LABEL=", searchdev, 6) == 0) {
- label = blkid_get_tag_value(conf->blkid_cache, "LABEL", ev->devnode);
if (label && strcmp(label, searchdev+6) == 0)
rc = FOUND_DEVICE;
} else if (strncmp("UUID=", searchdev, 5) == 0) {
@@ -1003,6 +1013,10 @@ static int searchdev(struct uevent *ev, const char *searchdev, int scanbootmedia
start_lvm2(ev->devnode);
} else if (strcmp("zfs_member", type) == 0) {
start_zpool(uuid);
+ if (searchdev != NULL && label != NULL
+ && strncmp("ZFS=", searchdev, 4) == 0) {
+ rc = is_zfs_pool(&searchdev[4], label);
+ }
} else if (scanbootmedia) {
rc = scandev(conf, ev->devnode, type);
}