From owner-freebsd-geom@FreeBSD.ORG Fri Mar 17 18:52:31 2006 Return-Path: X-Original-To: freebsd-geom@freebsd.org Delivered-To: freebsd-geom@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 92C6E16A420; Fri, 17 Mar 2006 18:52:31 +0000 (UTC) (envelope-from lulf@pvv.ntnu.no) Received: from signal.itea.ntnu.no (signal.itea.ntnu.no [129.241.190.231]) by mx1.FreeBSD.org (Postfix) with ESMTP id BBE5A43D48; Fri, 17 Mar 2006 18:52:28 +0000 (GMT) (envelope-from lulf@pvv.ntnu.no) Received: from localhost (localhost [127.0.0.1]) by signal.itea.ntnu.no (Postfix) with ESMTP id 1BCE8337CF; Fri, 17 Mar 2006 19:52:27 +0100 (CET) Received: from gaupe.stud.ntnu.no (gaupe.stud.ntnu.no [129.241.56.184]) by signal.itea.ntnu.no (Postfix) with ESMTP; Fri, 17 Mar 2006 19:52:26 +0100 (CET) Received: by gaupe.stud.ntnu.no (Postfix, from userid 2312) id C9F4ACFF19; Fri, 17 Mar 2006 19:52:26 +0100 (CET) Date: Fri, 17 Mar 2006 19:52:26 +0100 From: Ulf Lilleengen To: freebsd-geom@freebsd.org Message-ID: <20060317185226.GA1469@stud.ntnu.no> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="OaZoDhBhXzo6bW1J" Content-Disposition: inline User-Agent: Mutt/1.5.9i X-Content-Scanned: with sophos and spamassassin at mailgw.ntnu.no. Cc: le@FreeBSD.org Subject: Implementation of gvinum resetconfig option X-BeenThere: freebsd-geom@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: GEOM-specific discussions and implementations List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 17 Mar 2006 18:52:31 -0000 --OaZoDhBhXzo6bW1J Content-Type: multipart/mixed; boundary="uXxzq0nDebZQVNAZ" Content-Disposition: inline --uXxzq0nDebZQVNAZ Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hi, I've been using gvinum for some time now, and I missed the 'resetconfig' op= tion, 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. --=20 Mvh Ulf Lilleengen --uXxzq0nDebZQVNAZ Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="gvinum_resetconfig.diff" Content-Transfer-Encoding: quoted-printable Index: sbin/gvinum/gvinum.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D 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 17 Mar 2006 18:01:14 -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 @@ } =20 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 =3D gctl_get_handle(); + gctl_ro_param(req, "class", -1, "VINUM"); + gctl_ro_param(req, "verb", -1, "resetconfig"); + errstr =3D gctl_issue(req); + if (errstr !=3D 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 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D 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 17 Mar 2006 18:01:29 -0000 @@ -396,6 +396,9 @@ =20 } else if (!strcmp(verb, "rename")) { gv_rename(gp, req); +=09 + } else if (!strcmp(verb, "resetconfig")) { + gv_resetconfig(gp, req); =20 } else if (!strcmp(verb, "start")) { gv_start_obj(gp, req); Index: sys/geom/vinum/geom_vinum.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D 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 17 Mar 2006 18:01:30 -0000 @@ -57,6 +57,7 @@ =20 /* 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); =20 Index: sys/geom/vinum/geom_vinum_rm.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D 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 17 Mar 2006 18:01:30 -0000 @@ -125,6 +125,45 @@ gv_save_config_all(sc); } =20 +/* 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 =3D NULL; + d2 =3D NULL; + p =3D NULL; + p2 =3D NULL; + s =3D NULL; + s2 =3D NULL; + flags =3D GV_FLAG_R; + sc =3D 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) --uXxzq0nDebZQVNAZ-- --OaZoDhBhXzo6bW1J Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.2 (GNU/Linux) iD8DBQFEGwVqCILg8nMIdCURApFuAJwK6cZ+8Ts8K8s5WR+8bB/ZeO6QkQCeOTzn 3G7WdWkwHXCoijFNk75/Kkk= =CuGe -----END PGP SIGNATURE----- --OaZoDhBhXzo6bW1J--