svn commit: r280687 - in head: lib/libgeom sbin/geom/class/part sys/geom/part

Alexander Motin mav at FreeBSD.org
Thu Mar 26 12:17:49 UTC 2015


Author: mav
Date: Thu Mar 26 12:17:47 2015
New Revision: 280687
URL: https://svnweb.freebsd.org/changeset/base/280687

Log:
  Make GEOM_PART work in presence of previous withered self.
  
  MFC after:	2 weeks
  Sponsored by:	iXsystems, Inc.

Modified:
  head/lib/libgeom/geom_xml2tree.c
  head/sbin/geom/class/part/geom_part.c
  head/sys/geom/part/g_part.c

Modified: head/lib/libgeom/geom_xml2tree.c
==============================================================================
--- head/lib/libgeom/geom_xml2tree.c	Thu Mar 26 11:19:24 2015	(r280686)
+++ head/lib/libgeom/geom_xml2tree.c	Thu Mar 26 12:17:47 2015	(r280687)
@@ -186,6 +186,7 @@ static void
 EndElement(void *userData, const char *name)
 {
 	struct mystate *mt;
+	struct gconf *c;
 	struct gconfig *gc;
 	char *p;
 
@@ -259,7 +260,14 @@ EndElement(void *userData, const char *n
 		return;
 	}
 
-	if (mt->config != NULL) {
+	if (mt->config != NULL || (!strcmp(name, "wither") &&
+	    (mt->provider != NULL || mt->geom != NULL))) {
+		if (mt->config != NULL)
+			c = mt->config;
+		else if (mt->provider != NULL)
+			c = &mt->provider->lg_config;
+		else
+			c = &mt->geom->lg_config;
 		gc = calloc(1, sizeof *gc);
 		if (gc == NULL) {
 			mt->error = errno;
@@ -270,14 +278,15 @@ EndElement(void *userData, const char *n
 		}
 		gc->lg_name = strdup(name);
 		if (gc->lg_name == NULL) {
+			free(gc);
 			mt->error = errno;
 			XML_StopParser(mt->parser, 0);
 			warn("Cannot allocate memory during processing of '%s' "
 			    "element", name);
 			return;
 		}
-		gc->lg_val = p;
-		LIST_INSERT_HEAD(mt->config, gc, lg_config);
+		gc->lg_val = p ? p : strdup("1");
+		LIST_INSERT_HEAD(c, gc, lg_config);
 		return;
 	}
 

Modified: head/sbin/geom/class/part/geom_part.c
==============================================================================
--- head/sbin/geom/class/part/geom_part.c	Thu Mar 26 11:19:24 2015	(r280686)
+++ head/sbin/geom/class/part/geom_part.c	Thu Mar 26 12:17:47 2015	(r280687)
@@ -207,15 +207,20 @@ find_class(struct gmesh *mesh, const cha
 static struct ggeom *
 find_geom(struct gclass *classp, const char *name)
 {
-	struct ggeom *gp;
+	struct ggeom *gp, *wgp;
 
 	if (strncmp(name, _PATH_DEV, sizeof(_PATH_DEV) - 1) == 0)
 		name += sizeof(_PATH_DEV) - 1;
+	wgp = NULL;
 	LIST_FOREACH(gp, &classp->lg_geom, lg_geom) {
-		if (strcmp(gp->lg_name, name) == 0)
+		if (strcmp(gp->lg_name, name) != 0)
+			continue;
+		if (find_geomcfg(gp, "wither") == NULL)
 			return (gp);
+		else
+			wgp = gp;
 	}
-	return (NULL);
+	return (wgp);
 }
 
 static const char *
@@ -609,6 +614,8 @@ gpart_show_geom(struct ggeom *gp, const 
 	off_t length, secsz;
 	int idx, wblocks, wname, wmax;
 
+	if (find_geomcfg(gp, "wither"))
+		return;
 	scheme = find_geomcfg(gp, "scheme");
 	if (scheme == NULL)
 		errx(EXIT_FAILURE, "Scheme not found for geom %s", gp->lg_name);

Modified: head/sys/geom/part/g_part.c
==============================================================================
--- head/sys/geom/part/g_part.c	Thu Mar 26 11:19:24 2015	(r280686)
+++ head/sys/geom/part/g_part.c	Thu Mar 26 12:17:47 2015	(r280687)
@@ -452,7 +452,8 @@ g_part_find_geom(const char *name)
 {
 	struct g_geom *gp;
 	LIST_FOREACH(gp, &g_part_class.geom, geom) {
-		if (!strcmp(name, gp->name))
+		if ((gp->flags & G_GEOM_WITHER) == 0 &&
+		    strcmp(name, gp->name) == 0)
 			break;
 	}
 	return (gp);
@@ -474,10 +475,6 @@ g_part_parm_geom(struct gctl_req *req, c
 		gctl_error(req, "%d %s '%s'", EINVAL, name, gname);
 		return (EINVAL);
 	}
-	if ((gp->flags & G_GEOM_WITHER) != 0) {
-		gctl_error(req, "%d %s", ENXIO, gname);
-		return (ENXIO);
-	}
 	*v = gp;
 	return (0);
 }


More information about the svn-src-all mailing list