meta_nameinfo.c revision bf85a12b7c81d0745d5a8aff65baeff50006cde9
1N/A * The contents of this file are subject to the terms of the 1N/A * Common Development and Distribution License (the "License"). 1N/A * You may not use this file except in compliance with the License. 1N/A * See the License for the specific language governing permissions 1N/A * and limitations under the License. 1N/A * When distributing Covered Code, include this CDDL HEADER in each 1N/A * If applicable, add the following below this CDDL HEADER, with the 1N/A * fields enclosed by brackets "[]" replaced with your own identifying 1N/A * information: Portions Copyright [yyyy] [name of copyright owner] 1N/A * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 1N/A * Use is subject to license terms. 1N/A * return set for a device 1N/A /* regular device */ 1N/A * convert system to md types 1N/A * convert efi to md types 1N/A * It is possible to present an efi label but be using vtoc 1N/A * disks to create a > 1 TB metadevice. In case the first 1N/A * disk in the underlying metadevice is a vtoc disk and starts 1N/A * at the beginning of the disk it is necessary to convey this 1N/A * information to the user. 1N/A * Due to the lack of a label for the entire partition table, 1N/A * we use p_name of the reserved partition 1N/A /* Stop at first (if any) space or tab */ 1N/A /* first we count how many partitions we have to send */ 1N/A /* if we are here, we know the partition is really used */ 1N/A * Due to the lack of a label for the entire partition table, 1N/A * we use p_name of the reserved partition 1N/A * getdrvnode -- return the driver name based on mdname_t->bname 1N/A * Need to free pointer when finished. 1N/A * At this point devicespath should be like the following 1N/A * "/devices/<unknow_and_dont_care>/xxxx@vvvv" 1N/A * There's a couple of 'if' statements below which could 1N/A * return an error condition, but I've decide to allow 1N/A * a more open approach regarding the mapping so as to 1N/A * not restrict possible future projects. 1N/A * drvnode now just "xxxx@vvvv" 1N/A * Now drvnode is just the driver name "xxxx" 1N/A * meta_load_dl -- open dynamic library using LDLIBRARYPATH, a debug 1N/A * environment variable METALDPATH, or the default location. 1N/A * Library seach algorithm: 1N/A * 1) Use LDLIBRARYPATH which is implied when a non-absolute 1N/A * path name is passed to dlopen() 1N/A * 2) Use the value of METALDPATH as the directory. Mainly 1N/A * used for debugging 1N/A * 3) Last search the default location of "/usr/lib" 1N/A * Common failure here would be failing to 1N/A * Some controllers will not have a library 1N/A * because there's no enclosure or name 1N/A * translation required. 1N/A * meta_match_names -- possibly convert the driver names returned by CINFO 1N/A * meta_match_enclosure -- return any enclosure info if found 1N/A * Looks like this library wanted to handle 1N/A * our device and had an internal error. 1N/A * Found a library to handle the request so 1N/A * just return with data provided. 1N/A * Need to continue the search 1N/A * See if the driver name returned from DKIOCINFO 1N/A * is valid or not. In somecases, such as the ap_dmd 1N/A * driver, we need to modify the name that's return 1N/A * for everything to work. 1N/A /* return success */ 1N/A * free allocations in vtoc 1N/A int err = 0;
/* saves errno from ioctl */ 1N/A * the following assigment works because the 1N/A * mdname_t structs are always created as part 1N/A * of the drivenamep struct. When a user 1N/A * creates an mdname_t struct it either 1N/A * uses an existing drivenamep struct or creates 1N/A * a new one and then adds the mdname_t struct 1N/A * as part of its parts_val array. So what is 1N/A * being computed below is the slice offset in 1N/A * the parts_val array. 1N/A /* can't get vtoc */ 1N/A /* get all the info */ 1N/A * The disk is open so this is a good point to get the devid 1N/A * otherwise it will need to be done at another time which 1N/A * means reopening it. 1N/A /* there is no devid for the disk */ 1N/A * The minor name could be NULL if the underlying 1N/A * device driver does not support 'minor names'. 1N/A * This means we do not use devid's for this device. 1N/A * SunCluster did driver does not support minor names. 1N/A "%s no minor name (no devid)\n"),
1N/A * if our drivenamep points to a device not supporting DKIOCGGEOM, 1N/A * it's likely to have an EFI label. 1N/A * If we are here, there was either no failure on DKIOCGGEOM or 1N/A * the failure was ENOTSUP 1N/A /* DKIOCGGEOM yielded ENOTSUP => try efi_alloc_and_read */ 1N/A /* this also sets errno */ 1N/A /* convert to our format */ 1N/A * libmeta needs at least V_NUMPAR partitions. 1N/A * If we have an EFI partition with less than V_NUMPAR slices, 1N/A * we nevertheless reserve space for V_NUMPAR 1N/A /* no error on DKIOCGGEOM, try meta_getvtoc */ 1N/A /* convert to our format */ 1N/A /* fix up any drives which are now accessible */ 1N/A * Set the vtoc, but use the cached copy to get the info from. 1N/A * We write np->drivenamep->vtoc to disk. 1N/A * Before we can do this we read the vtoc in. 1N/A * if we're dealing with a metadevice and this metadevice is a 64 bit device 1N/A * dnp->vtoc (actually being a mdvtoc_t) into a vtoc_t 1N/A /* allocation of gpt is done in meta_mdvtoc_to_efi */ mdname_t *
np,
/* only rname, drivenamep, are setup */ mdname_t *
np,
/* only rname, drivenamep, are setup */ /* get controller info */ /* convert to our format */ * find out where database replicas end /* make sure we have a component */ /* get replicas, quit if none */ /* go through all the replicas */ /* cleanup, return success */ * return cached start block /* look for database locations */ * does device have a metadb * return cached start block /* look for database locations */ /* roundup to next cylinder */ * return cached devices name * get metadevice misc name /* get misc module from driver */ * get unit structure from driver /* get size of unit structure */ /* get actual unit structure */ * free metadevice name info /* get rid of cached name info */ /* get rid of cached drivename info */ (
void)
memset(&d,
'\0',
sizeof (d));
* shortcut: if the device is open, no need to check on other nodes, * even in case of a mn metadevice * Also return in case we're told not to check on other nodes. * If the device is closed locally, but it's a mn device, * check on all other nodes, too * This message is never directly issued. * So we launch it with a suspend override flag. * If the commd is suspended, and this message comes * along it must be sent due to replaying a metainit or * similar. In that case we don't want this message to * If the commd is not suspended, the flag does no harm. * Additionally we don't want the result of the message * cached in the MCT, because we want uptodate results, * and the message doesn't need being logged either. * Hence NO_LOG and NO_MCT * in case some error occurred, * we better say the device is open