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