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