diff options
author | petede <none@none> | 2006-11-21 06:39:35 -0800 |
---|---|---|
committer | petede <none@none> | 2006-11-21 06:39:35 -0800 |
commit | 77c11b2a69abbeae74156552bbf12a31495d66ed (patch) | |
tree | fa4ee0d2e70abb192dde435d12cc590102c38e34 /usr/src/lib/lvm | |
parent | 1b5f7228f8eb94767e87bc125455926c72572e72 (diff) | |
download | illumos-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-vers | 1 | ||||
-rw-r--r-- | usr/src/lib/lvm/libmeta/common/meta_name.c | 2 | ||||
-rw-r--r-- | usr/src/lib/lvm/libpreen/common/mdpreen.c | 47 |
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; |