Exemplo n.º 1
0
/*
 * 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));
}
Exemplo n.º 2
0
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);
}