diff options
Diffstat (limited to 'usr/src')
-rw-r--r-- | usr/src/cmd/fm/fmdump/common/fmdump.c | 128 | ||||
-rw-r--r-- | usr/src/cmd/fm/modules/common/cpumem-retire/cma_main.c | 6 | ||||
-rw-r--r-- | usr/src/lib/fm/topo/libtopo/common/libtopo.h | 3 | ||||
-rw-r--r-- | usr/src/lib/fm/topo/libtopo/common/mapfile-vers | 2 | ||||
-rw-r--r-- | usr/src/lib/fm/topo/libtopo/common/topo_mod.c | 26 | ||||
-rw-r--r-- | usr/src/lib/fm/topo/libtopo/common/topo_snap.c | 50 | ||||
-rw-r--r-- | usr/src/lib/fm/topo/libtopo/common/topo_tree.c | 18 | ||||
-rw-r--r-- | usr/src/lib/fm/topo/modules/i86pc/chip/chip.c | 19 | ||||
-rw-r--r-- | usr/src/uts/common/os/ndifm.c | 3 |
9 files changed, 196 insertions, 59 deletions
diff --git a/usr/src/cmd/fm/fmdump/common/fmdump.c b/usr/src/cmd/fm/fmdump/common/fmdump.c index 8839858e52..ed680493c0 100644 --- a/usr/src/cmd/fm/fmdump/common/fmdump.c +++ b/usr/src/cmd/fm/fmdump/common/fmdump.c @@ -19,12 +19,10 @@ * CDDL HEADER END */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ -#pragma ident "%Z%%M% %I% %E% SMI" - #include <alloca.h> #include <unistd.h> #include <limits.h> @@ -36,6 +34,7 @@ #include <time.h> #include <ctype.h> #include <regex.h> +#include <dirent.h> #include <fmdump.h> @@ -445,6 +444,92 @@ log_filter_silent(fmd_log_t *lp, const fmd_log_record_t *rp, void *arg) FM_SUSPECT_MESSAGE, &msg) != 0 || msg != 0); } +struct loglink { + char *path; + long suffix; + struct loglink *next; +}; + +static void +addlink(struct loglink **llp, char *dirname, char *logname, long suffix) +{ + struct loglink *newp; + size_t len; + char *str; + + newp = malloc(sizeof (struct loglink)); + len = strlen(dirname) + strlen(logname) + 2; + str = malloc(len); + if (newp == NULL || str == NULL) { + (void) fprintf(stderr, "%s: failed to allocate memory: %s\n", + g_pname, strerror(errno)); + exit(FMDUMP_EXIT_FATAL); + } + + (void) snprintf(str, len, "%s/%s", dirname, logname); + newp->path = str; + newp->suffix = suffix; + + while (*llp != NULL && suffix < (*llp)->suffix) + llp = &(*llp)->next; + + newp->next = *llp; + *llp = newp; +} + +/* + * Find and return all the rotated logs. + */ +static struct loglink * +get_rotated_logs(char *logpath) +{ + char dirname[PATH_MAX], *logname, *endptr; + DIR *dirp; + struct dirent *dp; + long len, suffix; + struct loglink *head = NULL; + + (void) strlcpy(dirname, logpath, sizeof (dirname)); + logname = strrchr(dirname, '/'); + *logname++ = '\0'; + len = strlen(logname); + + if ((dirp = opendir(dirname)) == NULL) { + (void) fprintf(stderr, "%s: failed to opendir `%s': %s\n", + g_pname, dirname, strerror(errno)); + return (NULL); + } + + while ((dp = readdir(dirp)) != NULL) { + /* + * Search the log directory for logs named "<logname>.0", + * "<logname>.1", etc and add to the link in the + * reverse numeric order. + */ + if (strlen(dp->d_name) < len + 2 || + strncmp(dp->d_name, logname, len) != 0 || + dp->d_name[len] != '.') + continue; + + /* + * "*.0-" file normally should not be seen. It may + * exist when user manually run 'fmadm rotate'. + * In such case, we put it at the end of the list so + * it'll be dumped after all the rotated logs, before + * the current one. + */ + if (strcmp(dp->d_name + len + 1, "0-") == 0) + addlink(&head, dirname, dp->d_name, -1); + else if ((suffix = strtol(dp->d_name + len + 1, + &endptr, 10)) >= 0 && *endptr == '\0') + addlink(&head, dirname, dp->d_name, suffix); + } + + (void) closedir(dirp); + + return (head); +} + int main(int argc, char *argv[]) { @@ -469,6 +554,8 @@ main(int argc, char *argv[]) fmd_log_t *lp; int c, err; off64_t off = 0; + ulong_t recs; + struct loglink *rotated_logs = NULL, *llp; g_pname = argv[0]; @@ -553,6 +640,13 @@ main(int argc, char *argv[]) if (*ifile == '\0') { (void) snprintf(ifile, sizeof (ifile), "%s/var/fm/fmd/%slog", g_root ? g_root : "", opt_e && !opt_u ? "err" : "flt"); + /* + * logadm may rotate the logs. When no input file is specified, + * we try to dump all the rotated logs as well in the right + * order. + */ + if (!opt_H && off == 0) + rotated_logs = get_rotated_logs(ifile); } else if (g_root != NULL) { (void) fprintf(stderr, "%s: -R option is not appropriate " "when file operand is present\n", g_pname); @@ -640,14 +734,40 @@ main(int argc, char *argv[]) farg = &lyr; } + for (llp = rotated_logs; llp != NULL; llp = llp->next) { + fmd_log_t *rlp; + + if ((rlp = fmd_log_open(FMD_LOG_VERSION, llp->path, &err)) + == NULL) { + (void) fprintf(stderr, "%s: failed to open %s: %s\n", + g_pname, llp->path, fmd_log_errmsg(NULL, err)); + g_errs++; + continue; + } + + recs = 0; + if (fmd_log_xiter(rlp, iflags, filtc, filtv, + func, error, farg, &recs) != 0) { + (void) fprintf(stderr, + "%s: failed to dump %s: %s\n", g_pname, llp->path, + fmd_log_errmsg(rlp, fmd_log_errno(rlp))); + g_errs++; + } + g_recs += recs; + + fmd_log_close(rlp); + } + do { + recs = 0; if (fmd_log_xiter(lp, iflags, filtc, filtv, - func, error, farg, &g_recs) != 0) { + func, error, farg, &recs) != 0) { (void) fprintf(stderr, "%s: failed to dump %s: %s\n", g_pname, ifile, fmd_log_errmsg(lp, fmd_log_errno(lp))); g_errs++; } + g_recs += recs; if (opt_f) (void) sleep(1); diff --git a/usr/src/cmd/fm/modules/common/cpumem-retire/cma_main.c b/usr/src/cmd/fm/modules/common/cpumem-retire/cma_main.c index c30a9f90d0..3c6c172e58 100644 --- a/usr/src/cmd/fm/modules/common/cpumem-retire/cma_main.c +++ b/usr/src/cmd/fm/modules/common/cpumem-retire/cma_main.c @@ -20,7 +20,7 @@ */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -411,9 +411,7 @@ cma_recv_list(fmd_hdl_t *hdl, nvlist_t *nvl, const char *class) uint_t keepopen; int err = 0; nvlist_t *asru = NULL; -#ifndef i386 uint32_t index; -#endif err |= nvlist_lookup_string(nvl, FM_SUSPECT_UUID, &uuid); err |= nvlist_lookup_nvlist_array(nvl, FM_SUSPECT_FAULT_LIST, @@ -456,7 +454,6 @@ cma_recv_list(fmd_hdl_t *hdl, nvlist_t *nvl, const char *class) } } -#ifndef i386 /* * Do not close the case if we are handling cache faults. */ @@ -469,7 +466,6 @@ cma_recv_list(fmd_hdl_t *hdl, nvlist_t *nvl, const char *class) } } } -#endif if (!keepopen && strcmp(class, FM_LIST_REPAIRED_CLASS) == 0) fmd_case_uuresolved(hdl, uuid); diff --git a/usr/src/lib/fm/topo/libtopo/common/libtopo.h b/usr/src/lib/fm/topo/libtopo/common/libtopo.h index 035510dc31..5ff7839b13 100644 --- a/usr/src/lib/fm/topo/libtopo/common/libtopo.h +++ b/usr/src/lib/fm/topo/libtopo/common/libtopo.h @@ -29,6 +29,7 @@ #include <sys/nvpair.h> #include <stdio.h> +#include <libdevinfo.h> #ifdef __cplusplus extern "C" { @@ -70,6 +71,8 @@ extern topo_walk_t *topo_walk_init(topo_hdl_t *, const char *, topo_walk_cb_t, void *, int *); extern int topo_walk_step(topo_walk_t *, int); extern void topo_walk_fini(topo_walk_t *); +extern di_node_t topo_hdl_devinfo(topo_hdl_t *); +extern di_prom_handle_t topo_hdl_prominfo(topo_hdl_t *); /* * Walk status returned from walker diff --git a/usr/src/lib/fm/topo/libtopo/common/mapfile-vers b/usr/src/lib/fm/topo/libtopo/common/mapfile-vers index c633a2646f..91f96bc860 100644 --- a/usr/src/lib/fm/topo/libtopo/common/mapfile-vers +++ b/usr/src/lib/fm/topo/libtopo/common/mapfile-vers @@ -50,11 +50,13 @@ SUNWprivate { topo_fmri_unretire; topo_fmri_unusable; topo_hdl_alloc; + topo_hdl_devinfo; topo_hdl_errmsg; topo_hdl_errno; topo_hdl_free; topo_hdl_nvalloc; topo_hdl_nvdup; + topo_hdl_prominfo; topo_hdl_strdup; topo_hdl_strfree; topo_hdl_zalloc; diff --git a/usr/src/lib/fm/topo/libtopo/common/topo_mod.c b/usr/src/lib/fm/topo/libtopo/common/topo_mod.c index 5876f6e0f8..61331c0b50 100644 --- a/usr/src/lib/fm/topo/libtopo/common/topo_mod.c +++ b/usr/src/lib/fm/topo/libtopo/common/topo_mod.c @@ -19,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -615,17 +615,6 @@ topo_mod_setdebug(topo_mod_t *mod) mod->tm_debug = 1; } -di_node_t -topo_mod_devinfo(topo_mod_t *mod) -{ - topo_hdl_t *thp = mod->tm_hdl; - - if (thp->th_di == DI_NODE_NIL) - thp->th_di = di_init("/", DINFOCPYALL); - - return (thp->th_di); -} - ipmi_handle_t * topo_mod_ipmi_hold(topo_mod_t *mod) { @@ -655,15 +644,16 @@ topo_mod_ipmi_rele(topo_mod_t *mod) (void) pthread_mutex_unlock(&thp->th_ipmi_lock); } +di_node_t +topo_mod_devinfo(topo_mod_t *mod) +{ + return (topo_hdl_devinfo(mod->tm_hdl)); +} + di_prom_handle_t topo_mod_prominfo(topo_mod_t *mod) { - topo_hdl_t *thp = mod->tm_hdl; - - if (thp->th_pi == DI_PROM_HANDLE_NIL) - thp->th_pi = di_prom_init(); - - return (thp->th_pi); + return (topo_hdl_prominfo(mod->tm_hdl)); } void diff --git a/usr/src/lib/fm/topo/libtopo/common/topo_snap.c b/usr/src/lib/fm/topo/libtopo/common/topo_snap.c index db44b12262..66db84a5a4 100644 --- a/usr/src/lib/fm/topo/libtopo/common/topo_snap.c +++ b/usr/src/lib/fm/topo/libtopo/common/topo_snap.c @@ -285,12 +285,31 @@ topo_snap_create(topo_hdl_t *thp, int *errp) uuid_generate(uuid); uuid_unparse(uuid, thp->th_uuid); + if ((ustr = topo_hdl_strdup(thp, thp->th_uuid)) == NULL) { + *errp = ETOPO_NOMEM; + topo_hdl_unlock(thp); + return (NULL); + } + + thp->th_di = di_init("/", DI_CACHE_SNAPSHOT_FLAGS | DINFOCLEANUP); + thp->th_pi = di_prom_init(); if (topo_tree_enum_all(thp) < 0) { topo_dprintf(thp, TOPO_DBG_ERR, "enumeration failure: %s\n", topo_hdl_errmsg(thp)); if (topo_hdl_errno(thp) == ETOPO_ENUM_FATAL) { *errp = thp->th_errno; + + if (thp->th_di != DI_NODE_NIL) { + di_fini(thp->th_di); + thp->th_di = DI_NODE_NIL; + } + if (thp->th_pi != DI_PROM_HANDLE_NIL) { + di_prom_fini(thp->th_pi); + thp->th_pi = DI_PROM_HANDLE_NIL; + } + + topo_hdl_strfree(thp, ustr); topo_hdl_unlock(thp); return (NULL); } @@ -304,12 +323,6 @@ topo_snap_create(topo_hdl_t *thp, int *errp) ipmi_errmsg(thp->th_ipmi)); } - if ((ustr = topo_hdl_strdup(thp, thp->th_uuid)) == NULL) - *errp = ETOPO_NOMEM; - - thp->th_di = DI_NODE_NIL; - thp->th_pi = DI_PROM_HANDLE_NIL; - topo_hdl_unlock(thp); return (ustr); @@ -437,6 +450,19 @@ topo_snap_destroy(topo_hdl_t *thp) } + /* + * Clean-up our cached devinfo and prom tree handles. + */ + if (thp->th_di != DI_NODE_NIL) { + di_fini(thp->th_di); + thp->th_di = DI_NODE_NIL; + } + if (thp->th_pi != DI_PROM_HANDLE_NIL) { + di_prom_fini(thp->th_pi); + thp->th_pi = DI_PROM_HANDLE_NIL; + } + + if (thp->th_uuid != NULL) { topo_hdl_free(thp, thp->th_uuid, TOPO_UUID_SIZE); thp->th_uuid = NULL; @@ -711,3 +737,15 @@ topo_walk_bottomup(topo_walk_t *wp, int flag) return (status); } + +di_node_t +topo_hdl_devinfo(topo_hdl_t *thp) +{ + return (thp == NULL ? DI_NODE_NIL : thp->th_di); +} + +di_prom_handle_t +topo_hdl_prominfo(topo_hdl_t *thp) +{ + return (thp == NULL ? DI_PROM_HANDLE_NIL : thp->th_pi); +} diff --git a/usr/src/lib/fm/topo/libtopo/common/topo_tree.c b/usr/src/lib/fm/topo/libtopo/common/topo_tree.c index 515fb3551c..5ecb564ebf 100644 --- a/usr/src/lib/fm/topo/libtopo/common/topo_tree.c +++ b/usr/src/lib/fm/topo/libtopo/common/topo_tree.c @@ -19,12 +19,10 @@ * CDDL HEADER END */ /* - * Copyright 2007 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ -#pragma ident "%Z%%M% %I% %E% SMI" - /* * Topology Trees * @@ -195,20 +193,6 @@ topo_tree_enum(topo_hdl_t *thp, ttree_t *tp) } } - /* - * It would be nice to leave the devinfo and prominfo trees - * active but the interfaces consume copious amounts of memory - * while searching for property information - */ - if (thp->th_di != DI_NODE_NIL) { - di_fini(thp->th_di); - thp->th_di = DI_NODE_NIL; - } - if (thp->th_pi != DI_PROM_HANDLE_NIL) { - di_prom_fini(thp->th_pi); - thp->th_pi = DI_PROM_HANDLE_NIL; - } - if (rv != 0) return (topo_hdl_seterrno(thp, ETOPO_ENUM_NOMAP)); diff --git a/usr/src/lib/fm/topo/modules/i86pc/chip/chip.c b/usr/src/lib/fm/topo/modules/i86pc/chip/chip.c index 1244f5d603..347c70e9c0 100644 --- a/usr/src/lib/fm/topo/modules/i86pc/chip/chip.c +++ b/usr/src/lib/fm/topo/modules/i86pc/chip/chip.c @@ -20,7 +20,7 @@ */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -309,7 +309,8 @@ create_chip(topo_mod_t *mod, tnode_t *pnode, topo_instance_t min, nvlist_t *fmri = NULL; int err, nerr = 0; int32_t fms[3]; - const char *vendor = NULL; + const char *vendor; + boolean_t create_mc = B_FALSE; if ((err = nvlist_lookup_int32(cpu, FM_PHYSCPU_INFO_CHIP_ID, &chipid)) != 0) { @@ -351,6 +352,8 @@ create_chip(topo_mod_t *mod, tnode_t *pnode, topo_instance_t min, if (topo_node_range_create(mod, chip, CORE_NODE_NAME, 0, 255) != 0) return (-1); + + create_mc = B_TRUE; } err = create_core(mod, chip, cpu, auth); @@ -359,11 +362,13 @@ create_chip(topo_mod_t *mod, tnode_t *pnode, topo_instance_t min, * Create memory-controller node under a chip for architectures * that may have on-chip memory-controller(s). */ - if (vendor != NULL && strcmp(vendor, "AuthenticAMD") == 0) - amd_mc_create(mod, chip, MCT_NODE_NAME, auth, - fms[0], fms[1], fms[2], &nerr); - else if (!mc_offchip) - onchip_mc_create(mod, chip, MCT_NODE_NAME, auth); + if (create_mc) { + if (strcmp(vendor, "AuthenticAMD") == 0) + amd_mc_create(mod, chip, MCT_NODE_NAME, auth, + fms[0], fms[1], fms[2], &nerr); + else if (!mc_offchip) + onchip_mc_create(mod, chip, MCT_NODE_NAME, auth); + } return (err == 0 && nerr == 0 ? 0 : -1); } diff --git a/usr/src/uts/common/os/ndifm.c b/usr/src/uts/common/os/ndifm.c index b00dae43a0..44e004ae50 100644 --- a/usr/src/uts/common/os/ndifm.c +++ b/usr/src/uts/common/os/ndifm.c @@ -19,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -429,7 +429,6 @@ ndi_fmc_entry_error(dev_info_t *dip, int flag, ddi_fm_error_t *derr, ddi_fm_dma_err_get(dp, derr, DDI_FME_VERSION); derr->fme_dma_handle = dp; } - break; } mutex_exit(&fcp->fc_lock); } |