diff options
author | Stephen Brooks <Stephen.Brooks@oracle.COM> | 2010-07-09 08:39:07 -0600 |
---|---|---|
committer | Stephen Brooks <Stephen.Brooks@oracle.COM> | 2010-07-09 08:39:07 -0600 |
commit | 7a0878494fd11b7a861d0b3e2034534c10b5fb46 (patch) | |
tree | 63220abb46fac897bf24140c14e02c93260ec583 /usr | |
parent | 913d9b1bce75e60ac6dc64e2b6357b65812330bf (diff) | |
download | illumos-gate-7a0878494fd11b7a861d0b3e2034534c10b5fb46.tar.gz |
6966763 ses log transport spews errors with RW2 attached
Diffstat (limited to 'usr')
-rw-r--r-- | usr/src/cmd/fm/modules/common/ses-log-transport/ses_log_transport.c | 208 |
1 files changed, 112 insertions, 96 deletions
diff --git a/usr/src/cmd/fm/modules/common/ses-log-transport/ses_log_transport.c b/usr/src/cmd/fm/modules/common/ses-log-transport/ses_log_transport.c index 7fda2f33dd..40bfdfe223 100644 --- a/usr/src/cmd/fm/modules/common/ses-log-transport/ses_log_transport.c +++ b/usr/src/cmd/fm/modules/common/ses-log-transport/ses_log_transport.c @@ -53,12 +53,12 @@ * be overridden by entries in a ses_log_transport.conf file. */ static const fmd_prop_t fmd_props[] = { - { "interval", FMD_TYPE_TIME, "60s"}, - { "severity", FMD_TYPE_UINT32, "3"}, - { "path", FMD_TYPE_STRING, "/var/fm/fmd/ses_logs/"}, - { "logcount", FMD_TYPE_UINT32, "5"}, + { "interval", FMD_TYPE_TIME, "60s"}, + { "severity", FMD_TYPE_UINT32, "3"}, + { "path", FMD_TYPE_STRING, "/var/fm/fmd/ses_logs/"}, + { "logcount", FMD_TYPE_UINT32, "5"}, { "maxlogsize", FMD_TYPE_UINT32, "1000000"}, - { NULL, 0, NULL} + { NULL, 0, NULL} }; /* Maintains statistics on dropped ereports. */ @@ -90,24 +90,24 @@ typedef struct ses_log_monitor /* Contains expander log data retrieved from a topology node */ typedef struct expander { - char slt_label[MAXPATHLEN]; /* The expander name */ - char slt_pid[MAXPATHLEN]; /* The system product id */ - char slt_key[MAXPATHLEN]; /* The expander key (sas address) */ + char slt_label[MAXNAMELEN]; /* The expander name */ + char slt_pid[MAXNAMELEN]; /* The system product id */ + char slt_key[MAXNAMELEN]; /* The expander key (sas address) */ char slt_path[MAXPATHLEN]; /* The ses path to the expander */ nvlist_t *fmri; /* The fmri for this target */ } expander_t; -#define DATA_FIELD "data" /* Label for the expander details */ -#define DEFAULT_DATA "0" /* Default value for expander details */ -#define MIN_LOG_SIZE 100000 /* The minimum allowed log file size. */ -#define MIN_LOG_COUNT 1 /* The min number of old log files to keep */ -#define EXAMINE_FMRI_VALUE 0 /* Operation value for extractin fmri val */ -#define INVERT_FMRI_INSTANCE 1 /* Op value for inverting an FMRI value */ -#define FATAL_ERROR "fatal" /* ereport class leaf val for fatal errors */ -#define NON_FATAL_ERROR "non-fatal" /* val for non fatal errors */ -#define INVALID_OPERATION 0x01 /* Invalid access_fmri operation */ -#define NULL_LOG_DATA 0x02 /* Library returned NULL log reference */ -#define DATE_STRING_SIZE 16 /* Size of date string prefix. */ +#define DATA_FIELD "data" /* Label for the expander details */ +#define DEFAULT_DATA "0" /* Default value for expander details */ +#define MIN_LOG_SIZE 100000 /* The minimum allowed log file size. */ +#define MIN_LOG_COUNT 1 /* The min number of old log files to keep */ +#define EXAMINE_FMRI_VALUE 0 /* Operation value for extractin fmri val */ +#define INVERT_FMRI_INSTANCE 1 /* Op value for inverting an FMRI value */ +#define FATAL_ERROR "fatal" /* ereport class val for fatal errors */ +#define NON_FATAL_ERROR "non-fatal" /* val for non fatal errors */ +#define INVALID_OPERATION 0x01 /* Invalid access_fmri operation */ +#define NULL_LOG_DATA 0x02 /* Library returned NULL log reference */ +#define DATE_STRING_SIZE 16 /* Size of date string prefix. */ /* Prototype needed for use in declaring and populating tables */ static int invert_fmri(ses_log_monitor_t *, nvlist_t *); @@ -132,19 +132,19 @@ typedef struct platforms { } platforms_t; /* This is the genesis list of codes and functions. */ -code_operation_t genesis_codes[] = { +static code_operation_t genesis_codes[] = { { 684002, invert_fmri } /* Alternate controller is down */ }; /* This is the list of all platforms and their associated code op pairs. */ -platform_t platform_list[] = { +static platform_t platform_list[] = { { "SUN-GENESIS", sizeof (genesis_codes) / sizeof (code_operation_t), genesis_codes } }; /* This structure holds a reference to the platform list. */ -platforms_t platforms = { +static platforms_t platforms = { sizeof (platform_list) / sizeof (platform_t), platform_list }; @@ -163,6 +163,8 @@ slt_post_ereport(fmd_hdl_t *hdl, fmd_xprt_t *xprt, const char *ereport_class, (void) snprintf(fullclass, sizeof (fullclass), "%s.io.sas.log.%s", FM_EREPORT_CLASS, ereport_class); + fmd_hdl_debug(hdl, "Generating an ereport: %s", fullclass); + if (nvlist_alloc(&nvl, NV_UNIQUE_NAME, 0) == 0) { e |= nvlist_add_string(nvl, FM_CLASS, fullclass); @@ -400,6 +402,8 @@ access_fmri(ses_log_monitor_t *slmp, nvlist_t *fmri, char *target, * expander: An expander_t struct containing path, pid etc info from the node. * slmp: A pointer to the transport data structure which contains the * configurable file parameters. + * byte_count: The number of bytes that will be added to the target file for + * this expander. */ static int create_filename(char *fileName, expander_t *expander, ses_log_monitor_t *slmp, @@ -419,11 +423,8 @@ create_filename(char *fileName, expander_t *expander, ses_log_monitor_t *slmp, ses_node = strrchr(fileName, '/'); - if (ses_node) { - - if (strlen(ses_node) > 1) { - (void) strlcat(fileName, "/", MAXPATHLEN); - } + if (ses_node && (strlen(ses_node) > 1)) { + (void) strlcat(fileName, "/", MAXPATHLEN); } ses_node = strrchr(expander->slt_path, '/'); @@ -480,14 +481,17 @@ error_type(int severity) char *rval; switch (severity) { - case SES_LOG_LEVEL_FATAL : rval = FATAL_ERROR; - break; + case SES_LOG_LEVEL_FATAL : + rval = FATAL_ERROR; + break; - case SES_LOG_LEVEL_ERROR : rval = NON_FATAL_ERROR; - break; + case SES_LOG_LEVEL_ERROR : + rval = NON_FATAL_ERROR; + break; - default : rval = NULL; - break; + default : + rval = NULL; + break; } @@ -620,6 +624,26 @@ check_code(ses_log_monitor_t *slmp, nvlist_t *fmri, char *pid, int code) } /* + * Searches the platform lists for for a match on the supplied product id. + * Returns zero if supported, non zero otherwise. + */ +static int +platform_supported(char *pid) +{ + int supported = 1; + int i; + + for (i = 0; i < platforms.pcount; i++) { + if (strcmp(platforms.plist[i].pid, pid) == 0) { + supported = 0; + break; + } + } + + return (supported); +} + +/* * Inverts the controller instance in the specified FMRI */ static int @@ -682,7 +706,10 @@ handle_log_entry(ses_log_monitor_t *slmp, nvpair_t *entry, if (nvlist_lookup_string(entry_data, ENTRY_CODE, &code) == 0) { - /* Log errors in function */ + /* + * Check this code for any actions specific + * to this platform. + */ (void) check_code(slmp, expander->fmri, expander->slt_pid, atoi(code)); } @@ -694,10 +721,7 @@ handle_log_entry(ses_log_monitor_t *slmp, nvpair_t *entry, return (rval); } - /* - * Create the ENA for this transport so that it can be - * used for any ereports that we need to generate. - */ + /* Create the ENA for this ereport */ ena = fmd_event_ena_create(slmp->slt_hdl); slt_post_ereport(slmp->slt_hdl, slmp->slt_xprt, @@ -921,8 +945,7 @@ slt_process_ses_log(topo_hdl_t *thp, tnode_t *node, void *arg) expander_t *expander; struct ses_log_call_struct lib_param; - int err; - int status = 0; + int err = 0; char *label = NULL; char *target_path = NULL; char *product_id = NULL; @@ -933,62 +956,60 @@ slt_process_ses_log(topo_hdl_t *thp, tnode_t *node, void *arg) return (TOPO_WALK_NEXT); } + if (topo_prop_get_string(node, "authority", "product-id", + &product_id, &err) != 0) { + fmd_hdl_debug(slmp->slt_hdl, + "Error collecting product_id %d", err); + return (TOPO_WALK_NEXT); + } + + /* The current system type is not supported. Skip processing the node */ + if (platform_supported(product_id) != 0) { + topo_hdl_strfree(thp, product_id); + return (TOPO_WALK_NEXT); + } + /* Allocate space for the holder structure */ expander = (expander_t *)fmd_hdl_zalloc(slmp->slt_hdl, sizeof (expander_t), FMD_SLEEP); + (void) snprintf(expander->slt_pid, MAXNAMELEN, "%s", product_id); + topo_hdl_strfree(thp, product_id); - if ((status |= topo_prop_get_string(node, "protocol", "label", &label, - &err)) == 0) { - fmd_hdl_debug(slmp->slt_hdl, "Label: %s", label); - (void) snprintf(expander->slt_label, MAXPATHLEN, "%s", label); - - } else { - fmd_hdl_error(slmp->slt_hdl, "Error collecting label\n"); + if (topo_prop_get_string(node, "protocol", "label", &label, &err) + != 0) { + fmd_hdl_debug(slmp->slt_hdl, "Error collecting label %d", err); + free_expander(slmp, expander); + return (TOPO_WALK_NEXT); } + (void) snprintf(expander->slt_label, MAXNAMELEN, "%s", label); topo_hdl_strfree(thp, label); - if ((status |= topo_prop_get_string(node, "ses", "ses-devfs-path", - &target_path, &err)) == 0) { - (void) snprintf(expander->slt_path, MAXPATHLEN, "%s", - target_path); - - } else { - fmd_hdl_error(slmp->slt_hdl, - "Error collecting ses-devfs-path\n"); + if (topo_prop_get_string(node, TOPO_PGROUP_SES, + TOPO_PROP_SES_DEV_PATH, &target_path, &err) != 0) { + fmd_hdl_debug(slmp->slt_hdl, + "Error collecting ses-devfs-path %d", err); + free_expander(slmp, expander); + return (TOPO_WALK_NEXT); } + (void) snprintf(expander->slt_path, MAXPATHLEN, "%s", target_path); topo_hdl_strfree(thp, target_path); - - if ((status |= topo_prop_get_string(node, "authority", "product-id", - &product_id, &err)) == 0) { - - (void) snprintf(expander->slt_pid, MAXPATHLEN, "%s", - product_id); - - } else { - fmd_hdl_error(slmp->slt_hdl, "Error collecting product_id\n"); + if (topo_prop_get_string(node, TOPO_PGROUP_STORAGE, + TOPO_PROP_SAS_ADDR, &sas_address, &err) != 0) { + fmd_hdl_debug(slmp->slt_hdl, + "Error collecting sas_address %d", err); + free_expander(slmp, expander); + return (TOPO_WALK_NEXT); } - topo_hdl_strfree(thp, product_id); - - - if ((status |= topo_prop_get_string(node, "storage", "sas-address", - &sas_address, &err)) == 0) { - - if (strlen(sas_address) != 16) { - fmd_hdl_error(slmp->slt_hdl, - "sas-address length is not 16: (%s)", sas_address); - status |= 1; - - } else { - - (void) snprintf(expander->slt_key, MAXPATHLEN, "%s", - sas_address); - } - - } else { - fmd_hdl_error(slmp->slt_hdl, "Error collecting sas_address\n"); + if (strlen(sas_address) != 16) { + fmd_hdl_error(slmp->slt_hdl, + "sas-address length is not 16: (%s)", sas_address); + free_expander(slmp, expander); + topo_hdl_strfree(thp, sas_address); + return (TOPO_WALK_NEXT); } + (void) snprintf(expander->slt_key, MAXNAMELEN, "%s", sas_address); topo_hdl_strfree(thp, sas_address); /* Obtain the fmri for this node and save a reference to it. */ @@ -1002,23 +1023,18 @@ slt_process_ses_log(topo_hdl_t *thp, tnode_t *node, void *arg) expander->fmri = fmri; } - if (status == 0) { - if ((err = get_log(slmp, expander, &lib_param)) != 0) { - - fmd_hdl_error(slmp->slt_hdl, - "Error retrieving logs: %d\n", err); + if ((err = get_log(slmp, expander, &lib_param)) != 0) { - free_expander(slmp, expander); - return (TOPO_WALK_NEXT); - } + fmd_hdl_error(slmp->slt_hdl, "Error retrieving logs %d\n", err); + free_expander(slmp, expander); + return (TOPO_WALK_NEXT); + } - if ((err = process_log(slmp, expander, &lib_param)) != 0) { - fmd_hdl_error(slmp->slt_hdl, - "Error processing logs: %d\n", err); - } + if ((err = process_log(slmp, expander, &lib_param)) != 0) { + fmd_hdl_error(slmp->slt_hdl, "Error processing logs %d\n", err); } - /* Free the expander structure whether this is a success or failure. */ + /* Free the expander structure before exiting. */ free_expander(slmp, expander); return (TOPO_WALK_NEXT); |