Index: kernel/generic/include/adt/bitmap.h
===================================================================
--- kernel/generic/include/adt/bitmap.h	(revision a74d0ad855d5ae331fcd2023dcc2b0281b01e5e9)
+++ kernel/generic/include/adt/bitmap.h	(revision 8c34acf7ac4a88980ef19ea35292034545fddcde)
@@ -38,24 +38,60 @@
 #include <typedefs.h>
 
-#define BITS2BYTES(bits)	(bits ? ((((bits)-1)>>3)+1) : 0)
+#define BITMAP_ELEMENT   8
+#define BITMAP_REMAINER  7
 
 typedef struct {
-	uint8_t *map;
-	size_t bits;
+	size_t elements;
+	uint8_t *bits;
+	
+	size_t block_size;
+	uint8_t *blocks;
 } bitmap_t;
 
-extern void bitmap_initialize(bitmap_t *bitmap, uint8_t *map, size_t bits);
-extern void bitmap_set_range(bitmap_t *bitmap, size_t start, size_t bits);
-extern void bitmap_clear_range(bitmap_t *bitmap, size_t start, size_t bits);
-extern void bitmap_copy(bitmap_t *dst, bitmap_t *src, size_t bits);
+static inline void bitmap_set(bitmap_t *bitmap, size_t element,
+    unsigned int value)
+{
+	if (element < bitmap->elements) {
+		/*
+		 * The 2nd level bitmap is conservative.
+		 * Make sure we update it properly.
+		 */
+		
+		if (value) {
+			bitmap->bits[element / BITMAP_ELEMENT] |=
+			    (1 << (element & BITMAP_REMAINER));
+		} else {
+			bitmap->bits[element / BITMAP_ELEMENT] &=
+			    ~(1 << (element & BITMAP_REMAINER));
+			
+			if (bitmap->block_size > 0) {
+				size_t block = element / bitmap->block_size;
+				
+				bitmap->blocks[block / BITMAP_ELEMENT] &=
+				    ~(1 << (block & BITMAP_REMAINER));
+			}
+		}
+	}
+}
 
-static inline int bitmap_get(bitmap_t *bitmap, size_t bit)
+static inline unsigned int bitmap_get(bitmap_t *bitmap, size_t element)
 {
-	if(bit >= bitmap->bits)
+	if (element >= bitmap->elements)
 		return 0;
 	
-	return !! ((bitmap->map)[bit/8] & (1 << (bit & 7)));
+	return !!((bitmap->bits)[element / BITMAP_ELEMENT] &
+	    (1 << (element & BITMAP_REMAINER)));
 }
 
+extern size_t bitmap_size(size_t, size_t);
+extern void bitmap_initialize(bitmap_t *, size_t, size_t, void *);
+
+extern void bitmap_set_range(bitmap_t *, size_t, size_t);
+extern void bitmap_clear_range(bitmap_t *, size_t, size_t);
+
+extern int bitmap_find_range(bitmap_t *, size_t, size_t, size_t);
+extern int bitmap_allocate_range(bitmap_t *, size_t, size_t, size_t, size_t *);
+extern void bitmap_free_range(bitmap_t *, size_t, size_t);
+extern void bitmap_copy(bitmap_t *, bitmap_t *, size_t);
 
 #endif
