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