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 */