summaryrefslogtreecommitdiff
path: root/usr/src/lib/lvm
diff options
context:
space:
mode:
authorpetede <none@none>2006-11-21 06:39:35 -0800
committerpetede <none@none>2006-11-21 06:39:35 -0800
commit77c11b2a69abbeae74156552bbf12a31495d66ed (patch)
treefa4ee0d2e70abb192dde435d12cc590102c38e34 /usr/src/lib/lvm
parent1b5f7228f8eb94767e87bc125455926c72572e72 (diff)
downloadillumos-joyent-77c11b2a69abbeae74156552bbf12a31495d66ed.tar.gz
6494172 fsck core dumps if metadevice name doesn't start with a 'd'
Diffstat (limited to 'usr/src/lib/lvm')
-rw-r--r--usr/src/lib/lvm/libmeta/common/mapfile-vers1
-rw-r--r--usr/src/lib/lvm/libmeta/common/meta_name.c2
-rw-r--r--usr/src/lib/lvm/libpreen/common/mdpreen.c47
3 files changed, 5 insertions, 45 deletions
diff --git a/usr/src/lib/lvm/libmeta/common/mapfile-vers b/usr/src/lib/lvm/libmeta/common/mapfile-vers
index dd1814c718..63b52177d6 100644
--- a/usr/src/lib/lvm/libmeta/common/mapfile-vers
+++ b/usr/src/lib/lvm/libmeta/common/mapfile-vers
@@ -677,6 +677,7 @@ SUNWprivate_1.1 {
open_admin;
open_mnttab;
own_set;
+ parse_device;
parse_interlace;
pathname_reload;
pick_good_disk;
diff --git a/usr/src/lib/lvm/libmeta/common/meta_name.c b/usr/src/lib/lvm/libmeta/common/meta_name.c
index dc628b5514..c9aa05185d 100644
--- a/usr/src/lib/lvm/libmeta/common/meta_name.c
+++ b/usr/src/lib/lvm/libmeta/common/meta_name.c
@@ -141,7 +141,7 @@ blkname(
* If the set name is specified as part of uname then use that
* otherwise attempt to get the set name from sp.
*/
-static void
+void
parse_device(
mdsetname_t *sp,
char *uname,
diff --git a/usr/src/lib/lvm/libpreen/common/mdpreen.c b/usr/src/lib/lvm/libpreen/common/mdpreen.c
index 252a1b2768..0220cd9e41 100644
--- a/usr/src/lib/lvm/libpreen/common/mdpreen.c
+++ b/usr/src/lib/lvm/libpreen/common/mdpreen.c
@@ -124,48 +124,6 @@ get_major_from_n2m(char *modname, int *major)
}
/*
- * If the name contains a diskset name, it is parsed out and returned.
- * The dev_path can be either a md pathname /dev/md/rdsk/d0 or a path
- * name that contains a diskset /dev/md/red/rdsk/d0.
- */
-
-static char *
-parse_path(char *dev_path)
-{
- char *cpdev;
- char *cp, *cpp;
- char *setname;
- size_t size;
-
- /*
- * paths are /dev/md/rdsk/dx or /dev/md/<setname>/rdsk/dx
- * cp points to /rdsk/dx. Scan back to the previous slash.
- * If this matches "dev", then path is a local set.
- *
- * The /rdsk/d pattern in strstr is used so that users with
- * a twisted mind can create a diskset called "rdsk" and
- * would still want everything to work!!
- */
- cp = strstr(dev_path, "/rdsk/d");
-
- for (cpdev = cp - 1; *cpdev != '/'; cpdev--);
- cpdev = cpdev - 3; /* backspace 3 char */
- if (strncmp(cpdev, "dev", strlen("dev")) == 0)
- return (Strdup(MD_LOCAL_NAME));
-
- /*
- * extract the setname from the path
- */
- cpp = cp;
- for (cp--; *cp != '/'; cp--);
- size = (size_t)(cpp - cp);
- setname = (char *)Malloc(size);
- (void) strlcpy(setname, (const char *)(cp + 1), size);
-
- return (setname);
-}
-
-/*
* This routine is called from preenlib the first time. It is then
* recursively called through preen_subdev.
*
@@ -181,6 +139,7 @@ preen_build_devs(
)
{
char *setname = NULL;
+ char *tname = NULL;
mdsetname_t *sp;
mdname_t *namep; /* metadevice name */
mdnamelist_t *nlp = NULL; /* list of real devices */
@@ -237,8 +196,8 @@ preen_build_devs(
/*
* parse the path name to get the diskset name.
*/
-
- setname = parse_path(uname);
+ parse_device(NULL, uname, &tname, &setname);
+ Free(tname);
if ((sp = metasetname(setname, ep)) == NULL) {
ep_valid = 1;
goto out;