/* * 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); }