Catch negative FDs
[akaros.git] / kern / src / radix.c
index b8fc00e..3324c30 100644 (file)
@@ -48,7 +48,7 @@ int radix_insert(struct radix_tree *tree, unsigned long key, void *item)
        void **slot;
        /* Is the tree tall enough?  if not, it needs to grow a level.  This will
         * also create the initial node (upper bound starts at 0). */
-       if (key >= tree->upper_bound) {
+       while (key >= tree->upper_bound) {
                r_node = kmem_cache_alloc(radix_kcache, 0);
                if (!r_node)
                        return -ENOMEM;
@@ -72,7 +72,7 @@ int radix_insert(struct radix_tree *tree, unsigned long key, void *item)
         * it, etc */
        r_node = __radix_lookup_node(tree, key, TRUE);
        assert(r_node);         /* we want an ENOMEM actually, but i want to see this */
-       slot = &r_node->items[key & (LOG_RNODE_SLOTS - 1)];
+       slot = &r_node->items[key & (NR_RNODE_SLOTS - 1)];
        if (*slot)
                return -EEXIST;
        *slot = item;
@@ -107,7 +107,7 @@ void *radix_delete(struct radix_tree *tree, unsigned long key)
        struct radix_node *r_node = __radix_lookup_node(tree, key, 0);
        if (!r_node)
                return 0;
-       slot = &r_node->items[key & (LOG_RNODE_SLOTS - 1)];
+       slot = &r_node->items[key & (NR_RNODE_SLOTS - 1)];
        retval = *slot;
        if (retval) {
                __radix_remove_slot(r_node, (struct radix_node**)slot); 
@@ -141,10 +141,13 @@ static struct radix_node *__radix_lookup_node(struct radix_tree *tree,
 {
        unsigned long idx;
        struct radix_node *child_node, *r_node = tree->root;
-       if (key >= tree->upper_bound)
+       if (key >= tree->upper_bound) {
+               if (extend)
+                       warn("Bound (%d) not set for key %d!\n", tree->upper_bound, key);
                return 0;
+       }
        for (int i = tree->depth; i > 1; i--) {  /* i = ..., 4, 3, 2 */
-               idx = (key >> (LOG_RNODE_SLOTS * (i - 1))) & (LOG_RNODE_SLOTS - 1);
+               idx = (key >> (LOG_RNODE_SLOTS * (i - 1))) & (NR_RNODE_SLOTS - 1);
                /* There might not be a node at this part of the tree */
                if (!r_node->items[idx]) {
                        if (!extend) {
@@ -178,7 +181,7 @@ void **radix_lookup_slot(struct radix_tree *tree, unsigned long key)
        struct radix_node *r_node = __radix_lookup_node(tree, key, FALSE);
        if (!r_node)
                return 0;
-       key = key & (LOG_RNODE_SLOTS - 1);
+       key = key & (NR_RNODE_SLOTS - 1);
        return &r_node->items[key];
 }