From c07201122348d7747e8d9fdf0310e71b73a568ec Mon Sep 17 00:00:00 2001 From: Ivan Voras Date: Mon, 15 Apr 2013 16:09:24 +0000 Subject: [PATCH] Introduce glabel labels based on GEOM ident attributes. In this initial implementation, error on the side of conservatism and only create labels for GEOMs of classes DISK and MULTIPATH. Discussed with: trasz Approved by: silence from freebsd-geom@ --- sys/conf/files | 1 + sys/geom/label/g_label.c | 3 +- sys/geom/label/g_label.h | 1 + sys/geom/label/g_label_disk_ident.c | 84 +++++++++++++++++++++++++++++ 4 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 sys/geom/label/g_label_disk_ident.c diff --git a/sys/conf/files b/sys/conf/files index 95ed2c6a8b7..f26e93a153e 100644 --- a/sys/conf/files +++ b/sys/conf/files @@ -2495,6 +2495,7 @@ geom/label/g_label_ntfs.c optional geom_label geom/label/g_label_reiserfs.c optional geom_label geom/label/g_label_ufs.c optional geom_label geom/label/g_label_gpt.c optional geom_label +geom/label/g_label_disk_ident.c optional geom_label geom/linux_lvm/g_linux_lvm.c optional geom_linux_lvm geom/mirror/g_mirror.c optional geom_mirror geom/mirror/g_mirror_ctl.c optional geom_mirror diff --git a/sys/geom/label/g_label.c b/sys/geom/label/g_label.c index 66d228a7bd2..2011b770d7a 100644 --- a/sys/geom/label/g_label.c +++ b/sys/geom/label/g_label.c @@ -89,6 +89,7 @@ const struct g_label_desc *g_labels[] = { &g_label_ntfs, &g_label_gpt, &g_label_gpt_uuid, + &g_label_disk_ident, NULL }; @@ -339,7 +340,7 @@ g_label_taste(struct g_class *mp, struct g_provider *pp, int flags __unused) pp->mediasize - pp->sectorsize); } while (0); for (i = 0; g_labels[i] != NULL; i++) { - char label[64]; + char label[128]; if (g_labels[i]->ld_enabled == 0) continue; diff --git a/sys/geom/label/g_label.h b/sys/geom/label/g_label.h index 06ba2f55ef2..eca31264ec1 100644 --- a/sys/geom/label/g_label.h +++ b/sys/geom/label/g_label.h @@ -87,6 +87,7 @@ extern struct g_label_desc g_label_reiserfs; extern struct g_label_desc g_label_ntfs; extern struct g_label_desc g_label_gpt; extern struct g_label_desc g_label_gpt_uuid; +extern struct g_label_desc g_label_disk_ident; #endif /* _KERNEL */ struct g_label_metadata { diff --git a/sys/geom/label/g_label_disk_ident.c b/sys/geom/label/g_label_disk_ident.c new file mode 100644 index 00000000000..31a038de3e6 --- /dev/null +++ b/sys/geom/label/g_label_disk_ident.c @@ -0,0 +1,84 @@ +/*- + * Copyright (c) 2012 Ivan Voras + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include + +#include +#include +#include +#include + + +#define G_LABEL_DISK_IDENT_DIR "diskid" + +static char* classes_pass[] = { G_DISK_CLASS_NAME, G_MULTIPATH_CLASS_NAME, NULL }; + +static void +g_label_disk_ident_taste(struct g_consumer *cp, char *label, size_t size) +{ + struct g_class *cls; + char ident[100]; + int ident_len = sizeof(ident); + + g_topology_assert_not(); + label[0] = '\0'; + + cls = cp->provider->geom->class; + + /* Get the GEOM::ident string and construct a label in the format CLASS_NAME-ident */ + if (g_io_getattr("GEOM::ident", cp, &ident_len, ident) == 0) { + int i, found = 0; + + if (ident_len == 0 || ident[0] == '\0') + return; + for (i = 0; classes_pass[i] != NULL; i++) + if (strcmp(classes_pass[i], cls->name) == 0) + found = 1; + if (!found) + return; + if (strlen(cls->name) + ident_len + 2 > size) + ident[ident_len - strlen(cls->name) - 2] = '\0'; + else + ident[ident_len] = '\0'; + strcpy(label, cls->name); + strcat(label, "-"); + strcat(label, ident); + } +} + +struct g_label_desc g_label_disk_ident = { + .ld_taste = g_label_disk_ident_taste, + .ld_dir = G_LABEL_DISK_IDENT_DIR, + .ld_enabled = 1 +}; + +G_LABEL_INIT(disk_ident, g_label_disk_ident, "Create device nodes for drives which export a disk identification string");