[Midnightbsd-cvs] src [8349] trunk/sys/geom/raid: make graid command line a bit more friendly by allowing volume name or provider name to be specified instead of geom name
laffer1 at midnightbsd.org
laffer1 at midnightbsd.org
Sun Sep 18 14:21:56 EDT 2016
Revision: 8349
http://svnweb.midnightbsd.org/src/?rev=8349
Author: laffer1
Date: 2016-09-18 14:21:55 -0400 (Sun, 18 Sep 2016)
Log Message:
-----------
make graid command line a bit more friendly by allowing volume name or provider name to be specified instead of geom name
Modified Paths:
--------------
trunk/sys/geom/raid/g_raid_ctl.c
trunk/sys/geom/raid/md_ddf.c
trunk/sys/geom/raid/md_intel.c
trunk/sys/geom/raid/md_promise.c
Modified: trunk/sys/geom/raid/g_raid_ctl.c
===================================================================
--- trunk/sys/geom/raid/g_raid_ctl.c 2016-09-18 18:21:07 UTC (rev 8348)
+++ trunk/sys/geom/raid/g_raid_ctl.c 2016-09-18 18:21:55 UTC (rev 8349)
@@ -51,7 +51,10 @@
{
struct g_raid_softc *sc;
struct g_geom *gp;
+ struct g_provider *pp;
+ struct g_raid_volume *vol;
+ /* Look for geom with specified name. */
LIST_FOREACH(gp, &mp->geom, geom) {
sc = gp->softc;
if (sc == NULL)
@@ -61,6 +64,35 @@
if (strcasecmp(sc->sc_name, name) == 0)
return (sc);
}
+
+ /* Look for provider with specified name. */
+ LIST_FOREACH(gp, &mp->geom, geom) {
+ sc = gp->softc;
+ if (sc == NULL)
+ continue;
+ if (sc->sc_stopping != 0)
+ continue;
+ LIST_FOREACH(pp, &gp->provider, provider) {
+ if (strcmp(pp->name, name) == 0)
+ return (sc);
+ if (strncmp(pp->name, "raid/", 5) == 0 &&
+ strcmp(pp->name + 5, name) == 0)
+ return (sc);
+ }
+ }
+
+ /* Look for volume with specified name. */
+ LIST_FOREACH(gp, &mp->geom, geom) {
+ sc = gp->softc;
+ if (sc == NULL)
+ continue;
+ if (sc->sc_stopping != 0)
+ continue;
+ TAILQ_FOREACH(vol, &sc->sc_volumes, v_next) {
+ if (strcmp(vol->v_name, name) == 0)
+ return (sc);
+ }
+ }
return (NULL);
}
Modified: trunk/sys/geom/raid/md_ddf.c
===================================================================
--- trunk/sys/geom/raid/md_ddf.c 2016-09-18 18:21:07 UTC (rev 8348)
+++ trunk/sys/geom/raid/md_ddf.c 2016-09-18 18:21:55 UTC (rev 8349)
@@ -2231,7 +2231,7 @@
struct g_consumer *cp;
struct g_provider *pp;
char arg[16];
- const char *verb, *volname, *levelname, *diskname;
+ const char *nodename, *verb, *volname, *levelname, *diskname;
char *tmp;
int *nargs, *force;
off_t size, sectorsize, strip, offs[DDF_MAX_DISKS_HARD], esize;
@@ -2502,8 +2502,12 @@
}
if (strcmp(verb, "delete") == 0) {
+ nodename = gctl_get_asciiparam(req, "arg0");
+ if (nodename != NULL && strcasecmp(sc->sc_name, nodename) != 0)
+ nodename = NULL;
+
/* Full node destruction. */
- if (*nargs == 1) {
+ if (*nargs == 1 && nodename != NULL) {
/* Check if some volume is still open. */
force = gctl_get_paraml(req, "force", sizeof(*force));
if (force != NULL && *force == 0 &&
@@ -2521,11 +2525,12 @@
}
/* Destroy specified volume. If it was last - all node. */
- if (*nargs != 2) {
+ if (*nargs > 2) {
gctl_error(req, "Invalid number of arguments.");
return (-1);
}
- volname = gctl_get_asciiparam(req, "arg1");
+ volname = gctl_get_asciiparam(req,
+ nodename != NULL ? "arg1" : "arg0");
if (volname == NULL) {
gctl_error(req, "No volume name.");
return (-2);
@@ -2535,6 +2540,14 @@
TAILQ_FOREACH(vol, &sc->sc_volumes, v_next) {
if (strcmp(vol->v_name, volname) == 0)
break;
+ pp = vol->v_provider;
+ if (pp == NULL)
+ continue;
+ if (strcmp(pp->name, volname) == 0)
+ break;
+ if (strncmp(pp->name, "raid/", 5) == 0 &&
+ strcmp(pp->name + 5, volname) == 0)
+ break;
}
if (vol == NULL) {
i = strtol(volname, &tmp, 10);
Modified: trunk/sys/geom/raid/md_intel.c
===================================================================
--- trunk/sys/geom/raid/md_intel.c 2016-09-18 18:21:07 UTC (rev 8348)
+++ trunk/sys/geom/raid/md_intel.c 2016-09-18 18:21:55 UTC (rev 8349)
@@ -1461,7 +1461,7 @@
struct g_consumer *cp;
struct g_provider *pp;
char arg[16], serial[INTEL_SERIAL_LEN];
- const char *verb, *volname, *levelname, *diskname;
+ const char *nodename, *verb, *volname, *levelname, *diskname;
char *tmp;
int *nargs, *force;
off_t off, size, sectorsize, strip, disk_sectors;
@@ -1876,8 +1876,12 @@
}
if (strcmp(verb, "delete") == 0) {
+ nodename = gctl_get_asciiparam(req, "arg0");
+ if (nodename != NULL && strcasecmp(sc->sc_name, nodename) != 0)
+ nodename = NULL;
+
/* Full node destruction. */
- if (*nargs == 1) {
+ if (*nargs == 1 && nodename != NULL) {
/* Check if some volume is still open. */
force = gctl_get_paraml(req, "force", sizeof(*force));
if (force != NULL && *force == 0 &&
@@ -1895,11 +1899,12 @@
}
/* Destroy specified volume. If it was last - all node. */
- if (*nargs != 2) {
+ if (*nargs > 2) {
gctl_error(req, "Invalid number of arguments.");
return (-1);
}
- volname = gctl_get_asciiparam(req, "arg1");
+ volname = gctl_get_asciiparam(req,
+ nodename != NULL ? "arg1" : "arg0");
if (volname == NULL) {
gctl_error(req, "No volume name.");
return (-2);
@@ -1909,6 +1914,14 @@
TAILQ_FOREACH(vol, &sc->sc_volumes, v_next) {
if (strcmp(vol->v_name, volname) == 0)
break;
+ pp = vol->v_provider;
+ if (pp == NULL)
+ continue;
+ if (strcmp(pp->name, volname) == 0)
+ break;
+ if (strncmp(pp->name, "raid/", 5) == 0 &&
+ strcmp(pp->name + 5, volname) == 0)
+ break;
}
if (vol == NULL) {
i = strtol(volname, &tmp, 10);
Modified: trunk/sys/geom/raid/md_promise.c
===================================================================
--- trunk/sys/geom/raid/md_promise.c 2016-09-18 18:21:07 UTC (rev 8348)
+++ trunk/sys/geom/raid/md_promise.c 2016-09-18 18:21:55 UTC (rev 8349)
@@ -1217,7 +1217,7 @@
struct g_consumer *cp;
struct g_provider *pp;
char arg[16];
- const char *verb, *volname, *levelname, *diskname;
+ const char *nodename, *verb, *volname, *levelname, *diskname;
char *tmp;
int *nargs, *force;
off_t size, sectorsize, strip;
@@ -1478,8 +1478,12 @@
}
if (strcmp(verb, "delete") == 0) {
+ nodename = gctl_get_asciiparam(req, "arg0");
+ if (nodename != NULL && strcasecmp(sc->sc_name, nodename) != 0)
+ nodename = NULL;
+
/* Full node destruction. */
- if (*nargs == 1) {
+ if (*nargs == 1 && nodename != NULL) {
/* Check if some volume is still open. */
force = gctl_get_paraml(req, "force", sizeof(*force));
if (force != NULL && *force == 0 &&
@@ -1497,11 +1501,12 @@
}
/* Destroy specified volume. If it was last - all node. */
- if (*nargs != 2) {
+ if (*nargs > 2) {
gctl_error(req, "Invalid number of arguments.");
return (-1);
}
- volname = gctl_get_asciiparam(req, "arg1");
+ volname = gctl_get_asciiparam(req,
+ nodename != NULL ? "arg1" : "arg0");
if (volname == NULL) {
gctl_error(req, "No volume name.");
return (-2);
@@ -1511,6 +1516,14 @@
TAILQ_FOREACH(vol, &sc->sc_volumes, v_next) {
if (strcmp(vol->v_name, volname) == 0)
break;
+ pp = vol->v_provider;
+ if (pp == NULL)
+ continue;
+ if (strcmp(pp->name, volname) == 0)
+ break;
+ if (strncmp(pp->name, "raid/", 5) == 0 &&
+ strcmp(pp->name + 5, volname) == 0)
+ break;
}
if (vol == NULL) {
i = strtol(volname, &tmp, 10);
More information about the Midnightbsd-cvs
mailing list