Home | History | Annotate | Download | only in common
      1 /*
      2  * CDDL HEADER START
      3  *
      4  * The contents of this file are subject to the terms of the
      5  * Common Development and Distribution License (the "License").
      6  * You may not use this file except in compliance with the License.
      7  *
      8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
      9  * or http://www.opensolaris.org/os/licensing.
     10  * See the License for the specific language governing permissions
     11  * and limitations under the License.
     12  *
     13  * When distributing Covered Code, include this CDDL HEADER in each
     14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     15  * If applicable, add the following below this CDDL HEADER, with the
     16  * fields enclosed by brackets "[]" replaced with your own identifying
     17  * information: Portions Copyright [yyyy] [name of copyright owner]
     18  *
     19  * CDDL HEADER END
     20  */
     21 /*
     22  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
     23  * Use is subject to license terms.
     24  */
     25 
     26 #pragma dictionary "DISK"
     27 
     28 #define	P	disk
     29 
     30 fru P;
     31 asru P;
     32 
     33 /*
     34  * disk-as-detector: The disk-as-detector DE provides the mapping between
     35  * ereports generated by a kernel disk driver sd(7D) and resulting faults.
     36  */
     37 
     38 /*
     39  * disk-as-detector: fault events.
     40  */
     41 event fault.io.scsi.cmd.disk.dev.rqs.derr@P;
     42 event fault.io.scsi.cmd.disk.dev.rqs.merr@P;
     43 /*
     44  * The uderr fault will be defined at some future time.
     45  * event fault.io.scsi.cmd.disk.dev.uderr@P;
     46  */
     47 
     48 /*
     49  * disk-as-detector: upset events.
     50  * NOTE: For now we define an upset to implement discard.
     51  */
     52 event upset.io.scsi.cmd.disk.dev.rqs.derr@P;
     53 event upset.io.scsi.cmd.disk.dev.rqs.merr@P;
     54 event upset.io.scsi.cmd.disk.dev.uderr@P;
     55 event upset.io.scsi.cmd.disk.dev.serr@P;
     56 event upset.io.scsi.cmd.disk.tran@P;
     57 event upset.io.scsi.cmd.disk.recovered@P;
     58 
     59 /*
     60  * disk-as-detector: ereports from the kernel.
     61  *
     62  * We don't know the topology for all scsi disks, but the kernel will always
     63  * generate ereport telemetry assuming that we do. We define these ereports
     64  * with 'discard_if_config_unknown=1', which permits ereports against things
     65  * with unknown topology to be silently discarded.  The ereport data is logged
     66  * in either case, and can be viewed via 'fmdump -eV'.
     67  */
     68 event ereport.io.scsi.cmd.disk.dev.rqs.derr@P, discard_if_config_unknown=1;
     69 event ereport.io.scsi.cmd.disk.dev.rqs.merr@P, discard_if_config_unknown=1;
     70 event ereport.io.scsi.cmd.disk.dev.serr@P, discard_if_config_unknown=1;
     71 event ereport.io.scsi.cmd.disk.dev.uderr@P, discard_if_config_unknown=1;
     72 event ereport.io.scsi.cmd.disk.recovered@P, discard_if_config_unknown=1;
     73 event ereport.io.scsi.cmd.disk.tran@P, discard_if_config_unknown=1;
     74 
     75 /*
     76  * For some ereports we let the 'driver-assessment', communicated as part of
     77  * the ereport payload, determine fault .vs. upset via propagation constraints.
     78  */
     79 #define DRIVER_ASSESSMENT_FATAL		\
     80 	    (payloadprop_contains("driver-assessment", "fatal"))
     81 #define DRIVER_ASSESSMENT_NONFATAL	(!DRIVER_ASSESSMENT_FATAL)
     82 
     83 /*
     84  * disk-as-detector: propagations from faults(based on
     85  * DRIVER_ASSESSMENT_FATAL).
     86  * We need to set additional fault payloads to indicate fault details.
     87  * The payload we may need are listed as following:
     88  * fault.io.scsi.cmd.disk.dev.rqs.derr
     89  *     op_code, key, asc, ascq
     90  * fault.io.scsi.cmd.disk.dev.rqs.merr
     91  *     op_code, key, asc, ascq, lba
     92  */
     93 prop fault.io.scsi.cmd.disk.dev.rqs.derr@P->
     94     ereport.io.scsi.cmd.disk.dev.rqs.derr@P{ DRIVER_ASSESSMENT_FATAL &&
     95     setpayloadprop("key", payloadprop("key")) &&
     96     setpayloadprop("asc", payloadprop("asc")) &&
     97     setpayloadprop("ascq", payloadprop("ascq"))};
     98 
     99 prop fault.io.scsi.cmd.disk.dev.rqs.merr@P->
    100     ereport.io.scsi.cmd.disk.dev.rqs.merr@P{ DRIVER_ASSESSMENT_FATAL &&
    101     setpayloadprop("key", payloadprop("key")) &&
    102     setpayloadprop("asc", payloadprop("asc")) &&
    103     setpayloadprop("ascq", payloadprop("ascq")) &&
    104     setpayloadprop("lba", payloadprop("lba"))};
    105 
    106 /*
    107  * The uderr fault will be propagated at some future time.
    108  * prop fault.io.scsi.cmd.disk.dev.uderr@P->
    109  *     ereport.io.scsi.cmd.disk.dev.uderr@P{ DRIVER_ASSESSMENT_FATAL };
    110  */
    111 
    112 /*
    113  * disk-as-detector: propagations from upsets(based on
    114  * DRIVER_ASSESSMENT_NONFATAL).
    115  */
    116 prop upset.io.scsi.cmd.disk.dev.rqs.derr@P->
    117     ereport.io.scsi.cmd.disk.dev.rqs.derr@P{ DRIVER_ASSESSMENT_NONFATAL };
    118 
    119 prop upset.io.scsi.cmd.disk.dev.rqs.merr@P->
    120     ereport.io.scsi.cmd.disk.dev.rqs.merr@P{ DRIVER_ASSESSMENT_NONFATAL };
    121 
    122 /*
    123  * disk-as-detector: propagations from upsets(independent of
    124  * driver-assessment)
    125  */
    126 
    127 prop upset.io.scsi.cmd.disk.dev.serr@P->
    128     ereport.io.scsi.cmd.disk.dev.serr@P;
    129 
    130 prop upset.io.scsi.cmd.disk.dev.uderr@P->
    131     ereport.io.scsi.cmd.disk.dev.uderr@P;
    132 
    133 prop upset.io.scsi.cmd.disk.recovered@P->
    134     ereport.io.scsi.cmd.disk.recovered@P;
    135 
    136 prop upset.io.scsi.cmd.disk.tran@P->
    137     ereport.io.scsi.cmd.disk.tran@P;
    138 
    139 /*
    140  * --------------------------------------
    141  * The remainder of this file contains rules associated with the operation of
    142  * cmd/fm/modules/common/disk-monitor/disk_monitor.c code.
    143  *
    144  * The disk DE provides a very simple 1-to-1 mapping between SCSI disk events
    145  * generated by the disk-transport fmd module, and the resulting faults.
    146  */
    147 
    148 /*
    149  * Fault events.
    150  */
    151 event fault.io.disk.over-temperature@P,
    152     FITrate=10, FRU=P, ASRU=P;
    153 event fault.io.disk.predictive-failure@P, FITrate=10,
    154     FITrate=10, FRU=P, ASRU=P;
    155 event fault.io.disk.self-test-failure@P, FITrate=10,
    156     FITrate=10, FRU=P, ASRU=P;
    157 
    158 /*
    159  * ereports.
    160  */
    161 event ereport.io.scsi.disk.over-temperature@P;
    162 event ereport.io.scsi.disk.predictive-failure@P;
    163 event ereport.io.scsi.disk.self-test-failure@P;
    164 
    165 /*
    166  * Propagations.
    167  */
    168 prop fault.io.disk.over-temperature@P ->
    169     ereport.io.scsi.disk.over-temperature@P;
    170 
    171 prop fault.io.disk.self-test-failure@P ->
    172     ereport.io.scsi.disk.self-test-failure@P;
    173 
    174 prop fault.io.disk.predictive-failure@P ->
    175     ereport.io.scsi.disk.predictive-failure@P;
    176