Make GEOM_PART work in presence of previous withered self.
MFC after: 2 weeks Sponsored by: iXsystems, Inc.
This commit is contained in:
parent
2f36085dcf
commit
5523c82c1a
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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 *
|
||||
@ -609,6 +614,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);
|
||||
|
@ -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, 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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user