diff options
author | Natanael Copa <ncopa@alpinelinux.org> | 2019-01-25 18:15:48 +0000 |
---|---|---|
committer | Natanael Copa <ncopa@alpinelinux.org> | 2019-01-25 18:15:48 +0000 |
commit | 76530be3c34db2e4fdbe9eefd86384ad5f2f38e2 (patch) | |
tree | b00424534c06cbe796a7d3b5f5c53d3583804b51 /nlplug-findfs.c | |
parent | fd347152fd873803441570c29fbcee90326722d9 (diff) | |
download | mkinitfs-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=
Diffstat (limited to 'nlplug-findfs.c')
-rw-r--r-- | nlplug-findfs.c | 16 |
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); } |