Mercurial > illumos > illumos-gate
changeset 3149:112750a9ab02
6494172 fsck core dumps if metadevice name doesn't start with a 'd'
author | petede |
---|---|
date | Tue, 21 Nov 2006 06:39:35 -0800 |
parents | 9998f6336457 |
children | 2486170b8294 |
files | usr/src/head/meta.h usr/src/lib/lvm/libmeta/common/mapfile-vers usr/src/lib/lvm/libmeta/common/meta_name.c usr/src/lib/lvm/libpreen/common/mdpreen.c |
diffstat | 4 files changed, 6 insertions(+), 45 deletions(-) [+] |
line wrap: on
line diff
--- a/usr/src/head/meta.h Mon Nov 20 22:58:02 2006 -0800 +++ b/usr/src/head/meta.h Tue Nov 21 06:39:35 2006 -0800 @@ -1172,6 +1172,7 @@ extern int meta_is_none(char *uname); extern int is_hspname(char *uname); extern int parse_ctd(char *uname, uint_t *slice); +extern void parse_device(mdsetname_t *, char *, char **, char **); extern md_set_desc *sr2setdesc(md_set_record *sr); extern mdsetname_t *metasetname(char *sname, md_error_t *ep); extern mdsetname_t *metasetnosetname(set_t setno, md_error_t *ep);
--- a/usr/src/lib/lvm/libmeta/common/mapfile-vers Mon Nov 20 22:58:02 2006 -0800 +++ b/usr/src/lib/lvm/libmeta/common/mapfile-vers Tue Nov 21 06:39:35 2006 -0800 @@ -677,6 +677,7 @@ open_admin; open_mnttab; own_set; + parse_device; parse_interlace; pathname_reload; pick_good_disk;
--- a/usr/src/lib/lvm/libmeta/common/meta_name.c Mon Nov 20 22:58:02 2006 -0800 +++ b/usr/src/lib/lvm/libmeta/common/meta_name.c Tue Nov 21 06:39:35 2006 -0800 @@ -141,7 +141,7 @@ * 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,
--- a/usr/src/lib/lvm/libpreen/common/mdpreen.c Mon Nov 20 22:58:02 2006 -0800 +++ b/usr/src/lib/lvm/libpreen/common/mdpreen.c Tue Nov 21 06:39:35 2006 -0800 @@ -124,48 +124,6 @@ } /* - * 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 @@ ) { 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 @@ /* * 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;