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;