Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 15 Apr 2013 16:09:24 +0000 (UTC)
From:      Ivan Voras <ivoras@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r249508 - in head/sys: conf geom/label
Message-ID:  <201304151609.r3FG9Oga079482@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: ivoras
Date: Mon Apr 15 16:09:24 2013
New Revision: 249508
URL: http://svnweb.freebsd.org/changeset/base/249508

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

Added:
  head/sys/geom/label/g_label_disk_ident.c   (contents, props changed)
Modified:
  head/sys/conf/files
  head/sys/geom/label/g_label.c
  head/sys/geom/label/g_label.h

Modified: head/sys/conf/files
==============================================================================
--- head/sys/conf/files	Mon Apr 15 15:55:40 2013	(r249507)
+++ head/sys/conf/files	Mon Apr 15 16:09:24 2013	(r249508)
@@ -2495,6 +2495,7 @@ geom/label/g_label_ntfs.c	optional geom_
 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

Modified: head/sys/geom/label/g_label.c
==============================================================================
--- head/sys/geom/label/g_label.c	Mon Apr 15 15:55:40 2013	(r249507)
+++ head/sys/geom/label/g_label.c	Mon Apr 15 16:09:24 2013	(r249508)
@@ -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
 		    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;

Modified: head/sys/geom/label/g_label.h
==============================================================================
--- head/sys/geom/label/g_label.h	Mon Apr 15 15:55:40 2013	(r249507)
+++ head/sys/geom/label/g_label.h	Mon Apr 15 16:09:24 2013	(r249508)
@@ -87,6 +87,7 @@ extern struct g_label_desc g_label_reise
 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 {

Added: head/sys/geom/label/g_label_disk_ident.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/sys/geom/label/g_label_disk_ident.c	Mon Apr 15 16:09:24 2013	(r249508)
@@ -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");



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201304151609.r3FG9Oga079482>