#ifndef _SYS_BLIST_H_
#define _SYS_BLIST_H_
#define LOG2(v) (((u_daddr_t)(v) >= 0x80000000U) ? 31 : \
((u_daddr_t)(v) >= 0x40000000U) ? 30 : \
((u_daddr_t)(v) >= 0x20000000U) ? 29 : \
((u_daddr_t)(v) >= 0x10000000U) ? 28 : \
((u_daddr_t)(v) >= 0x08000000U) ? 27 : \
((u_daddr_t)(v) >= 0x04000000U) ? 26 : \
((u_daddr_t)(v) >= 0x02000000U) ? 25 : \
((u_daddr_t)(v) >= 0x01000000U) ? 24 : \
((u_daddr_t)(v) >= 0x00800000U) ? 23 : \
((u_daddr_t)(v) >= 0x00400000U) ? 22 : \
((u_daddr_t)(v) >= 0x00200000U) ? 21 : \
((u_daddr_t)(v) >= 0x00100000U) ? 20 : \
((u_daddr_t)(v) >= 0x00080000U) ? 19 : \
((u_daddr_t)(v) >= 0x00040000U) ? 18 : \
((u_daddr_t)(v) >= 0x00020000U) ? 17 : \
((u_daddr_t)(v) >= 0x00010000U) ? 16 : \
((u_daddr_t)(v) >= 0x00008000U) ? 15 : \
((u_daddr_t)(v) >= 0x00004000U) ? 14 : \
((u_daddr_t)(v) >= 0x00002000U) ? 13 : \
((u_daddr_t)(v) >= 0x00001000U) ? 12 : \
((u_daddr_t)(v) >= 0x00000800U) ? 11 : \
((u_daddr_t)(v) >= 0x00000400U) ? 10 : \
((u_daddr_t)(v) >= 0x00000200U) ? 9 : \
((u_daddr_t)(v) >= 0x00000100U) ? 8 : \
((u_daddr_t)(v) >= 0x00000080U) ? 7 : \
((u_daddr_t)(v) >= 0x00000040U) ? 6 : \
((u_daddr_t)(v) >= 0x00000020U) ? 5 : \
((u_daddr_t)(v) >= 0x00000010U) ? 4 : \
((u_daddr_t)(v) >= 0x00000008U) ? 3 : \
((u_daddr_t)(v) >= 0x00000004U) ? 2 : \
((u_daddr_t)(v) >= 0x00000002U) ? 1 : 0)
typedef struct blmeta {
union {
daddr_t bmu_avail;
u_daddr_t bmu_bitmap;
} u;
daddr_t bm_bighint;
} blmeta_t;
typedef struct blist {
daddr_t bl_blocks;
daddr_t bl_radix;
daddr_t bl_skip;
daddr_t bl_free;
blmeta_t *bl_root;
daddr_t bl_rootblks;
} *blist_t;
#define BLIST_META_RADIX 16
#define BLIST_META_RADIX_SHIFT LOG2(BLIST_META_RADIX)
#define BLIST_BMAP_RADIX (sizeof(u_daddr_t)*8)
#define BLIST_BMAP_RADIX_SHIFT LOG2(BLIST_BMAP_RADIX)
#define BLIST_MAX_ALLOC BLIST_BMAP_RADIX
extern blist_t blist_create(daddr_t blocks);
extern void blist_destroy(blist_t blist);
extern daddr_t blist_alloc(blist_t blist, daddr_t count);
extern void blist_free(blist_t blist, daddr_t blkno, daddr_t count);
extern void blist_print(blist_t blist);
extern void blist_resize(blist_t *pblist, daddr_t count, int freenew);
#endif