Exemple #1
0
/*
 * clear metadevice or hotspare pool
 */
static int
clear_name(
	mdsetname_t	**spp,
	char		*uname,
	mdcmdopts_t	options,
	md_error_t	*ep
)
{

	/* clear hotspare pool */
	if (is_existing_hsp(*spp, uname)) {
		mdhspname_t	*hspnp;

		/* get hotspare pool name */
		if ((hspnp = metahspname(spp, uname, ep)) == NULL)
			return (-1);
		assert(*spp != NULL);

		/* grab set lock */
		if (meta_lock(*spp, TRUE, ep))
			return (-1);

		/* check for ownership */
		if (meta_check_ownership(*spp, ep) != 0)
			return (-1);

		/* clear hotspare pool */
		return (meta_hsp_reset(*spp, hspnp, options, ep));
	}

	/* clear metadevice */
	else {
		mdname_t	*np;

		/* check for ownership */
		if (meta_check_ownership(*spp, ep) != 0)
			return (-1);

		/* get metadevice name */
		if (((np = metaname(spp, uname, META_DEVICE, ep)) == NULL) ||
		    (metachkmeta(np, ep) != 0)) {
			return (-1);
		}
		assert(*spp != NULL);

		/* grab set lock */
		if (meta_lock(*spp, TRUE, ep))
			return (-1);

		/* clear metadevice */
		return (meta_reset_by_name(*spp, np, options, ep));
	}
}
int
get_mdcomponents(char *uname, svm_info_t **svmpp)
{

	svm_info_t	*svmp;
	md_error_t	status, *ep;
	mdname_t	*namep;
	mdnamelist_t	*nlp = NULL;
	mdnamelist_t	*p;
	mdsetname_t	*sp = NULL;
	char		*strp = NULL;
	int		rval, cnt;

	rval = RET_SUCCESS;
	cnt = 0;
	status = mdnullerror;
	ep = &status;
	svmp = *svmpp;

	(void) init_metalib();

	debug_printf("get_mdcomponents(): Enter unit name %s\n", uname);

	if (((namep = metaname(&sp, uname, META_DEVICE, ep)) == NULL) ||
					(metachkmeta(namep, ep) != 0)) {
		debug_printf("get_mdcomponents(): "
				"metaname or metachkmeta failed\n");
		mdclrerror(ep);
		return (RET_ERROR);
	}

	debug_printf("get_mdcomponents(): meta_getdevs %s\n", namep->cname);

	if ((meta_getdevs(sp, namep, &nlp, ep)) < 0) {
		debug_printf("get_mdcomponents(): "
				"comp %s - meta_getdevs failed\n", uname);
		metafreenamelist(nlp);
		mdclrerror(ep);
		return (RET_ERROR);
	}

	/* compute the number of devices */

	for (p = nlp, cnt = 0; p != NULL;  p = p->next, cnt++)
		;

	/*
	 * Need to add n -1 components since slvmp already has space
	 * for one device.
	 */

	svmp = (svm_info_t *)realloc(svmp, sizeof (svm_info_t) +
		(sizeof (char *) * (cnt - 1)));

	if (svmp == NULL) {
		debug_printf("get_mdcomponents(): realloc of svmp failed\n");
		metafreenamelist(nlp);
		return (RET_ERROR);
	}


	for (p = nlp, cnt = 0; p != NULL; p = p->next, cnt++) {
		mdname_t	*devnp = p->namep;

		if ((strp = strdup(devnp->cname)) == NULL) {
			rval = RET_ERROR;
			break;
		}
		svmp->md_comps[cnt] = strp;
	}

	/* count is set to the number of devices in the list */

	svmp->count = cnt;
	svmp->root_md = strdup(uname);
	if (rval == RET_SUCCESS && svmp->root_md != NULL) {
		debug_printf("get_mdcomponents(): root_md %s count %d \n",
			svmp->root_md, svmp->count);
		for (cnt = 0; cnt < svmp->count; cnt++)
			debug_printf("get_mdcomponents(): %s\n",
							svmp->md_comps[cnt]);
	} else {
		rval = RET_ERROR;
		svm_free(svmp);
		svmp = NULL;
		debug_printf("get_mdcomponents(): malloc failed\n");

	}


	metafreenamelist(nlp);
	*svmpp = svmp;
	return (rval);
}