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