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 _RDC_BITMAP_H
27 #define _RDC_BITMAP_H
28
29 #ifdef __cplusplus
30 extern "C" {
31 #endif
32
33 #ifdef _KERNEL
34
35 extern int rdc_bitmap_mode; /* property from rdc.conf */
36
37 /*
38 * Possible values of rdc_bitmap_mode - integer flag.
39 */
40 #define RDC_BMP_AUTO 0x0 /* auto detect bitmap mode */
41 #define RDC_BMP_ALWAYS 0x1 /* always write the bitmap */
42 #define RDC_BMP_NEVER 0x2 /* never write the bitmap */
43
44 #endif /* _KERNEL */
45
46 /*
47 * Public bitmap interface
48 * The bitmaps are maintained on 32 Kbyte segments
49 */
50
51 #define LOG_SHFT 15
52 #define IND_BYTE(ind) ((ind) >> 3)
53 #define IND_BIT(ind) (1 << ((ind) & 0x7))
54
55 #define FBA_LOG_SHFT (LOG_SHFT - FBA_SHFT)
56 #define FBA_TO_LOG_NUM(x) ((x) >> FBA_LOG_SHFT)
57 #define LOG_TO_FBA_NUM(x) ((x) << FBA_LOG_SHFT)
58 #define FBA_TO_LOG_LEN(x) (FBA_TO_LOG_NUM((x)-1) + 1)
59
60 #define BMAP_LOG_BYTES(fbas) (IND_BYTE(FBA_TO_LOG_NUM((fbas)-1))+1)
61
62 #define BITS_IN_BYTE 8
63
64 /*
65 * Private macros for bitmap manipulation
66 */
67
68 #define BMAP_BIT_SET(bmap, ind) ((bmap)[IND_BYTE(ind)] |= IND_BIT(ind))
69 #define BMAP_BIT_CLR(bmap, ind) ((bmap)[IND_BYTE(ind)] &= ~IND_BIT(ind))
70 #define BMAP_BIT_ISSET(bmap, ind) \
71 ((bmap)[IND_BYTE(ind)] & IND_BIT(ind))
72
73 #define BIT_TO_FBA(b) (FBA_NUM(b) >> 3)
74
75 #define BMAP_REF_SET(krdc, ind) (((krdc)->bm_refs->bmap_ref_set)(krdc, ind))
76 #define BMAP_REF_CLR(krdc, ind) (((krdc)->bm_refs->bmap_ref_clr)(krdc, ind))
77 #define BMAP_REF_ISSET(krdc, ind) (((krdc)->bm_refs->bmap_ref_isset)(krdc, ind))
78 #define BMAP_REF_FORCE(krdc, ind, val) \
79 (((krdc)->bm_refs->bmap_ref_force)(krdc, ind, val))
80 #define BMAP_REF_MAXVAL(krdc) (((krdc)->bm_refs->bmap_ref_maxval)(krdc))
81 #define BMAP_REF_SIZE(krdc) ((krdc)->bm_refs->bmap_ref_size)
82 #define BMAP_REF_PREF_SIZE (sizeof (unsigned int))
83
84 #ifndef _KERNEL
85
86 struct bm_ref_ops {
87 void (*bmap_ref_set)(void *, int);
88 void (*bmap_ref_clr)(void *, int);
89 unsigned int (*bmap_ref_isset)(void *, int);
90 void (*bmap_ref_force)(void *, int, unsigned int);
91 unsigned int (*bmap_ref_maxval)(void *);
92 size_t bmap_ref_size;
93 };
94
95 #else
96
97 struct bm_ref_ops {
98 void (*bmap_ref_set)(rdc_k_info_t *, int);
99 void (*bmap_ref_clr)(rdc_k_info_t *, int);
100 unsigned int (*bmap_ref_isset)(rdc_k_info_t *, int);
101 void (*bmap_ref_force)(rdc_k_info_t *, int, unsigned int);
102 unsigned int (*bmap_ref_maxval)(rdc_k_info_t *);
103 size_t bmap_ref_size;
104 };
105
106
107 /* convert fba to block number */
108 #define _BNUM(x) (FBA_TO_LOG_NUM(x))
109
110 /* force reference clear during sync */
111 #define RDC_BIT_BUMP 0x0
112 #define RDC_BIT_FORCE 0x1
113 #define RDC_BIT_FLUSHER 0x2
114
115 /* check for overlap, taking account of blocking factor */
116 #define RDC_OVERLAP(p1, l1, p2, l2) \
117 ((_BNUM(((p1) + (l1) - 1)) >= _BNUM((p2))) && \
118 (_BNUM((p1)) <= _BNUM(((p2) + (l2) - 1))))
119
120 struct rdc_bitmap_ops {
121 int (*set_bitmap)(rdc_k_info_t *, const nsc_off_t, const nsc_size_t,
122 uint_t *);
123 void (*clr_bitmap)(rdc_k_info_t *, const nsc_off_t, const nsc_size_t,
124 const uint_t, const int);
125 int (*count_dirty)(rdc_k_info_t *);
126 int (*bit_isset)(rdc_k_info_t *, const int);
127 int (*fill_bitmap)(rdc_k_info_t *, const int);
128 void (*zero_bitmap)(rdc_k_info_t *);
129 int (*net_bmap)(const struct bmap6 *);
130 int (*net_b_data)(const struct net_bdata6 *);
131 void (*zero_bitref)(rdc_k_info_t *);
132 void (*set_bitmask)(const nsc_off_t, const nsc_size_t, uint_t *);
133 void (*check_bit)(rdc_k_info_t *, nsc_off_t, nsc_size_t);
134 };
135
136 extern struct rdc_bitmap_ops *rdc_bitmap_ops;
137
138 #define RDC_SET_BITMAP(krdc, pos, len, bitmaskp) \
139 (*rdc_bitmap_ops->set_bitmap)(krdc, pos, len, bitmaskp)
140 #define RDC_CLR_BITMAP(krdc, pos, len, bitmask, flag) \
141 (*rdc_bitmap_ops->clr_bitmap)(krdc, pos, len, bitmask, flag)
142 #define RDC_COUNT_BITMAP(krdc) \
143 (*rdc_bitmap_ops->count_dirty)(krdc)
144 #define RDC_BIT_ISSET(krdc, bit) \
145 (*rdc_bitmap_ops->bit_isset)(krdc, bit)
146 #define RDC_FILL_BITMAP(krdc, write) \
147 (*rdc_bitmap_ops->fill_bitmap)(krdc, write)
148 #define RDC_ZERO_BITMAP(krdc) \
149 (*rdc_bitmap_ops->zero_bitmap)(krdc)
150 #define RDC_SEND_BITMAP(argp) \
151 (*rdc_bitmap_ops->net_bmap)(argp)
152 #define RDC_OR_BITMAP(argp) \
153 (*rdc_bitmap_ops->net_b_data)(argp)
154 #define RDC_ZERO_BITREF(krdc) \
155 (*rdc_bitmap_ops->zero_bitref)(krdc)
156 #define RDC_SET_BITMASK(off, len, maskp) \
157 (*rdc_bitmap_ops->set_bitmask)(off, len, maskp)
158 #define RDC_CHECK_BIT(krdc, pos, len) \
159 (*rdc_bitmap_ops->check_bit)(krdc, pos, len)
160
161 /*
162 * Functions
163 */
164
165 extern void rdc_bitmap_init(void);
166 extern int rdc_move_bitmap(rdc_k_info_t *, char *);
167 extern int rdc_enable_bitmap(rdc_k_info_t *, int);
168 extern int rdc_resume_bitmap(rdc_k_info_t *);
169 extern int rdc_reset_bitmap(rdc_k_info_t *);
170 extern void rdc_free_bitmap(rdc_k_info_t *, int);
171 extern void rdc_close_bitmap(rdc_k_info_t *);
172 extern int rdc_write_bitmap(rdc_k_info_t *);
173 extern int rdc_write_bitmap_fill(rdc_k_info_t *);
174 extern void rdc_set_bitmap_many(rdc_k_info_t *, nsc_off_t, nsc_size_t);
175 extern void rdc_merge_bitmaps(rdc_k_info_t *, rdc_k_info_t *);
176
177 extern int rdc_read_state(rdc_k_info_t *, int *, int *);
178 extern int rdc_clear_state(rdc_k_info_t *);
179 extern void rdc_write_state(rdc_u_info_t *);
180 extern int rdc_ns_io(nsc_fd_t *, int, nsc_off_t, uchar_t *, nsc_size_t);
181 extern int rdc_read_refcount(rdc_k_info_t *);
182 extern int rdc_write_refcount(rdc_k_info_t *);
183 extern size_t rdc_refcntsize(rdc_k_info_t *);
184
185 #endif /* _KERNEL */
186
187 #ifdef __cplusplus
188 }
189 #endif
190
191 #endif /* _RDC_BITMAP_H */