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 _SV_IMPL_H 27 #define _SV_IMPL_H 28 29 #ifdef __cplusplus 30 extern "C" { 31 #endif 32 33 /* 34 * Storage Volume Character and Block Driver (SV) 35 * Private header file. 36 */ 37 38 #if defined(_KERNEL) 39 40 /* 41 * Locking. 42 * Define SV_SLEEP_LOCK to get full sleep lock semantics (ie. mutex not 43 * held across calls to sdctl functions. 44 * 45 * #define SV_SLEEP_LOCK 46 */ 47 48 49 /* 50 * Misc defines, enums. 51 */ 52 53 enum { SV_DISABLE = 0, SV_PENDING, SV_ENABLE }; 54 55 56 /* 57 * Guard device clients 58 */ 59 60 typedef int64_t sv_gid_t; /* bitmask */ 61 62 typedef struct sv_gclient_s { 63 struct sv_gclient_s *sg_next; /* linked list */ 64 char *sg_name; /* name of client */ 65 sv_gid_t sg_id; /* id (bitmask) of client */ 66 } sv_gclient_t; 67 68 69 /* 70 * Hashing. 71 * 72 * SV_MAJOR_HASH_CNT & SV_MINOR_HASH_CNT should be prime. 73 * 74 * In a given system, there is likely to be one or two major devices in use. 75 * 76 * Examples are: 77 * SD - Direct Attached Storage (SCSI-2/3) 78 * SSD - SAN Direct Attached Storage FC SCSI-2/3 79 * SVM - Solaris Volume Manager 80 * VxVM - Veritas Volume Manager 81 * Global - Sun Cluster Global Devices 82 * 83 * For a typical system, there may be a 10s to 100s of minor devices configured 84 * per major device, but most are likely to be configured under a single major 85 * number. SV_MINOR_HASH_CNT has been chosen to ensure that the hash chains are 86 * not too long (one or two devices), for the worst case. 87 */ 88 89 #define SV_MAJOR_HASH_CNT 3 /* # hash buckets per system */ 90 #define SV_MAJOR_HASH(min) ((min) % SV_MAJOR_HASH_CNT) 91 92 #define SV_MINOR_HASH_CNT 37 /* # hash buckets per major */ 93 #define SV_MINOR_HASH(min) ((min) % SV_MINOR_HASH_CNT) 94 95 /* 96 * Per major device structure. 97 * 98 */ 99 100 typedef struct sv_maj_s { 101 struct dev_ops *sm_dev_ops; 102 int (*sm_strategy)(); 103 int (*sm_awrite)(); 104 int (*sm_write)(); 105 int (*sm_ioctl)(); 106 int (*sm_close)(); 107 int (*sm_aread)(); 108 int (*sm_read)(); 109 int (*sm_open)(); 110 major_t sm_major; /* Major device # */ 111 int sm_flag; 112 volatile int sm_inuse; 113 volatile int sm_seq; 114 struct sv_dev_s *sm_hash[SV_MINOR_HASH_CNT]; /* Minor Hash Table */ 115 struct sv_maj_s *sm_next; /* Major Hash Chain */ 116 } sv_maj_t; 117 118 /* 119 * Per configured sv structure. 120 */ 121 122 typedef struct sv_dev_s { 123 struct sv_dev_s *sv_hash; /* Minor hash chain */ 124 krwlock_t sv_lock; /* mutual exclusion */ 125 kmutex_t sv_olock; /* mutual exclusion for otyp flags */ 126 dev_t sv_dev; /* underlying dev_t */ 127 nsc_fd_t *sv_fd; /* underlying fd */ 128 nsc_size_t sv_maxfbas; /* maxfbas accepted by I/O module */ 129 nsc_size_t sv_nblocks; /* size of device */ 130 int sv_state; /* state */ 131 int sv_flag; /* internal flags */ 132 sv_gid_t sv_gclients; /* bitmask of all guard clients */ 133 sv_gid_t sv_gkernel; /* bitmask of kernel guard clients */ 134 int sv_openlcnt; /* # of OTYP_LYR opens whilst failed */ 135 clock_t sv_timestamp; /* time of successful {en,dis}able */ 136 ldi_handle_t sv_lh; /* layered open handle */ 137 void *sv_pending; /* the thread setting SV_PENDING */ 138 } sv_dev_t; 139 140 /* 141 * private functions exported from nskern to sv. 142 */ 143 extern int nskern_partition(dev_t, int *); 144 extern int nskernd_isdaemon(void); 145 146 #endif /* _KERNEL */ 147 148 #ifdef __cplusplus 149 } 150 #endif 151 152 #endif /* _SV_IMPL_H */