From owner-svn-src-all@FreeBSD.ORG Mon Apr 15 16:09:26 2013 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.FreeBSD.org [8.8.178.115]) by hub.freebsd.org (Postfix) with ESMTP id 3503ECE; Mon, 15 Apr 2013 16:09:26 +0000 (UTC) (envelope-from ivoras@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) by mx1.freebsd.org (Postfix) with ESMTP id 17696A6A; Mon, 15 Apr 2013 16:09:26 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.6/8.14.6) with ESMTP id r3FG9POn079486; Mon, 15 Apr 2013 16:09:25 GMT (envelope-from ivoras@svn.freebsd.org) Received: (from ivoras@localhost) by svn.freebsd.org (8.14.6/8.14.5/Submit) id r3FG9Oga079482; Mon, 15 Apr 2013 16:09:24 GMT (envelope-from ivoras@svn.freebsd.org) Message-Id: <201304151609.r3FG9Oga079482@svn.freebsd.org> From: Ivan Voras Date: Mon, 15 Apr 2013 16:09:24 +0000 (UTC) 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 X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 15 Apr 2013 16:09:26 -0000 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 + * 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");