svn commit: r225984 - in projects/geom-events:
sbin/geom/class/raid3 sys/geom/raid3
Lev A. Serebryakov
lev at FreeBSD.org
Tue Oct 4 16:47:18 UTC 2011
Author: lev (ports committer)
Date: Tue Oct 4 16:47:18 2011
New Revision: 225984
URL: http://svn.freebsd.org/changeset/base/225984
Log:
Locally fix kern/160562: Allow to insert new component to geom_raid3
without specifying number.
Now "geom_raid3" requires "-n <number>" argument for "insert" command,
which insert new component instead of removed (or failed) one.
It is not convient in most cases (one lost component).
This patch allows not to specify component number. In such case new
component is added instead of first missed component.
Modified:
projects/geom-events/sbin/geom/class/raid3/geom_raid3.c
projects/geom-events/sbin/geom/class/raid3/graid3.8
projects/geom-events/sys/geom/raid3/g_raid3_ctl.c
Modified: projects/geom-events/sbin/geom/class/raid3/geom_raid3.c
==============================================================================
--- projects/geom-events/sbin/geom/class/raid3/geom_raid3.c Tue Oct 4 15:06:11 2011 (r225983)
+++ projects/geom-events/sbin/geom/class/raid3/geom_raid3.c Tue Oct 4 16:47:18 2011 (r225984)
@@ -76,10 +76,10 @@ struct g_command class_commands[] = {
{ "insert", G_FLAG_VERBOSE, NULL,
{
{ 'h', "hardcode", NULL, G_TYPE_BOOL },
- { 'n', "number", NULL, G_TYPE_NUMBER },
+ { 'n', "number", G_VAL_OPTIONAL, G_TYPE_NUMBER },
G_OPT_SENTINEL
},
- "[-hv] <-n number> name prov"
+ "[-hv] [-n number] name prov"
},
{ "label", G_FLAG_VERBOSE, raid3_main,
{
Modified: projects/geom-events/sbin/geom/class/raid3/graid3.8
==============================================================================
--- projects/geom-events/sbin/geom/class/raid3/graid3.8 Tue Oct 4 15:06:11 2011 (r225983)
+++ projects/geom-events/sbin/geom/class/raid3/graid3.8 Tue Oct 4 16:47:18 2011 (r225984)
@@ -53,7 +53,7 @@
.Nm
.Cm insert
.Op Fl hv
-.Fl n Ar number
+.Op Fl n Ar number
.Ar name
.Ar prov
.Nm
@@ -171,6 +171,8 @@ Add the given component to the existing
removed previously with the
.Cm remove
command or if one component is missing and will not be connected again.
+If no number is given, the new component will be added instead of the first
+missed component.
.Pp
Additional options include:
.Bl -tag -width ".Fl h"
Modified: projects/geom-events/sys/geom/raid3/g_raid3_ctl.c
==============================================================================
--- projects/geom-events/sys/geom/raid3/g_raid3_ctl.c Tue Oct 4 15:06:11 2011 (r225983)
+++ projects/geom-events/sys/geom/raid3/g_raid3_ctl.c Tue Oct 4 16:47:18 2011 (r225984)
@@ -404,7 +404,7 @@ g_raid3_ctl_insert(struct gctl_req *req,
u_char *sector;
off_t compsize;
intmax_t *no;
- int *hardcode, *nargs, error;
+ int *hardcode, *nargs, error, autono;
nargs = gctl_get_paraml(req, "nargs", sizeof(*nargs));
if (nargs == NULL) {
@@ -425,11 +425,10 @@ g_raid3_ctl_insert(struct gctl_req *req,
gctl_error(req, "No 'arg%u' argument.", 1);
return;
}
- no = gctl_get_paraml(req, "number", sizeof(*no));
- if (no == NULL) {
- gctl_error(req, "No '%s' argument.", "no");
- return;
- }
+ if (gctl_get_param(req, "number", NULL) != NULL)
+ no = gctl_get_paraml(req, "number", sizeof(*no));
+ else
+ no = NULL;
if (strncmp(name, "/dev/", 5) == 0)
name += 5;
g_topology_lock();
@@ -465,16 +464,28 @@ g_raid3_ctl_insert(struct gctl_req *req,
gctl_error(req, "No such device: %s.", name);
goto end;
}
- if (*no >= sc->sc_ndisks) {
- sx_xunlock(&sc->sc_lock);
- gctl_error(req, "Invalid component number.");
- goto end;
- }
- disk = &sc->sc_disks[*no];
- if (disk->d_state != G_RAID3_DISK_STATE_NODISK) {
- sx_xunlock(&sc->sc_lock);
- gctl_error(req, "Component %jd is already connected.", *no);
- goto end;
+ if (no != NULL) {
+ if (*no >= sc->sc_ndisks) {
+ sx_xunlock(&sc->sc_lock);
+ gctl_error(req, "Invalid component number.");
+ goto end;
+ }
+ disk = &sc->sc_disks[*no];
+ if (disk->d_state != G_RAID3_DISK_STATE_NODISK) {
+ sx_xunlock(&sc->sc_lock);
+ gctl_error(req, "Component %jd is already connected.", *no);
+ goto end;
+ }
+ } else {
+ disk = NULL;
+ for (autono = 0; autono < sc->sc_ndisks && disk == NULL; autono++)
+ if (sc->sc_disks[autono].d_state == G_RAID3_DISK_STATE_NODISK)
+ disk = &sc->sc_disks[autono];
+ if (disk == NULL) {
+ sx_xunlock(&sc->sc_lock);
+ gctl_error(req, "No unconnected components.");
+ goto end;
+ }
}
if (((sc->sc_sectorsize / (sc->sc_ndisks - 1)) % pp->sectorsize) != 0) {
sx_xunlock(&sc->sc_lock);
More information about the svn-src-projects
mailing list