/* * Create a list of SVM devices */ static int load_svm() { int max_sets; md_error_t error = *mdl_mdnullerror; int i; if ((max_sets = (mdl_get_max_sets)(&error)) == 0) { return (0); } if (!mdisok(&error)) { (mdl_mdclrerror)(&error); return (0); } /* for each possible set number, see if we really have a diskset */ for (i = 0; i < max_sets; i++) { mdsetname_t *sp; if ((sp = (mdl_metasetnosetname)(i, &error)) == NULL) { if (!mdisok(&error) && mdisrpcerror(&error, RPC_PROGNOTREGISTERED)) { /* metad rpc program not registered - no metasets */ break; } (mdl_mdclrerror)(&error); continue; } (mdl_mdclrerror)(&error); /* pick up drives in disksets with no mdbs/metadevices */ if (sp->setno != 0) { md_drive_desc *dd; dd = (mdl_metaget_drivedesc)(sp, MD_BASICNAME_OK | PRINT_FAST, &error); (mdl_mdclrerror)(&error); for (; dd != NULL; dd = dd->dd_next) { if (drive_in_diskset(dd->dd_dnp->rname, sp->setname)) { (mdl_metaflushsetname)(sp); return (ENOMEM); } } } if (diskset_info(sp)) { (mdl_metaflushsetname)(sp); return (ENOMEM); } (mdl_metaflushsetname)(sp); } (mdl_mdclrerror)(&error); return (0); }
int svm_get_components(char *md_device, svm_info_t **svmpp) { int len; /* * If this is a named diskset with a shared name * (e.g. /dev/md/shared/1/dsk/d10) call get_mdcomponents with * the diskset and metadevice name (e.g. foo/d10). * Otherwise this is a regular name (e.g. /dev/md/dsk/d10 or * /dev/md/foo/dsk/d10 or d10 or foo/d10) all of which * get_mdcomponents can handle directly. */ len = strlen("/dev/md/shared/"); if (strncmp(md_device, "/dev/md/shared/", len) == 0) { int numlen; int setnum; char *cp; char *slashp; char mdname[MAXPATHLEN]; mdsetname_t *sp; md_error_t error = mdnullerror; cp = md_device + len; if ((slashp = strstr(cp, "/")) == NULL) return (RET_ERROR); numlen = slashp - cp; if (numlen >= MAXPATHLEN - 1) return (RET_ERROR); (void) strlcpy(mdname, cp, numlen + 1); /* setnum now contains the diskset number */ setnum = atoi(mdname); if ((sp = metasetnosetname(setnum, &error)) == NULL || !mdisok(&error)) return (RET_ERROR); cp = slashp + 1; /* cp now pointing at dsk/... */ if ((slashp = strstr(cp, "/")) == NULL) return (RET_ERROR); (void) snprintf(mdname, MAXPATHLEN, "%s/%s", sp->setname, slashp + 1); /* mdname now contains diskset and metadevice name e.g. foo/d10 */ debug_printf("svm_get_components(): mdname %s\n", mdname); return (get_mdcomponents(mdname, svmpp)); } else { debug_printf("svm_get_components(): md_device %s\n", md_device); return (get_mdcomponents(md_device, svmpp)); } }
static int new_entry(char *sname, char *type, char *mname, mdsetname_t *sp) { mdname_t *mdn; md_error_t error = *mdl_mdnullerror; mdn = (mdl_metaname)(&sp, sname, UNKNOWN, &error); if (!mdisok(&error)) { (mdl_mdclrerror)(&error); return (0); } if (mdn != NULL && ( mdn->drivenamep->type == MDT_ACCES || mdn->drivenamep->type == MDT_COMP || mdn->drivenamep->type == MDT_FAST_COMP)) { return (add_use_record(mdn->bname, type, mname)); } return (0); }