diff options
author | mav <mav@FreeBSD.org> | 2015-04-09 10:10:05 +0000 |
---|---|---|
committer | mav <mav@FreeBSD.org> | 2015-04-09 10:10:05 +0000 |
commit | 5f22f76484ca0d7ab92d0d4190aafcb0d796a0f3 (patch) | |
tree | 0d36e36d8e52fbecb3ae89e61c842c29ceb5de3a | |
parent | 2b74acfbccc9df3abd609f0c8106be951ea02875 (diff) | |
download | FreeBSD-src-5f22f76484ca0d7ab92d0d4190aafcb0d796a0f3.zip FreeBSD-src-5f22f76484ca0d7ab92d0d4190aafcb0d796a0f3.tar.gz |
MFC r280687: Make GEOM_PART work in presence of previous withered self.
-rw-r--r-- | lib/libgeom/geom_xml2tree.c | 15 | ||||
-rw-r--r-- | sbin/geom/class/part/geom_part.c | 13 | ||||
-rw-r--r-- | sys/geom/part/g_part.c | 7 |
3 files changed, 24 insertions, 11 deletions
diff --git a/lib/libgeom/geom_xml2tree.c b/lib/libgeom/geom_xml2tree.c index 2874cd0..d5d4f31 100644 --- a/lib/libgeom/geom_xml2tree.c +++ b/lib/libgeom/geom_xml2tree.c @@ -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 *name) 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 *name) } 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; } diff --git a/sbin/geom/class/part/geom_part.c b/sbin/geom/class/part/geom_part.c index 32203f7..83e0b11 100644 --- a/sbin/geom/class/part/geom_part.c +++ b/sbin/geom/class/part/geom_part.c @@ -207,15 +207,20 @@ find_class(struct gmesh *mesh, const char *name) 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 * @@ -598,6 +603,8 @@ gpart_show_geom(struct ggeom *gp, const char *element, int show_providers) 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); diff --git a/sys/geom/part/g_part.c b/sys/geom/part/g_part.c index b3e9f27..c64d98a 100644 --- a/sys/geom/part/g_part.c +++ b/sys/geom/part/g_part.c @@ -451,7 +451,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); @@ -473,10 +474,6 @@ g_part_parm_geom(struct gctl_req *req, const char *name, struct g_geom **v) 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); } |