From owner-freebsd-bugs@FreeBSD.ORG Wed Mar 22 17:20:40 2006 Return-Path: X-Original-To: freebsd-bugs@hub.freebsd.org Delivered-To: freebsd-bugs@hub.freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 25BF316A422 for ; Wed, 22 Mar 2006 17:20:40 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (freefall.freebsd.org [216.136.204.21]) by mx1.FreeBSD.org (Postfix) with ESMTP id D72D243D94 for ; Wed, 22 Mar 2006 17:20:16 +0000 (GMT) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (gnats@localhost [127.0.0.1]) by freefall.freebsd.org (8.13.4/8.13.4) with ESMTP id k2MHKGYU016958 for ; Wed, 22 Mar 2006 17:20:16 GMT (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.13.4/8.13.4/Submit) id k2MHKGYx016957; Wed, 22 Mar 2006 17:20:16 GMT (envelope-from gnats) Resent-Date: Wed, 22 Mar 2006 17:20:16 GMT Resent-Message-Id: <200603221720.k2MHKGYx016957@freefall.freebsd.org> Resent-From: FreeBSD-gnats-submit@FreeBSD.org (GNATS Filer) Resent-To: freebsd-bugs@FreeBSD.org Resent-Reply-To: FreeBSD-gnats-submit@FreeBSD.org, Ulf Lilleengen Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 8436516A420 for ; Wed, 22 Mar 2006 17:15:39 +0000 (UTC) (envelope-from lulf@studby.ntnu.no) Received: from royk.itea.ntnu.no (royk.itea.ntnu.no [129.241.190.230]) by mx1.FreeBSD.org (Postfix) with ESMTP id 7F90743D6E for ; Wed, 22 Mar 2006 17:15:38 +0000 (GMT) (envelope-from lulf@studby.ntnu.no) Received: from localhost (localhost [127.0.0.1]) by royk.itea.ntnu.no (Postfix) with ESMTP id E030466E0C for ; Wed, 22 Mar 2006 18:15:36 +0100 (CET) Received: from studby.ntnu.no (m062g.studby.ntnu.no [129.241.134.62]) by royk.itea.ntnu.no (Postfix) with ESMTP for ; Wed, 22 Mar 2006 18:15:36 +0100 (CET) Received: by studby.ntnu.no (Postfix, from userid 1001) id 08C443986F; Wed, 22 Mar 2006 18:15:38 +0100 (CET) Message-Id: <20060322171539.08C443986F@studby.ntnu.no> Date: Wed, 22 Mar 2006 18:15:38 +0100 (CET) From: Ulf Lilleengen To: FreeBSD-gnats-submit@FreeBSD.org X-Send-Pr-Version: 3.113 Cc: Subject: kern/94835: [PATCH] Gvinum resetconfig option X-BeenThere: freebsd-bugs@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: Ulf Lilleengen List-Id: Bug reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 22 Mar 2006 17:20:40 -0000 >Number: 94835 >Category: kern >Synopsis: [PATCH] Gvinum resetconfig option >Confidential: no >Severity: non-critical >Priority: medium >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: change-request >Submitter-Id: current-users >Arrival-Date: Wed Mar 22 17:20:15 GMT 2006 >Closed-Date: >Last-Modified: >Originator: Ulf Lilleengen >Release: FreeBSD 7.0-CURRENT amd64 >Organization: >Environment: System: FreeBSD vimes.studby.ntnu.no 7.0-CURRENT FreeBSD 7.0-CURRENT #0: Sat Mar 4 14:55:02 CET 2006 lulf@vimes.studby.ntnu.no:/usr/obj/usr/src/sys/VIMES amd64 >Description: I've been using gvinum for some time now, and I missed the 'resetconfig' option, so I created an implementation of it to gvinum. I would love if people would test this. It is currently tested on 7.0-Current. Diff attached. >How-To-Repeat: >Fix: --- gvinum_resetconfig.diff begins here --- Index: sbin/gvinum/gvinum.c =================================================================== RCS file: /home/ncvs/src/sbin/gvinum/gvinum.c,v retrieving revision 1.7 diff -u -r1.7 gvinum.c --- sbin/gvinum/gvinum.c 20 Nov 2005 10:35:46 -0000 1.7 +++ sbin/gvinum/gvinum.c 22 Mar 2006 16:59:30 -0000 @@ -62,6 +62,7 @@ void gvinum_printconfig(int, char **); void gvinum_rename(int, char **); void gvinum_rm(int, char **); +void gvinum_resetconfig(void); void gvinum_saveconfig(void); void gvinum_setstate(int, char **); void gvinum_start(int, char **); @@ -349,6 +350,8 @@ " Change the name of the specified object.\n" "rebuildparity plex [-f]\n" " Rebuild the parity blocks of a RAID-5 plex.\n" + "resetconfig\n" + " Reset the complete gvinum configuration\n" "rm [-r] volume | plex | subdisk | drive\n" " Remove an object.\n" "saveconfig\n" @@ -729,6 +732,42 @@ } void +gvinum_resetconfig(void) +{ + struct gctl_req *req; + const char *errstr; + char reply[32]; + + if (!isatty(STDIN_FILENO)) { + warn("Please enter this command from a tty device\n"); + return; + } + printf(" WARNING! This command will completely wipe out your gvinum" + "configuration.\n" + " All data will be lost. If you really want to do this," + " enter the text\n\n" + " NO FUTURE\n" + " Enter text -> "); + fgets(reply, sizeof(reply), stdin); + if (strcmp(reply, "NO FUTURE\n")) { + printf("\n No change\n"); + return; + } + req = gctl_get_handle(); + gctl_ro_param(req, "class", -1, "VINUM"); + gctl_ro_param(req, "verb", -1, "resetconfig"); + errstr = gctl_issue(req); + if (errstr != NULL) { + warnx("can't reset config: %s", errstr); + gctl_free(req); + return; + } + gctl_free(req); + gvinum_list(0, NULL); + printf("gvinum configuration obliterated\n"); +} + +void gvinum_saveconfig(void) { struct gctl_req *req; @@ -848,6 +887,8 @@ gvinum_rename(argc, argv); else if (!strcmp(argv[0], "rm")) gvinum_rm(argc, argv); + else if (!strcmp(argv[0], "resetconfig")) + gvinum_resetconfig(); else if (!strcmp(argv[0], "saveconfig")) gvinum_saveconfig(); else if (!strcmp(argv[0], "setstate")) Index: sys/geom/vinum/geom_vinum.c =================================================================== RCS file: /home/ncvs/src/sys/geom/vinum/geom_vinum.c,v retrieving revision 1.19 diff -u -r1.19 geom_vinum.c --- sys/geom/vinum/geom_vinum.c 24 Nov 2005 15:11:41 -0000 1.19 +++ sys/geom/vinum/geom_vinum.c 22 Mar 2006 16:59:43 -0000 @@ -396,6 +396,9 @@ } else if (!strcmp(verb, "rename")) { gv_rename(gp, req); + + } else if (!strcmp(verb, "resetconfig")) { + gv_resetconfig(gp, req); } else if (!strcmp(verb, "start")) { gv_start_obj(gp, req); Index: sys/geom/vinum/geom_vinum.h =================================================================== RCS file: /home/ncvs/src/sys/geom/vinum/geom_vinum.h,v retrieving revision 1.10 diff -u -r1.10 geom_vinum.h --- sys/geom/vinum/geom_vinum.h 19 Nov 2005 20:25:18 -0000 1.10 +++ sys/geom/vinum/geom_vinum.h 22 Mar 2006 16:59:43 -0000 @@ -57,6 +57,7 @@ /* geom_vinum_rm.c */ void gv_remove(struct g_geom *, struct gctl_req *); +int gv_resetconfig(struct g_geom *, struct gctl_req *); int gv_rm_sd(struct gv_softc *sc, struct gctl_req *req, struct gv_sd *s, int flags); Index: sys/geom/vinum/geom_vinum_rm.c =================================================================== RCS file: /home/ncvs/src/sys/geom/vinum/geom_vinum_rm.c,v retrieving revision 1.9 diff -u -r1.9 geom_vinum_rm.c --- sys/geom/vinum/geom_vinum_rm.c 19 Nov 2005 20:25:18 -0000 1.9 +++ sys/geom/vinum/geom_vinum_rm.c 22 Mar 2006 16:59:43 -0000 @@ -125,6 +125,45 @@ gv_save_config_all(sc); } +/* Resets configuration */ +int +gv_resetconfig(struct g_geom *gp, struct gctl_req *req) +{ + struct gv_softc *sc; + struct gv_drive *d, *d2; + struct gv_volume *v, *v2; + struct gv_plex *p, *p2; + struct gv_sd *s, *s2; + int flags; + + d = NULL; + d2 = NULL; + p = NULL; + p2 = NULL; + s = NULL; + s2 = NULL; + flags = GV_FLAG_R; + sc = gp->softc; + /* First loop through to make sure no volumes are up */ + LIST_FOREACH_SAFE(v, &sc->volumes, volume, v2) { + if (gv_is_open(v->geom)) { + gctl_error(req, "volume '%s' is busy", v->name); + return (-1); + } + } + /* Then if not, we remove everything. */ + LIST_FOREACH_SAFE(v, &sc->volumes, volume, v2) + gv_rm_vol(sc, req, v, flags); + LIST_FOREACH_SAFE(p, &sc->plexes, plex, p2) + gv_rm_plex(sc, req, p, flags); + LIST_FOREACH_SAFE(s, &sc->subdisks, sd, s2) + gv_rm_sd(sc, req, s, flags); + LIST_FOREACH_SAFE(d, &sc->drives, drive, d2) + gv_rm_drive(sc, req, d, flags); + gv_save_config_all(sc); + return (0); +} + /* Remove a volume. */ static int gv_rm_vol(struct gv_softc *sc, struct gctl_req *req, struct gv_volume *v, int flags) --- gvinum_resetconfig.diff ends here --- >Release-Note: >Audit-Trail: >Unformatted: