xref: /onnv-gate/usr/src/cmd/ndmpd/include/bitmap.h (revision 7917:5c4442486198)
1*7917SReza.Sabdar@Sun.COM /*
2*7917SReza.Sabdar@Sun.COM  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
3*7917SReza.Sabdar@Sun.COM  * Use is subject to license terms.
4*7917SReza.Sabdar@Sun.COM  */
5*7917SReza.Sabdar@Sun.COM 
6*7917SReza.Sabdar@Sun.COM /*
7*7917SReza.Sabdar@Sun.COM  * BSD 3 Clause License
8*7917SReza.Sabdar@Sun.COM  *
9*7917SReza.Sabdar@Sun.COM  * Copyright (c) 2007, The Storage Networking Industry Association.
10*7917SReza.Sabdar@Sun.COM  *
11*7917SReza.Sabdar@Sun.COM  * Redistribution and use in source and binary forms, with or without
12*7917SReza.Sabdar@Sun.COM  * modification, are permitted provided that the following conditions
13*7917SReza.Sabdar@Sun.COM  * are met:
14*7917SReza.Sabdar@Sun.COM  * 	- Redistributions of source code must retain the above copyright
15*7917SReza.Sabdar@Sun.COM  *	  notice, this list of conditions and the following disclaimer.
16*7917SReza.Sabdar@Sun.COM  *
17*7917SReza.Sabdar@Sun.COM  * 	- Redistributions in binary form must reproduce the above copyright
18*7917SReza.Sabdar@Sun.COM  *	  notice, this list of conditions and the following disclaimer in
19*7917SReza.Sabdar@Sun.COM  *	  the documentation and/or other materials provided with the
20*7917SReza.Sabdar@Sun.COM  *	  distribution.
21*7917SReza.Sabdar@Sun.COM  *
22*7917SReza.Sabdar@Sun.COM  *	- Neither the name of The Storage Networking Industry Association (SNIA)
23*7917SReza.Sabdar@Sun.COM  *	  nor the names of its contributors may be used to endorse or promote
24*7917SReza.Sabdar@Sun.COM  *	  products derived from this software without specific prior written
25*7917SReza.Sabdar@Sun.COM  *	  permission.
26*7917SReza.Sabdar@Sun.COM  *
27*7917SReza.Sabdar@Sun.COM  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
28*7917SReza.Sabdar@Sun.COM  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
29*7917SReza.Sabdar@Sun.COM  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
30*7917SReza.Sabdar@Sun.COM  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
31*7917SReza.Sabdar@Sun.COM  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
32*7917SReza.Sabdar@Sun.COM  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
33*7917SReza.Sabdar@Sun.COM  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
34*7917SReza.Sabdar@Sun.COM  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
35*7917SReza.Sabdar@Sun.COM  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
36*7917SReza.Sabdar@Sun.COM  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
37*7917SReza.Sabdar@Sun.COM  * POSSIBILITY OF SUCH DAMAGE.
38*7917SReza.Sabdar@Sun.COM  */
39*7917SReza.Sabdar@Sun.COM #ifndef _BITMAP_H_
40*7917SReza.Sabdar@Sun.COM #define	_BITMAP_H_
41*7917SReza.Sabdar@Sun.COM 
42*7917SReza.Sabdar@Sun.COM #ifdef __cplusplus
43*7917SReza.Sabdar@Sun.COM extern "C" {
44*7917SReza.Sabdar@Sun.COM #endif
45*7917SReza.Sabdar@Sun.COM 
46*7917SReza.Sabdar@Sun.COM #include <sys/errno.h>
47*7917SReza.Sabdar@Sun.COM 
48*7917SReza.Sabdar@Sun.COM /*
49*7917SReza.Sabdar@Sun.COM  * This interface is designed to provide an abatract data type
50*7917SReza.Sabdar@Sun.COM  * for manipulating in-core and on-disk bitmaps.
51*7917SReza.Sabdar@Sun.COM  *
52*7917SReza.Sabdar@Sun.COM  * When a bitmap is allocated, a descriptor to the bitmap is
53*7917SReza.Sabdar@Sun.COM  * returned to the caller.  The descriptor is an integer.  All
54*7917SReza.Sabdar@Sun.COM  * functions of the API use this descriptor to locate the
55*7917SReza.Sabdar@Sun.COM  * bitmap.
56*7917SReza.Sabdar@Sun.COM  *
57*7917SReza.Sabdar@Sun.COM  * Each bitmap is divided into chunks (internally).  Each chunk
58*7917SReza.Sabdar@Sun.COM  * is BMAP_CHUNK_WORDS words (4K now).  Chunks are kept in an
59*7917SReza.Sabdar@Sun.COM  * LRU list for caching.
60*7917SReza.Sabdar@Sun.COM  *
61*7917SReza.Sabdar@Sun.COM  * There is also a hashing on the chunks for accessing them.
62*7917SReza.Sabdar@Sun.COM  * Each hash is an MRU list.
63*7917SReza.Sabdar@Sun.COM  *
64*7917SReza.Sabdar@Sun.COM  * The interfaces are:
65*7917SReza.Sabdar@Sun.COM  *  bm_alloc: To allocate a new bitmap.
66*7917SReza.Sabdar@Sun.COM  *  bm_free: To release the bitmap.
67*7917SReza.Sabdar@Sun.COM  *  bm_getlen: To get the length of the bitmap.
68*7917SReza.Sabdar@Sun.COM  *  bm_getiov: To get the bits specified by the vectors.
69*7917SReza.Sabdar@Sun.COM  *  bm_setiov: To set the bits specified by the vectors.
70*7917SReza.Sabdar@Sun.COM  *  bm_apply_ifset: Calls a callback function on each set
71*7917SReza.Sabdar@Sun.COM  *      bit in the bitmap.
72*7917SReza.Sabdar@Sun.COM  *  bm_apply_ifunset: Calls a callback function on each
73*7917SReza.Sabdar@Sun.COM  *  	clear bit in the bitmap.
74*7917SReza.Sabdar@Sun.COM  *
75*7917SReza.Sabdar@Sun.COM  * There are some other interface for simpilicty of programs:
76*7917SReza.Sabdar@Sun.COM  *   bm_get To get a range of bits.
77*7917SReza.Sabdar@Sun.COM  *   bm_set: To set a range of bits.
78*7917SReza.Sabdar@Sun.COM  *   bm_getone: To get one bit only.
79*7917SReza.Sabdar@Sun.COM  *   bm_setone: To set one bit only.
80*7917SReza.Sabdar@Sun.COM  *   bm_unsetone: To unset one bit only.
81*7917SReza.Sabdar@Sun.COM  *
82*7917SReza.Sabdar@Sun.COM  * The on-disk bitmap functions are the same except they start
83*7917SReza.Sabdar@Sun.COM  * with dbm_*
84*7917SReza.Sabdar@Sun.COM  */
85*7917SReza.Sabdar@Sun.COM 
86*7917SReza.Sabdar@Sun.COM typedef	u_longlong_t u_quad_t;
87*7917SReza.Sabdar@Sun.COM 
88*7917SReza.Sabdar@Sun.COM /*
89*7917SReza.Sabdar@Sun.COM  * A vector for setting bits in the bitmap.
90*7917SReza.Sabdar@Sun.COM  *     - bmv_base: The starting bit number.
91*7917SReza.Sabdar@Sun.COM  *     - bmv_len: Lenght of the vector.
92*7917SReza.Sabdar@Sun.COM  *     - bmv_val: Pointer to the new value of bits.
93*7917SReza.Sabdar@Sun.COM  */
94*7917SReza.Sabdar@Sun.COM typedef struct bm_iovec {
95*7917SReza.Sabdar@Sun.COM 	u_quad_t bmv_base;
96*7917SReza.Sabdar@Sun.COM 	u_quad_t bmv_len;
97*7917SReza.Sabdar@Sun.COM 	uint_t *bmv_val;
98*7917SReza.Sabdar@Sun.COM } bm_iovec_t;
99*7917SReza.Sabdar@Sun.COM 
100*7917SReza.Sabdar@Sun.COM 
101*7917SReza.Sabdar@Sun.COM /*
102*7917SReza.Sabdar@Sun.COM  * An array of vectors on which the set/get operations
103*7917SReza.Sabdar@Sun.COM  * will take place.
104*7917SReza.Sabdar@Sun.COM  *     - bmio_iovcnt: Number of entries in the array.
105*7917SReza.Sabdar@Sun.COM  *     - bmio_iov: Array of vectors.
106*7917SReza.Sabdar@Sun.COM  */
107*7917SReza.Sabdar@Sun.COM typedef struct bm_io {
108*7917SReza.Sabdar@Sun.COM 	int bmio_iovcnt;
109*7917SReza.Sabdar@Sun.COM 	bm_iovec_t *bmio_iov;
110*7917SReza.Sabdar@Sun.COM } bm_io_t;
111*7917SReza.Sabdar@Sun.COM 
112*7917SReza.Sabdar@Sun.COM extern void bm_print(int);
113*7917SReza.Sabdar@Sun.COM 
114*7917SReza.Sabdar@Sun.COM /*
115*7917SReza.Sabdar@Sun.COM  * External Interface.
116*7917SReza.Sabdar@Sun.COM  */
117*7917SReza.Sabdar@Sun.COM extern int bm_alloc(u_quad_t, int);
118*7917SReza.Sabdar@Sun.COM extern int dbm_alloc(char *, u_quad_t, int);
119*7917SReza.Sabdar@Sun.COM 
120*7917SReza.Sabdar@Sun.COM extern int bm_free(int);
121*7917SReza.Sabdar@Sun.COM extern int dbm_free(int);
122*7917SReza.Sabdar@Sun.COM 
123*7917SReza.Sabdar@Sun.COM extern int bm_realloc(int, u_quad_t);
124*7917SReza.Sabdar@Sun.COM extern int dbm_realloc(int, u_quad_t);
125*7917SReza.Sabdar@Sun.COM 
126*7917SReza.Sabdar@Sun.COM extern int bm_setiov(int, bm_io_t *);
127*7917SReza.Sabdar@Sun.COM extern int dbm_setiov(int, bm_io_t *);
128*7917SReza.Sabdar@Sun.COM extern int bm_getiov(int, bm_io_t *);
129*7917SReza.Sabdar@Sun.COM extern int dbm_getiov(int, bm_io_t *);
130*7917SReza.Sabdar@Sun.COM 
131*7917SReza.Sabdar@Sun.COM extern int bm_apply_ifset(int, int (*)(), void *);
132*7917SReza.Sabdar@Sun.COM extern int dbm_apply_ifset(int, int (*)(), void *);
133*7917SReza.Sabdar@Sun.COM extern int bm_apply_ifunset(int, int (*)(), void *);
134*7917SReza.Sabdar@Sun.COM extern int dbm_apply_ifunset(int, int (*)(), void *);
135*7917SReza.Sabdar@Sun.COM 
136*7917SReza.Sabdar@Sun.COM extern char *dbm_getfname(int);
137*7917SReza.Sabdar@Sun.COM extern u_quad_t bm_getlen(int);
138*7917SReza.Sabdar@Sun.COM extern u_quad_t dbm_getlen(int);
139*7917SReza.Sabdar@Sun.COM 
140*7917SReza.Sabdar@Sun.COM extern void dbm_print(int);
141*7917SReza.Sabdar@Sun.COM 
142*7917SReza.Sabdar@Sun.COM 
143*7917SReza.Sabdar@Sun.COM /*
144*7917SReza.Sabdar@Sun.COM  * Statistical and debugging interface.
145*7917SReza.Sabdar@Sun.COM  */
146*7917SReza.Sabdar@Sun.COM extern void dbitmap_stats_clear(void);
147*7917SReza.Sabdar@Sun.COM 
148*7917SReza.Sabdar@Sun.COM 
149*7917SReza.Sabdar@Sun.COM /*
150*7917SReza.Sabdar@Sun.COM  * Macros for setting and unsetting only one bit.
151*7917SReza.Sabdar@Sun.COM  */
152*7917SReza.Sabdar@Sun.COM #define	bm_setone(bmd, bn)	bm_set((bmd), (bn), 1, 1)
153*7917SReza.Sabdar@Sun.COM #define	dbm_setone(bmd, bn)	dbm_set((bmd), (bn), 1, 1)
154*7917SReza.Sabdar@Sun.COM #define	bm_unsetone(bmd, bn)	bm_set((bmd), (bn), 1, 0)
155*7917SReza.Sabdar@Sun.COM #define	dbm_unsetone(bmd, bn)	dbm_set((bmd), (bn), 1, 0)
156*7917SReza.Sabdar@Sun.COM 
157*7917SReza.Sabdar@Sun.COM extern int bm_set(int, u_quad_t, u_quad_t, uint_t);
158*7917SReza.Sabdar@Sun.COM extern int dbm_set(int, u_quad_t, u_quad_t, uint_t);
159*7917SReza.Sabdar@Sun.COM extern int bm_get(int, u_quad_t, u_quad_t, uint_t *);
160*7917SReza.Sabdar@Sun.COM extern int dbm_get(int, u_quad_t, u_quad_t, uint_t *);
161*7917SReza.Sabdar@Sun.COM extern int bm_getone(int, u_quad_t);
162*7917SReza.Sabdar@Sun.COM extern int dbm_getone(int, u_quad_t);
163*7917SReza.Sabdar@Sun.COM 
164*7917SReza.Sabdar@Sun.COM #ifdef __cplusplus
165*7917SReza.Sabdar@Sun.COM }
166*7917SReza.Sabdar@Sun.COM #endif
167*7917SReza.Sabdar@Sun.COM #endif /* _BITMAP_H_ */
168