From owner-svn-src-all@FreeBSD.ORG Thu Mar 24 19:11:05 2011 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 71E3F106566B; Thu, 24 Mar 2011 19:11:05 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 5FCB88FC16; Thu, 24 Mar 2011 19:11:05 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id p2OJB5cB054691; Thu, 24 Mar 2011 19:11:05 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p2OJB5h8054688; Thu, 24 Mar 2011 19:11:05 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201103241911.p2OJB5h8054688@svn.freebsd.org> From: Alexander Motin Date: Thu, 24 Mar 2011 19:11:05 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r219969 - head/sbin/geom/core X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.5 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: Thu, 24 Mar 2011 19:11:05 -0000 Author: mav Date: Thu Mar 24 19:11:05 2011 New Revision: 219969 URL: http://svn.freebsd.org/changeset/base/219969 Log: MFgraid/head r217014: Make `geom XXX list` and `geom XXX status` outputs more consistent: Add -a options to print all geoms, not only ones with providers. Add -g option for `status` to report geom's names, not provider's. Make `status` by default report provider's status (if present), not geom's. Make `status` report consumer's statuses, not only "synchronized" field. Modified: head/sbin/geom/core/geom.8 head/sbin/geom/core/geom.c Modified: head/sbin/geom/core/geom.8 ============================================================================== --- head/sbin/geom/core/geom.8 Thu Mar 24 18:40:11 2011 (r219968) +++ head/sbin/geom/core/geom.8 Thu Mar 24 19:11:05 2011 (r219969) @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd September 1, 2010 +.Dd January 5, 2011 .Dt GEOM 8 .Os .Sh NAME @@ -37,11 +37,12 @@ .Nm .Ar class .Cm list +.Op Fl a .Op Ar name ... .Nm .Ar class .Cm status -.Op Fl s +.Op Fl ags .Op Ar name ... .Nm .Ar class @@ -69,6 +70,11 @@ List all available commands for the give Print detailed information (within the given class) about all geoms (if no additional arguments were specified) or the given geoms. This command is only available if the given class exists in the kernel. +Additional options include: +.Bl -tag -width ".Fl a" +.It Fl a +Print information for geoms without providers. +.El .It Cm status Print general information (within the given class) about all geoms (if no additional arguments were specified) or the given geoms. @@ -76,6 +82,10 @@ This command is only available if the gi .Pp Additional options include: .Bl -tag -width ".Fl s" +.It Fl a +When used with -g, print status for geoms without providers. +.It Fl g +Report statuses for geoms instead of providers. .It Fl s Produce script-friendly output. .El @@ -128,6 +138,8 @@ NOP .It PART .It +RAID +.It RAID3 .It SCHED Modified: head/sbin/geom/core/geom.c ============================================================================== --- head/sbin/geom/core/geom.c Thu Mar 24 18:40:11 2011 (r219968) +++ head/sbin/geom/core/geom.c Thu Mar 24 19:11:05 2011 (r219969) @@ -76,15 +76,21 @@ static void std_unload(struct gctl_req * struct g_command std_commands[] = { { "help", 0, std_help, G_NULL_OPTS, NULL }, - { "list", 0, std_list, G_NULL_OPTS, - "[name ...]" + { "list", 0, std_list, + { + { 'a', "all", NULL, G_TYPE_BOOL }, + G_OPT_SENTINEL + }, + "[-a] [name ...]" }, { "status", 0, std_status, { + { 'a', "all", NULL, G_TYPE_BOOL }, + { 'g', "geoms", NULL, G_TYPE_BOOL }, { 's', "script", NULL, G_TYPE_BOOL }, G_OPT_SENTINEL }, - "[-s] [name ...]" + "[-ags] [name ...]" }, { "load", G_FLAG_VERBOSE | G_FLAG_LOADKLD, std_load, G_NULL_OPTS, NULL }, @@ -786,7 +792,7 @@ std_list(struct gctl_req *req, unsigned struct gclass *classp; struct ggeom *gp; const char *name; - int error, i, nargs; + int all, error, i, nargs; error = geom_gettree(&mesh); if (error != 0) @@ -797,18 +803,18 @@ std_list(struct gctl_req *req, unsigned errx(EXIT_FAILURE, "Class %s not found.", gclass_name); } nargs = gctl_get_int(req, "nargs"); + all = gctl_get_int(req, "all"); if (nargs > 0) { for (i = 0; i < nargs; i++) { name = gctl_get_ascii(req, "arg%d", i); gp = find_geom(classp, name); - if (gp != NULL) - list_one_geom(gp); - else + if (gp == NULL) errx(EXIT_FAILURE, "No such geom: %s.", name); + list_one_geom(gp); } } else { LIST_FOREACH(gp, &classp->lg_geom, lg_geom) { - if (LIST_EMPTY(&gp->lg_provider)) + if (LIST_EMPTY(&gp->lg_provider) && !all) continue; list_one_geom(gp); } @@ -827,7 +833,6 @@ std_status_available(void) static void status_update_len(struct ggeom *gp, int *name_len, int *status_len) { - struct gprovider *pp; struct gconfig *conf; int len; @@ -835,11 +840,7 @@ status_update_len(struct ggeom *gp, int assert(name_len != NULL); assert(status_len != NULL); - pp = LIST_FIRST(&gp->lg_provider); - if (pp != NULL) - len = strlen(pp->lg_name); - else - len = strlen(gp->lg_name); + len = strlen(gp->lg_name); if (*name_len < len) *name_len = len; LIST_FOREACH(conf, &gp->lg_config, lg_config) { @@ -851,25 +852,67 @@ status_update_len(struct ggeom *gp, int } } +static void +status_update_len_prs(struct ggeom *gp, int *name_len, int *status_len) +{ + struct gprovider *pp; + struct gconfig *conf; + int len, glen; + + assert(gp != NULL); + assert(name_len != NULL); + assert(status_len != NULL); + + glen = 0; + LIST_FOREACH(conf, &gp->lg_config, lg_config) { + if (strcasecmp(conf->lg_name, "state") == 0) { + glen = strlen(conf->lg_val); + break; + } + } + LIST_FOREACH(pp, &gp->lg_provider, lg_provider) { + len = strlen(pp->lg_name); + if (*name_len < len) + *name_len = len; + len = glen; + LIST_FOREACH(conf, &pp->lg_config, lg_config) { + if (strcasecmp(conf->lg_name, "state") == 0) { + len = strlen(conf->lg_val); + break; + } + } + if (*status_len < len) + *status_len = len; + } +} + static char * status_one_consumer(struct gconsumer *cp) { static char buf[256]; struct gprovider *pp; struct gconfig *conf; + const char *state, *syncr; pp = cp->lg_provider; if (pp == NULL) return (NULL); + state = NULL; + syncr = NULL; LIST_FOREACH(conf, &cp->lg_config, lg_config) { + if (strcasecmp(conf->lg_name, "state") == 0) + state = conf->lg_val; if (strcasecmp(conf->lg_name, "synchronized") == 0) - break; + syncr = conf->lg_val; } - if (conf == NULL) + if (state == NULL && syncr == NULL) snprintf(buf, sizeof(buf), "%s", pp->lg_name); - else { + else if (state != NULL && syncr != NULL) { + snprintf(buf, sizeof(buf), "%s (%s, %s)", pp->lg_name, + state, syncr); + } else { snprintf(buf, sizeof(buf), "%s (%s)", pp->lg_name, - conf->lg_val); + state ? state : syncr); } return (buf); } @@ -877,25 +920,19 @@ status_one_consumer(struct gconsumer *cp static void status_one_geom(struct ggeom *gp, int script, int name_len, int status_len) { - struct gprovider *pp; struct gconsumer *cp; struct gconfig *conf; const char *name, *status, *component; int gotone; - pp = LIST_FIRST(&gp->lg_provider); - if (pp != NULL) - name = pp->lg_name; - else - name = gp->lg_name; + name = gp->lg_name; + status = "N/A"; LIST_FOREACH(conf, &gp->lg_config, lg_config) { - if (strcasecmp(conf->lg_name, "state") == 0) + if (strcasecmp(conf->lg_name, "state") == 0) { + status = conf->lg_val; break; + } } - if (conf == NULL) - status = "N/A"; - else - status = conf->lg_val; gotone = 0; LIST_FOREACH(cp, &gp->lg_consumer, lg_consumer) { component = status_one_consumer(cp); @@ -914,6 +951,48 @@ status_one_geom(struct ggeom *gp, int sc } static void +status_one_geom_prs(struct ggeom *gp, int script, int name_len, int status_len) +{ + struct gprovider *pp; + struct gconsumer *cp; + struct gconfig *conf; + const char *name, *status, *component; + int gotone; + + LIST_FOREACH(pp, &gp->lg_provider, lg_provider) { + name = pp->lg_name; + status = "N/A"; + LIST_FOREACH(conf, &gp->lg_config, lg_config) { + if (strcasecmp(conf->lg_name, "state") == 0) { + status = conf->lg_val; + break; + } + } + LIST_FOREACH(conf, &pp->lg_config, lg_config) { + if (strcasecmp(conf->lg_name, "state") == 0) { + status = conf->lg_val; + break; + } + } + gotone = 0; + LIST_FOREACH(cp, &gp->lg_consumer, lg_consumer) { + component = status_one_consumer(cp); + if (component == NULL) + continue; + gotone = 1; + printf("%*s %*s %s\n", name_len, name, + status_len, status, component); + if (!script) + name = status = ""; + } + if (!gotone) { + printf("%*s %*s %s\n", name_len, name, + status_len, status, "N/A"); + } + } +} + +static void std_status(struct gctl_req *req, unsigned flags __unused) { struct gmesh mesh; @@ -921,7 +1000,7 @@ std_status(struct gctl_req *req, unsigne struct ggeom *gp; const char *name; int name_len, status_len; - int error, i, n, nargs, script; + int all, error, geoms, i, n, nargs, script; error = geom_gettree(&mesh); if (error != 0) @@ -930,28 +1009,45 @@ std_status(struct gctl_req *req, unsigne if (classp == NULL) errx(EXIT_FAILURE, "Class %s not found.", gclass_name); nargs = gctl_get_int(req, "nargs"); + all = gctl_get_int(req, "all"); + geoms = gctl_get_int(req, "geoms"); script = gctl_get_int(req, "script"); - name_len = strlen("Name"); - status_len = strlen("Status"); + if (script) { + name_len = 0; + status_len = 0; + } else { + name_len = strlen("Name"); + status_len = strlen("Status"); + } if (nargs > 0) { for (i = 0, n = 0; i < nargs; i++) { name = gctl_get_ascii(req, "arg%d", i); gp = find_geom(classp, name); if (gp == NULL) errx(EXIT_FAILURE, "No such geom: %s.", name); - else { - status_update_len(gp, &name_len, &status_len); - n++; + if (geoms) { + status_update_len(gp, + &name_len, &status_len); + } else { + status_update_len_prs(gp, + &name_len, &status_len); } + n++; } if (n == 0) goto end; } else { n = 0; LIST_FOREACH(gp, &classp->lg_geom, lg_geom) { - if (LIST_EMPTY(&gp->lg_provider)) + if (LIST_EMPTY(&gp->lg_provider) && !all) continue; - status_update_len(gp, &name_len, &status_len); + if (geoms) { + status_update_len(gp, + &name_len, &status_len); + } else { + status_update_len_prs(gp, + &name_len, &status_len); + } n++; } if (n == 0) @@ -965,16 +1061,27 @@ std_status(struct gctl_req *req, unsigne for (i = 0; i < nargs; i++) { name = gctl_get_ascii(req, "arg%d", i); gp = find_geom(classp, name); - if (gp != NULL) { + if (gp == NULL) + continue; + if (geoms) { status_one_geom(gp, script, name_len, status_len); + } else { + status_one_geom_prs(gp, script, name_len, + status_len); } } } else { LIST_FOREACH(gp, &classp->lg_geom, lg_geom) { - if (LIST_EMPTY(&gp->lg_provider)) + if (LIST_EMPTY(&gp->lg_provider) && !all) continue; - status_one_geom(gp, script, name_len, status_len); + if (geoms) { + status_one_geom(gp, script, name_len, + status_len); + } else { + status_one_geom_prs(gp, script, name_len, + status_len); + } } } end: