Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 4 Oct 2011 16:47:18 +0000 (UTC)
From:      "Lev A. Serebryakov" <lev@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r225984 - in projects/geom-events: sbin/geom/class/raid3 sys/geom/raid3
Message-ID:  <201110041647.p94GlIo3066146@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201110041647.p94GlIo3066146>