diff options
author | Vikram Hegde <Vikram.Hegde@Sun.COM> | 2010-04-09 13:39:36 -0700 |
---|---|---|
committer | Vikram Hegde <Vikram.Hegde@Sun.COM> | 2010-04-09 13:39:36 -0700 |
commit | 94c894bb831b66894f8e0b0bdcf8a9a450530820 (patch) | |
tree | 302352d6535f12a1d5fb5173a0a7a472aec377e2 /usr/src/lib/libdevinfo | |
parent | 5afc78aa05e746cd98000659cff9f89d9995b3fe (diff) | |
download | illumos-gate-94c894bb831b66894f8e0b0bdcf8a9a450530820.tar.gz |
6874797 Solaris needs to support I/O subtree reparenting
Diffstat (limited to 'usr/src/lib/libdevinfo')
-rw-r--r-- | usr/src/lib/libdevinfo/devinfo.c | 92 | ||||
-rw-r--r-- | usr/src/lib/libdevinfo/libdevinfo.h | 7 | ||||
-rw-r--r-- | usr/src/lib/libdevinfo/mapfile-vers | 4 |
3 files changed, 95 insertions, 8 deletions
diff --git a/usr/src/lib/libdevinfo/devinfo.c b/usr/src/lib/libdevinfo/devinfo.c index e9c3e18375..1222707c36 100644 --- a/usr/src/lib/libdevinfo/devinfo.c +++ b/usr/src/lib/libdevinfo/devinfo.c @@ -19,8 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2009 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. + * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. */ /* @@ -3696,8 +3695,53 @@ di_walk_lnode(di_node_t root, uint_t flag, void *arg, return (0); } -di_node_t -di_lookup_node(di_node_t root, char *devfspath) +static char * +alias_to_curr(di_node_t anynode, char *devfspath, di_node_t *nodep) +{ + caddr_t pa; + struct di_all *all; + struct di_alias *di_alias; + di_node_t node; + char *curr; + char *cp; + char *alias; + di_off_t off; + char buf[MAXPATHLEN]; + + *nodep = NULL; + + assert(anynode != DI_NODE_NIL); + + pa = (caddr_t)anynode - DI_NODE(anynode)->self; + all = DI_ALL(pa); + + di_alias = NULL; + for (off = all->aliases; off > 0; off = di_alias->next) { + di_alias = DI_ALIAS(pa + off); + alias = di_alias->alias; + if (strncmp(devfspath, alias, strlen(alias)) == 0) { + cp = devfspath + strlen(alias); + node = DI_NODE(pa + di_alias->curroff); + assert(node != DI_NODE_NIL); + if (*cp == '\0') { + *nodep = node; + return (NULL); + } else if (*cp == '/') { + curr = di_devfs_path(node); + (void) snprintf(buf, sizeof (buf), "%s%s", + curr, cp); + di_devfs_path_free(curr); + curr = strdup(buf); + return (curr); + } + } + } + + return (NULL); +} + +static di_node_t +di_lookup_node_impl(di_node_t root, char *devfspath) { struct di_all *dap; di_node_t node; @@ -3785,6 +3829,46 @@ di_lookup_node(di_node_t root, char *devfspath) return (node); } +di_node_t +di_lookup_node(di_node_t root, char *devfspath) +{ + di_node_t node; + char *curr; + + node = di_lookup_node_impl(root, devfspath); + if (node != DI_NODE_NIL) { + return (node); + } + + /* node is already set to DI_NODE_NIL */ + curr = alias_to_curr(root, devfspath, &node); + if (curr == NULL) { + /* node may or may node be DI_NODE_NIL */ + return (node); + } + + node = di_lookup_node_impl(root, curr); + + free(curr); + + return (node); +} + +char * +di_alias2curr(di_node_t anynode, char *alias) +{ + di_node_t currnode = DI_NODE_NIL; + char *curr = alias_to_curr(anynode, alias, &currnode); + + if (curr == NULL && currnode != DI_NODE_NIL) { + return (di_devfs_path(currnode)); + } else if (curr == NULL) { + return (strdup(alias)); + } + + return (curr); +} + di_path_t di_lookup_path(di_node_t root, char *devfspath) { diff --git a/usr/src/lib/libdevinfo/libdevinfo.h b/usr/src/lib/libdevinfo/libdevinfo.h index 7789edd60a..8f685a1524 100644 --- a/usr/src/lib/libdevinfo/libdevinfo.h +++ b/usr/src/lib/libdevinfo/libdevinfo.h @@ -19,8 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2009 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. + * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. */ #ifndef _LIBDEVINFO_H @@ -559,6 +558,10 @@ extern char *di_dim_path_devices(di_dim_t, extern char *di_dim_path_dev(di_dim_t, char *drv_name, int instance, char *minor_name); +/* + * Alias related exported interfaces + */ +char *di_alias2curr(di_node_t anynode, char *alias); #ifdef __cplusplus } diff --git a/usr/src/lib/libdevinfo/mapfile-vers b/usr/src/lib/libdevinfo/mapfile-vers index bfad2642f2..368feea35d 100644 --- a/usr/src/lib/libdevinfo/mapfile-vers +++ b/usr/src/lib/libdevinfo/mapfile-vers @@ -19,8 +19,7 @@ # CDDL HEADER END # # -# Copyright 2010 Sun Microsystems, Inc. All rights reserved. -# Use is subject to license terms. +# Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved. # # @@ -39,6 +38,7 @@ SUNW_1.4 { global: + di_alias2curr; di_path_bus_addr; di_path_client_devfs_path; di_path_client_next_path; |