disk_transport.c revision 184cd04c26b064536977dfbb913a1240eaf6f708
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China/*
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China * CDDL HEADER START
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China *
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * The contents of this file are subject to the terms of the
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Common Development and Distribution License (the "License").
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * You may not use this file except in compliance with the License.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China *
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * or http://www.opensolaris.org/os/licensing.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * See the License for the specific language governing permissions
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * and limitations under the License.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China *
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * When distributing Covered Code, include this CDDL HEADER in each
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * If applicable, add the following below this CDDL HEADER, with the
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * fields enclosed by brackets "[]" replaced with your own identifying
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * information: Portions Copyright [yyyy] [name of copyright owner]
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China *
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * CDDL HEADER END
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China/*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Use is subject to license terms.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#pragma ident "%Z%%M% %I% %E% SMI"
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China/*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Disk error transport module
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China *
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * This transport module is responsible for translating between disk errors
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * and FMA ereports. It is a read-only transport module, and checks for the
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * following failures:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China *
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * - overtemp
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * - predictive failure
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * - self-test failure
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China *
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * These failures are detected via the TOPO_METH_DISK_STATUS method, which
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * leverages libdiskstatus to do the actual analysis. This transport module is
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * in charge of the following tasks:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China *
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * - discovering available devices
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * - periodically checking devices
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * - managing device addition/removal
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#include <ctype.h>
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#include <fm/fmd_api.h>
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#include <fm/libdiskstatus.h>
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#include <fm/libtopo.h>
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#include <fm/topo_hc.h>
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#include <fm/topo_mod.h>
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#include <limits.h>
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#include <string.h>
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#include <sys/fm/io/scsi.h>
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#include <sys/fm/protocol.h>
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic struct dt_stat {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China fmd_stat_t dropped;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China} dt_stats = {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China { "dropped", FMD_TYPE_UINT64, "number of dropped ereports" }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China};
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinatypedef struct disk_monitor {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China fmd_hdl_t *dm_hdl;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China fmd_xprt_t *dm_xprt;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China id_t dm_timer;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China hrtime_t dm_interval;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China char *dm_sim_search;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China char *dm_sim_file;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China boolean_t dm_timer_istopo;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China} disk_monitor_t;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic void
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinadt_post_ereport(fmd_hdl_t *hdl, fmd_xprt_t *xprt, const char *protocol,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China const char *faultname, uint64_t ena, nvlist_t *detector, nvlist_t *payload)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China nvlist_t *nvl;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China int e = 0;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China char fullclass[PATH_MAX];
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (void) snprintf(fullclass, sizeof (fullclass), "%s.io.%s.disk.%s",
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China FM_EREPORT_CLASS, protocol, faultname);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (nvlist_alloc(&nvl, NV_UNIQUE_NAME, 0) == 0) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China e |= nvlist_add_string(nvl, FM_CLASS, fullclass);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China e |= nvlist_add_uint8(nvl, FM_VERSION, FM_EREPORT_VERSION);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China e |= nvlist_add_uint64(nvl, FM_EREPORT_ENA, ena);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China e |= nvlist_add_nvlist(nvl, FM_EREPORT_DETECTOR, detector);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China e |= nvlist_merge(nvl, payload, 0);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (e == 0) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China fmd_xprt_post(hdl, xprt, nvl, 0);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China } else {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China nvlist_free(nvl);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China dt_stats.dropped.fmds_value.ui64++;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China } else {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China dt_stats.dropped.fmds_value.ui64++;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China/*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Check a single topo node for failure. This simply invokes the disk status
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * method, and generates any ereports as necessary.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic int
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinadt_analyze_disk(topo_hdl_t *thp, tnode_t *node, void *arg)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China nvlist_t *result;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China nvlist_t *fmri, *faults;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China char *protocol;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China int err;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China disk_monitor_t *dmp = arg;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China uint64_t ena;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China nvpair_t *elem;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China boolean_t fault;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China nvlist_t *details;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China char *fmristr;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China nvlist_t *in = NULL;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (topo_node_resource(node, &fmri, &err) != 0) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China fmd_hdl_error(dmp->dm_hdl, "failed to get fmri: %s\n",
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China topo_strerror(err));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (TOPO_WALK_ERR);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (topo_hdl_nvalloc(thp, &in, NV_UNIQUE_NAME) != 0) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China nvlist_free(fmri);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (TOPO_WALK_ERR);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (dmp->dm_sim_search) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China fmristr = NULL;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (topo_fmri_nvl2str(thp, fmri, &fmristr, &err) == 0 &&
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China strstr(fmristr, dmp->dm_sim_search) != 0)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (void) nvlist_add_string(in, "path", dmp->dm_sim_file);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China topo_hdl_strfree(thp, fmristr);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Try to invoke the method. If this fails (most likely because the
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * method is not supported), then ignore this node.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (topo_method_invoke(node, TOPO_METH_DISK_STATUS,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China TOPO_METH_DISK_STATUS_VERSION, in, &result, &err) != 0) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China nvlist_free(fmri);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China nvlist_free(in);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (TOPO_WALK_NEXT);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China nvlist_free(in);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ena = fmd_event_ena_create(dmp->dm_hdl);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Add any faults.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (nvlist_lookup_nvlist(result, "faults", &faults) == 0 &&
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China nvlist_lookup_string(result, "protocol", &protocol) == 0) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China elem = NULL;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China while ((elem = nvlist_next_nvpair(faults, elem)) != NULL) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (nvpair_type(elem) != DATA_TYPE_BOOLEAN_VALUE)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China continue;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (void) nvpair_value_boolean_value(elem, &fault);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (!fault ||
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China nvlist_lookup_nvlist(result, nvpair_name(elem),
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China &details) != 0)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China continue;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China dt_post_ereport(dmp->dm_hdl, dmp->dm_xprt, protocol,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China nvpair_name(elem), ena, fmri, details);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China nvlist_free(result);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China nvlist_free(fmri);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (TOPO_WALK_NEXT);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China/*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Periodic timeout. Iterates over all hc:// topo nodes, calling
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * dt_analyze_disk() for each one.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China/*ARGSUSED*/
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic void
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinadt_timeout(fmd_hdl_t *hdl, id_t id, void *data)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China topo_hdl_t *thp;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China topo_walk_t *twp;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China int err;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China disk_monitor_t *dmp = fmd_hdl_getspecific(hdl);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China dmp->dm_hdl = hdl;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China thp = fmd_hdl_topo_hold(hdl, TOPO_VERSION);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if ((twp = topo_walk_init(thp, FM_FMRI_SCHEME_HC, dt_analyze_disk,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China dmp, &err)) == NULL) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China fmd_hdl_topo_rele(hdl, thp);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China fmd_hdl_error(hdl, "failed to get topology: %s\n",
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China topo_strerror(err));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (topo_walk_step(twp, TOPO_WALK_CHILD) == TOPO_WALK_ERR) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China topo_walk_fini(twp);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China fmd_hdl_topo_rele(hdl, thp);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China fmd_hdl_error(hdl, "failed to walk topology\n");
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China topo_walk_fini(twp);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China fmd_hdl_topo_rele(hdl, thp);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China dmp->dm_timer = fmd_timer_install(hdl, NULL, NULL, dmp->dm_interval);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China dmp->dm_timer_istopo = B_FALSE;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China/*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Called when the topology may have changed. We want to examine all disks in
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * case a new one has been inserted, but we don't want to overwhelm the system
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * in the event of a flurry of topology changes, as most likely only a small
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * number of disks are changing. To avoid this, we set the timer for a small
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * but non-trivial interval (by default 1 minute), and ignore intervening
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * changes during this period. This still gives us a reasonable response time
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * to newly inserted devices without overwhelming the system if lots of hotplug
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * activity is going on.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China/*ARGSUSED*/
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic void
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinadt_topo_change(fmd_hdl_t *hdl, topo_hdl_t *thp)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China disk_monitor_t *dmp = fmd_hdl_getspecific(hdl);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (dmp->dm_timer_istopo)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China fmd_timer_remove(hdl, dmp->dm_timer);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China dmp->dm_timer = fmd_timer_install(hdl, NULL, NULL,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China fmd_prop_get_int64(hdl, "min-interval"));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China dmp->dm_timer_istopo = B_TRUE;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic const fmd_prop_t fmd_props[] = {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China { "interval", FMD_TYPE_TIME, "1h" },
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China { "min-interval", FMD_TYPE_TIME, "1min" },
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China { "simulate", FMD_TYPE_STRING, "" },
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China { NULL, 0, NULL }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China};
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic const fmd_hdl_ops_t fmd_ops = {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China NULL, /* fmdo_recv */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China dt_timeout, /* fmdo_timeout */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China NULL, /* fmdo_close */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China NULL, /* fmdo_stats */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China NULL, /* fmdo_gc */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China NULL, /* fmdo_send */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China dt_topo_change, /* fmdo_topo_change */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China};
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic const fmd_hdl_info_t fmd_info = {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "Disk Transport Agent", "1.0", &fmd_ops, fmd_props
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China};
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinavoid
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China_fmd_init(fmd_hdl_t *hdl)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China disk_monitor_t *dmp;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China char *simulate;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (fmd_hdl_register(hdl, FMD_API_VERSION, &fmd_info) != 0)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (void) fmd_stat_create(hdl, FMD_STAT_NOALLOC,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sizeof (dt_stats) / sizeof (fmd_stat_t),
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (fmd_stat_t *)&dt_stats);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China dmp = fmd_hdl_zalloc(hdl, sizeof (disk_monitor_t), FMD_SLEEP);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China fmd_hdl_setspecific(hdl, dmp);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China dmp->dm_xprt = fmd_xprt_open(hdl, FMD_XPRT_RDONLY, NULL, NULL);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China dmp->dm_interval = fmd_prop_get_int64(hdl, "interval");
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Determine if we have the simulate property set. This property allows
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * the developer to substitute a faulty device based off all or part of
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * an FMRI string. For example, one could do:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China *
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * setprop simulate "bay=4/disk=4 /path/to/sim.so"
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China *
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * When the transport module encounters an FMRI containing the given
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * string, then it will open the simulator file instead of the
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * corresponding device. This can be any file, but is intended to be a
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * libdiskstatus simulator shared object, capable of faking up SCSI
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * responses.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China *
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * The property consists of two strings, an FMRI fragment and an
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * absolute path, separated by whitespace.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China simulate = fmd_prop_get_string(hdl, "simulate");
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (simulate[0] != '\0') {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China const char *sep;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China size_t len;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China for (sep = simulate; *sep != '\0'; sep++) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (isspace(*sep))
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China break;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (*sep != '\0') {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China len = sep - simulate;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China dmp->dm_sim_search = fmd_hdl_alloc(hdl,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China len + 1, FMD_SLEEP);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (void) memcpy(dmp->dm_sim_search, simulate, len);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China dmp->dm_sim_search[len] = '\0';
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China for (; *sep != '\0'; sep++) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (!isspace(*sep))
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China break;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (*sep != '\0') {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China dmp->dm_sim_file = fmd_hdl_strdup(hdl, sep, FMD_SLEEP);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China } else if (dmp->dm_sim_search) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China fmd_hdl_strfree(hdl, dmp->dm_sim_search);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China dmp->dm_sim_search = NULL;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China fmd_prop_free_string(hdl, simulate);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Call our initial timer routine. This will do an initial check of all
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * the disks, and then start the periodic timeout.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China dmp->dm_timer = fmd_timer_install(hdl, NULL, NULL, 0);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinavoid
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China_fmd_fini(fmd_hdl_t *hdl)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China disk_monitor_t *dmp;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China dmp = fmd_hdl_getspecific(hdl);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (dmp) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China fmd_xprt_close(hdl, dmp->dm_xprt);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China fmd_hdl_strfree(hdl, dmp->dm_sim_search);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China fmd_hdl_strfree(hdl, dmp->dm_sim_file);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China fmd_hdl_free(hdl, dmp, sizeof (*dmp));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China