/* * grow the parent of a device */ int meta_concat_parent( mdsetname_t *sp, mdname_t *childnp, md_error_t *ep ) { md_common_t *mdp; mdname_t *parentnp; md_unit_t *mup; /* should have a set */ assert(sp != NULL); assert(sp->setno == MD_MIN2SET(meta_getminor(childnp->dev))); /* get parent */ if ((mdp = meta_get_unit(sp, childnp, ep)) == NULL) return (-1); if (! MD_HAS_PARENT(mdp->parent)) return (0); if (mdp->parent == MD_MULTI_PARENT) return (0); /* single parent */ if ((parentnp = metamnumname(&sp, mdp->parent, 0, ep)) == NULL) return (-1); /* don't grow non-metadevices or soft partitions */ if (! metaismeta(parentnp) || meta_sp_issp(sp, parentnp, ep) == 0) return (0); if ((mup = meta_get_mdunit(sp, childnp, ep)) == NULL) return (-1); /* grow parent */ if (meta_concat_generic(sp, parentnp, mup->c.un_revision, ep) != 0) return (-1); /* recursively check for parents of parents */ return (meta_concat_parent(sp, parentnp, ep)); }
int get_toplevel_mds(mdnamelist_t **lpp, mdnamelist_t **top_pp, boolean_e verbose) { mdnamelist_t *p, *prevp, *toplp; int ntopmd, i; md_common_t *mdp; md_error_t e = mdnullerror; i = ntopmd = 0; prevp = p = *lpp; toplp = NULL; while (p) { if ((mdp = meta_get_unit(sp, p->namep, &e)) == NULL) { if (verbose == True) monitord_print(6, gettext( "......error on (%d)%s\n"), i, p->namep->devicesname); prevp = p; p = p->next; continue; } if (mdp->parent == MD_NO_PARENT) { /* increment the top level md count. */ ntopmd++; add_to_list(&p, &prevp, &toplp); } else { prevp = p; p = p->next; } i++; } *lpp = NULL; *top_pp = toplp; return (ntopmd); }