Index: sys/geom/eli/g_eli.c =================================================================== --- sys/geom/eli/g_eli.c +++ sys/geom/eli/g_eli.c @@ -119,6 +119,24 @@ } EVENTHANDLER_DEFINE(mountroot, zero_boot_passcache, NULL, 0); +static u_int g_eli_taste_providers = 0; +TUNABLE_INT("kern.geom.eli.taste_providers", &g_eli_taste_providers); +SYSCTL_UINT(_kern_geom_eli, OID_AUTO, taste_providers, CTLFLAG_RW, + &g_eli_taste_providers, 0, + "Supported providers while tasting. (0 = all or combination of 1, 2, 4, 8, 16 and 32)"); + // 1 = gpt label + // 2 = gpt id + // 4 = diskid + // 8 = mirror + // 16 = glabel + // 32 = multipath label +#define TASTE_PROVIDER_GPT_LABEL 0x1 +#define TASTE_PROVIDER_GPTID 0x2 +#define TASTE_PROVIDER_DISKID 0x4 +#define TASTE_PROVIDER_MIRROR 0x8 +#define TASTE_PROVIDER_GLABEL 0x10 +#define TASTE_PROVIDER_MULTIPATH_LABEL 0x20 + static eventhandler_tag g_eli_pre_sync = NULL; static int g_eli_destroy_geom(struct gctl_req *req, struct g_class *mp, @@ -1000,6 +1018,41 @@ if (root_mounted() || g_eli_tries == 0) return (NULL); + while (g_eli_taste_providers != 0) { + // try gpt label? + if (g_eli_taste_providers & TASTE_PROVIDER_GPT_LABEL) { + if (strncmp (pp->name, "gpt/", 4) == 0) + break; + } + // try gpt id? + if (g_eli_taste_providers & TASTE_PROVIDER_GPTID) { + if (strncmp (pp->name, "gptid/", 6) == 0) + break; + } + // try diskid? + if (g_eli_taste_providers & TASTE_PROVIDER_DISKID) { + if (strncmp (pp->name, "diskid/", 7) == 0) + break; + } + // try mirror? + if (g_eli_taste_providers & TASTE_PROVIDER_MIRROR) { + if (strncmp (pp->name, "mirror/", 7) == 0) + break; + } + // try glabel? + if (g_eli_taste_providers & TASTE_PROVIDER_GLABEL) { + if (strncmp (pp->name, "label/", 6) == 0) + break; + } + // try multipath label? + if (g_eli_taste_providers & TASTE_PROVIDER_MULTIPATH_LABEL) { + if (strncmp (pp->name, "multipath/", 10) == 0) + break; + } + + return (NULL); + } + G_ELI_DEBUG(3, "Tasting %s.", pp->name); error = g_eli_read_metadata(mp, pp, &md);