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