diff options
| author | Sheng-Liang Eric Zhang <Shengliang.Zhang@Sun.COM> | 2010-05-05 12:10:59 +0800 |
|---|---|---|
| committer | Sheng-Liang Eric Zhang <Shengliang.Zhang@Sun.COM> | 2010-05-05 12:10:59 +0800 |
| commit | 589271a44eaf1e2b6b05d80b025dc8b94e009aef (patch) | |
| tree | bf476e2d8664fd8f8453179d050cced78c9a4602 /usr/src | |
| parent | 40764c95159232b912f6f16cb1fb1a41897fb0a7 (diff) | |
| download | illumos-joyent-589271a44eaf1e2b6b05d80b025dc8b94e009aef.tar.gz | |
6944423 'format' need identify the name scheme of emc powerpath driver in x86 platform
Diffstat (limited to 'usr/src')
| -rw-r--r-- | usr/src/cmd/format/menu_fdisk.c | 39 | ||||
| -rw-r--r-- | usr/src/cmd/format/misc.c | 37 | ||||
| -rw-r--r-- | usr/src/cmd/format/misc.h | 7 |
3 files changed, 77 insertions, 6 deletions
diff --git a/usr/src/cmd/format/menu_fdisk.c b/usr/src/cmd/format/menu_fdisk.c index 3c1284b54c..c3d9bcdcac 100644 --- a/usr/src/cmd/format/menu_fdisk.c +++ b/usr/src/cmd/format/menu_fdisk.c @@ -19,8 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2010 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. + * Copyright (c) 1993, 2010, Oracle and/or its affiliates. All rights reserved. */ /* @@ -190,6 +189,28 @@ getlong(uchar_t **bp) } #endif /* defined(sparc) */ +#ifdef i386 +/* + * Convert emcpowerN[a-p,p0,p1,p2,p3,p4] to emcpowerNp0 path, + * this is specific for emc powerpath driver. + */ +static void +get_emcpower_pname(char *name, char *devname) +{ + char *emcp = "emcpower"; + char *npt = NULL; + char np[MAXNAMELEN]; + int i = strlen(emcp); + + (void) strcpy(np, devname); + npt = strstr(np, emcp); + while ((i < strlen(npt)) && (isdigit(npt[i]))) + i++; + npt[i] = '\0'; + (void) snprintf(name, MAXNAMELEN, "/dev/rdsk/%sp0", npt); +} +#endif + /* * Convert cn[tn]dn to cn[tn]dns2 path */ @@ -202,6 +223,13 @@ get_sname(char *name) char np[MAXNAMELEN]; char *npt; +#ifdef i386 + if (emcpower_name(cur_disk->disk_name)) { + get_emcpower_pname(name, cur_disk->disk_name); + return; + } +#endif + /* * If it is a full path /dev/[r]dsk/cn[tn]dn, use this path */ @@ -248,6 +276,13 @@ get_pname(char *name) (void) strcpy(np, cur_disk->disk_name); } +#ifdef i386 + if (emcpower_name(np)) { + get_emcpower_pname(name, np); + return; + } +#endif + if (strncmp(rdevp, np, strlen(rdevp)) == 0 || strncmp(devp, np, strlen(devp)) == 0) { /* diff --git a/usr/src/cmd/format/misc.c b/usr/src/cmd/format/misc.c index 55ca2e80a8..785bf642bf 100644 --- a/usr/src/cmd/format/misc.c +++ b/usr/src/cmd/format/misc.c @@ -19,8 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2009 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. + * Copyright (c) 1991, 2010, Oracle and/or its affiliates. All rights reserved. */ /* @@ -674,6 +673,40 @@ conventional_name(char *name) return (*name == 0); } +#ifdef i386 +/* + * Return true if a device name match the emc powerpath name scheme: + * emcpowerN[a-p,p0,p1,p2,p3,p4] + */ +int +emcpower_name(char *name) +{ + char *emcp = "emcpower"; + char *devp = "/dev/dsk"; + char *rdevp = "/dev/rdsk"; + + if (strncmp(devp, name, strlen(devp)) == 0) { + name += strlen(devp) + 1; + } else if (strncmp(rdevp, name, strlen(rdevp)) == 0) { + name += strlen(rdevp) + 1; + } + if (strncmp(emcp, name, strlen(emcp)) == 0) { + name += strlen(emcp); + if (isdigit(*name)) { + skip_digits(name); + if ((*name >= 'a') && (*name <= 'p')) { + name ++; + if ((*name >= '0') && (*name <= '4')) { + name++; + } + } + return (*name == '\0'); + } + } + return (0); +} +#endif + /* * Return true if a device name matches the intel physical name conventions * for the particular system. diff --git a/usr/src/cmd/format/misc.h b/usr/src/cmd/format/misc.h index ca3050b02b..784c2d05e4 100644 --- a/usr/src/cmd/format/misc.h +++ b/usr/src/cmd/format/misc.h @@ -19,8 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. + * Copyright (c) 1991, 2010, Oracle and/or its affiliates. All rights reserved. */ #ifndef _MISC_H @@ -154,6 +153,10 @@ void charmode_off(void); char *alloc_string(char *s); char **build_argvlist(char **, int *, int *, char *); int conventional_name(char *name); +#ifdef i386 +int emcpower_name(char *name); +#endif + #if defined(_FIRMWARE_NEEDS_FDISK) int fdisk_physical_name(char *name); |
