Index: generic/src/adt/btree.c
===================================================================
--- generic/src/adt/btree.c	(revision 9f29243228e034449b2e54a2821f6c95bd8b1e7b)
+++ generic/src/adt/btree.c	(revision c034b164fce2965ed6484d251876ad7e153978a3)
@@ -51,4 +51,5 @@
 #include <print.h>
 
+static void btree_destroy_subtree(btree_node_t *root);
 static void _btree_insert(btree_t *t, btree_key_t key, void *value, btree_node_t *rsubtree, btree_node_t *node);
 static void _btree_remove(btree_t *t, btree_key_t key, btree_node_t *node);
@@ -102,6 +103,5 @@
 void btree_destroy(btree_t *t)
 {
-	ASSERT(!t->root->keys);
-	slab_free(btree_node_slab, t->root);
+	btree_destroy_subtree(t->root);
 }
 
@@ -127,4 +127,21 @@
 	
 	_btree_insert(t, key, value, NULL, lnode);
+}
+
+/** Destroy subtree rooted in a node.
+ *
+ * @param root Root of the subtree.
+ */
+void btree_destroy_subtree(btree_node_t *root)
+{
+	int i;
+
+	if (root->keys) {
+		for (i = 0; i < root->keys + 1; i++) { 
+			if (root->subtree[i])
+				btree_destroy_subtree(root->subtree[i]);
+		}
+	}
+	slab_free(btree_node_slab, root);
 }
 
