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@
This commit is contained in:
Ivan Voras 2013-04-15 16:09:24 +00:00
parent 252c094e53
commit c072011223
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=249508
4 changed files with 88 additions and 1 deletions

View File

@ -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

View File

@ -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;

View File

@ -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 {

View File

@ -0,0 +1,84 @@
/*-
* Copyright (c) 2012 Ivan Voras <ivoras@FreeBSD.org>
* 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 <sys/cdefs.h>
__FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/kernel.h>
#include <sys/malloc.h>
#include <geom/geom.h>
#include <geom/geom_disk.h>
#include <geom/label/g_label.h>
#include <geom/multipath/g_multipath.h>
#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");