1*6316Seschrock /* 2*6316Seschrock * CDDL HEADER START 3*6316Seschrock * 4*6316Seschrock * The contents of this file are subject to the terms of the 5*6316Seschrock * Common Development and Distribution License (the "License"). 6*6316Seschrock * You may not use this file except in compliance with the License. 7*6316Seschrock * 8*6316Seschrock * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*6316Seschrock * or http://www.opensolaris.org/os/licensing. 10*6316Seschrock * See the License for the specific language governing permissions 11*6316Seschrock * and limitations under the License. 12*6316Seschrock * 13*6316Seschrock * When distributing Covered Code, include this CDDL HEADER in each 14*6316Seschrock * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*6316Seschrock * If applicable, add the following below this CDDL HEADER, with the 16*6316Seschrock * fields enclosed by brackets "[]" replaced with your own identifying 17*6316Seschrock * information: Portions Copyright [yyyy] [name of copyright owner] 18*6316Seschrock * 19*6316Seschrock * CDDL HEADER END 20*6316Seschrock */ 21*6316Seschrock 22*6316Seschrock /* 23*6316Seschrock * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 24*6316Seschrock * Use is subject to license terms. 25*6316Seschrock */ 26*6316Seschrock 27*6316Seschrock #ifndef _SES_IMPL_H 28*6316Seschrock #define _SES_IMPL_H 29*6316Seschrock 30*6316Seschrock #pragma ident "%Z%%M% %I% %E% SMI" 31*6316Seschrock 32*6316Seschrock #ifdef __cplusplus 33*6316Seschrock extern "C" { 34*6316Seschrock #endif 35*6316Seschrock 36*6316Seschrock #include <alloca.h> 37*6316Seschrock #include <errno.h> 38*6316Seschrock #include <assert.h> 39*6316Seschrock #include <dirent.h> 40*6316Seschrock #include <dlfcn.h> 41*6316Seschrock #include <limits.h> 42*6316Seschrock #include <pthread.h> 43*6316Seschrock #include <stdarg.h> 44*6316Seschrock #include <stddef.h> 45*6316Seschrock #include <stdio.h> 46*6316Seschrock #include <stdlib.h> 47*6316Seschrock #include <string.h> 48*6316Seschrock #include <strings.h> 49*6316Seschrock #include <libnvpair.h> 50*6316Seschrock #include <unistd.h> 51*6316Seschrock #include <sys/mman.h> 52*6316Seschrock #include <sys/types.h> 53*6316Seschrock #include <sys/sysmacros.h> 54*6316Seschrock #include <sys/systeminfo.h> 55*6316Seschrock 56*6316Seschrock #include <scsi/libscsi.h> 57*6316Seschrock #include <scsi/libses_plugin.h> 58*6316Seschrock #include <scsi/plugins/ses/framework/ses2_impl.h> 59*6316Seschrock 60*6316Seschrock #define LIBSES_ERRMSGLEN 512 61*6316Seschrock 62*6316Seschrock #define LIBSES_DEFAULT_PLUGINDIR "/usr/lib/scsi/plugins/ses" 63*6316Seschrock #define LIBSES_PLUGIN_FRAMEWORK "framework" 64*6316Seschrock #define LIBSES_PLUGIN_VENDOR "vendor" 65*6316Seschrock 66*6316Seschrock #define LIBSES_PLUGIN_EXT ".so" 67*6316Seschrock 68*6316Seschrock struct ses_plugin { 69*6316Seschrock struct ses_plugin *sp_next; /* next plugin in list */ 70*6316Seschrock struct ses_plugin *sp_prev; /* previous plugin in list */ 71*6316Seschrock uint64_t sp_priority; /* plugin priority */ 72*6316Seschrock struct ses_target *sp_target; /* corresponding target */ 73*6316Seschrock void *sp_object; /* shared object */ 74*6316Seschrock void *sp_data; /* module-specific data */ 75*6316Seschrock boolean_t sp_initialized; /* successfully initialized */ 76*6316Seschrock ses_pagedesc_t *sp_pages; /* pages */ 77*6316Seschrock int (*sp_init)(ses_plugin_t *); /* plugin init */ 78*6316Seschrock void (*sp_fini)(ses_plugin_t *); /* plugin fini */ 79*6316Seschrock int (*sp_node_parse)(ses_plugin_t *, ses_node_t *); /* parse node */ 80*6316Seschrock int (*sp_node_ctl)(ses_plugin_t *, ses_node_t *, const char *, 81*6316Seschrock nvlist_t *); /* node control */ 82*6316Seschrock }; 83*6316Seschrock 84*6316Seschrock struct ses_target { 85*6316Seschrock libscsi_hdl_t *st_scsi_hdl; 86*6316Seschrock libscsi_target_t *st_target; 87*6316Seschrock struct ses_plugin *st_plugin_first; 88*6316Seschrock struct ses_plugin *st_plugin_last; 89*6316Seschrock struct ses_snap *st_snapshots; 90*6316Seschrock boolean_t st_closescsi; 91*6316Seschrock boolean_t st_truncate; 92*6316Seschrock pthread_mutex_t st_lock; 93*6316Seschrock }; 94*6316Seschrock 95*6316Seschrock /* 96*6316Seschrock * Maximum number of snapshot retries triggered by generation count changes 97*6316Seschrock */ 98*6316Seschrock #define LIBSES_MAX_GC_RETRIES 10 99*6316Seschrock 100*6316Seschrock /* 101*6316Seschrock * Maximum number of Enclosure Busy retries 102*6316Seschrock */ 103*6316Seschrock #define LIBSES_MAX_BUSY_RETRIES 3 104*6316Seschrock 105*6316Seschrock typedef struct ses_snap_page { 106*6316Seschrock ses2_diag_page_t ssp_num; 107*6316Seschrock boolean_t ssp_control; 108*6316Seschrock boolean_t ssp_initialized; 109*6316Seschrock size_t ssp_alloc; 110*6316Seschrock size_t ssp_len; 111*6316Seschrock void *ssp_page; 112*6316Seschrock char *ssp_mmap_base; 113*6316Seschrock size_t ssp_mmap_len; 114*6316Seschrock struct ses_snap_page *ssp_next; 115*6316Seschrock struct ses_snap_page *ssp_unique; 116*6316Seschrock } ses_snap_page_t; 117*6316Seschrock 118*6316Seschrock struct ses_snap { 119*6316Seschrock struct ses_target *ss_target; 120*6316Seschrock uint32_t ss_generation; 121*6316Seschrock hrtime_t ss_time; 122*6316Seschrock struct ses_node *ss_root; 123*6316Seschrock size_t ss_n_elem; 124*6316Seschrock ses_snap_page_t *ss_pages; 125*6316Seschrock size_t ss_n_nodes; 126*6316Seschrock struct ses_node **ss_nodes; 127*6316Seschrock struct ses_snap *ss_next; 128*6316Seschrock struct ses_snap *ss_prev; 129*6316Seschrock uint32_t ss_refcnt; 130*6316Seschrock }; 131*6316Seschrock 132*6316Seschrock struct ses_node { 133*6316Seschrock ses_node_type_t sn_type; 134*6316Seschrock uint64_t sn_rootidx; /* Relative index for enclosure/aggregate */ 135*6316Seschrock size_t sn_id; /* Unique global ID */ 136*6316Seschrock uint64_t sn_enc_num; 137*6316Seschrock struct ses_snap *sn_snapshot; 138*6316Seschrock struct ses_node *sn_parent; 139*6316Seschrock struct ses_node *sn_next_sibling; 140*6316Seschrock struct ses_node *sn_prev_sibling; 141*6316Seschrock struct ses_node *sn_first_child; 142*6316Seschrock struct ses_node *sn_last_child; 143*6316Seschrock nvlist_t *sn_props; 144*6316Seschrock }; 145*6316Seschrock 146*6316Seschrock extern int ses_fill_snap(ses_snap_t *); 147*6316Seschrock extern void ses_node_teardown(ses_node_t *); 148*6316Seschrock extern ses_snap_page_t *ses_snap_find_page(ses_snap_t *, ses2_diag_page_t, 149*6316Seschrock boolean_t); 150*6316Seschrock extern ses_snap_page_t *ses_snap_ctl_page(ses_snap_t *, 151*6316Seschrock ses2_diag_page_t, size_t, boolean_t); 152*6316Seschrock extern int ses_snap_do_ctl(ses_snap_t *); 153*6316Seschrock 154*6316Seschrock extern int ses_libscsi_error(libscsi_hdl_t *, const char *, ...); 155*6316Seschrock extern int ses_scsi_error(libscsi_action_t *, const char *, ...); 156*6316Seschrock 157*6316Seschrock extern int ses_plugin_load(ses_target_t *); 158*6316Seschrock extern void ses_plugin_unload(ses_target_t *); 159*6316Seschrock 160*6316Seschrock extern ses_pagedesc_t *ses_get_pagedesc(ses_target_t *, int, ses_pagetype_t); 161*6316Seschrock extern int ses_fill_node(ses_node_t *); 162*6316Seschrock 163*6316Seschrock extern int enc_parse_ed(ses2_ed_impl_t *, nvlist_t *); 164*6316Seschrock extern int enc_parse_td(ses2_td_hdr_impl_t *, const char *, nvlist_t *); 165*6316Seschrock 166*6316Seschrock #ifdef __cplusplus 167*6316Seschrock } 168*6316Seschrock #endif 169*6316Seschrock 170*6316Seschrock #endif /* _SES_IMPL_H */ 171