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 #ifndef _SD_FT_H
  27 #define _SD_FT_H
  28 
  29 #ifdef  __cplusplus
  30 extern "C" {
  31 #endif
  32 
  33 #include <sys/ncall/ncall.h>
  34 
  35 typedef struct _sd_ft_info {
  36         char    fi_crashed;             /* mirror cache state */
  37         char    fi_host_state;          /* mirror node state */
  38         kmutex_t        fi_lock;
  39         kcondvar_t      fi_rem_sv;
  40         volatile int    fi_numio;
  41         kmutex_t fi_sleep;
  42 
  43 } _sd_ft_info_t;
  44 
  45 
  46 #define _SD_MIRROR_CONFIGD      (_sd_ft_data.fi_host_state ==\
  47                                 _SD_HOST_CONFIGURED)
  48 #define _SD_MIRROR_DECONFIGD    (_sd_ft_data.fi_host_state == \
  49                                 _SD_HOST_DECONFIGURED)
  50 #define _SD_MIRROR_NOCACHE      (_sd_ft_data.fi_host_state == \
  51                                 _SD_HOST_NOCACHE)
  52 
  53 #define _SD_HOST_NONE           0x00    /* mirror node dead or state unknown */
  54 #define _SD_HOST_CONFIGURED     0x01    /* mirror cache configured */
  55 #define _SD_HOST_DECONFIGURED   0x02    /* mirror cache deconfigured */
  56 #define _SD_HOST_NOCACHE        0x03    /* mirror cache deconfigured and */
  57                                         /* waiting for node down or re-enable */
  58 
  59 /*
  60  * mirror node has paniced with cache enabled,
  61  * or mirror cache has been deconfigured.
  62  */
  63 #define _sd_is_mirror_crashed() ((!_INFSD_NODE_UP(_SD_MIRROR_HOST) &&\
  64                                 _SD_MIRROR_CONFIGD) || _SD_MIRROR_DECONFIGD)
  65 
  66 /*
  67  * mirror node has shutdown having previously
  68  * deconfigured its cache.
  69  */
  70 #define _sd_is_mirror_node_down()       \
  71                                 (!_INFSD_NODE_UP(_SD_MIRROR_HOST) &&\
  72                                 _SD_MIRROR_NOCACHE)
  73 
  74 #define _sd_is_mirror_down()    (_sd_ft_data.fi_crashed)
  75 #define _sd_mirror_cache_down() (_sd_ft_data.fi_crashed = 1,\
  76                                 _sd_ft_data.fi_host_state = _SD_HOST_NOCACHE)
  77 #define _sd_mirror_down()       (_sd_ft_data.fi_crashed = 1,\
  78                                 _sd_ft_data.fi_host_state = _SD_HOST_NONE)
  79 #define _sd_mirror_up()         (_sd_ft_data.fi_crashed = 0)
  80 #ifdef _KERNEL
  81 
  82 extern _sd_ft_info_t _sd_ft_data;
  83 extern int _sd_node_recovery;
  84 
  85 extern void _sdbc_ft_unload(void);
  86 extern int _sdbc_ft_load(void);
  87 extern int _sdbc_ft_configure(void);
  88 extern void _sdbc_ft_deconfigure(void);
  89 extern int _sd_recovery_wait(void);
  90 extern int _sd_recovery_wblk_wait(int cd);
  91 extern void _sd_mirror_iodone(void);
  92 extern int _sd_repin_cd(int);
  93 extern void _sd_remote_disable(int);
  94 extern void r_sd_ifs_cache_enable(ncall_t *, int *);
  95 extern void r_sd_ifs_cache_disable(ncall_t *, int *);
  96 extern void _sd_hash_invalidate_cd(int);
  97 extern void r_cd_discard(ncall_t *, int *);
  98 extern int _sd_uncommit(_sd_buf_handle_t *, nsc_off_t, nsc_size_t, int);
  99 extern int _sd_uncommit_refresh(_sd_cctl_t *, int);
 100 extern void r_sd_uncommit_refresh(ncall_t *, int *);
 101 extern int _sd_wait_for_flush(int);
 102 extern int _sdbc_warm_start(void);
 103 extern void _sdbc_set_warm_start(void);
 104 
 105 #endif /* _KERNEL */
 106 
 107 #ifdef  __cplusplus
 108 }
 109 #endif
 110 
 111 #endif /* _SD_FT_H */