void *mtree_load(struct maple_tree *mt, unsigned long index);
+int mtree_insert(struct maple_tree *mt, unsigned long index, void *entry,
+ gfp_t gfp);
-int mtree_insert(struct maple_tree *mt, unsigned long index, void *entry);
-
-int mtree_insert_range(struct maple_tree *mt, unsigned long start,
- unsigned long end, void *entry);
+int mtree_insert_range(struct maple_tree *mt, unsigned long first,
+ unsigned long last, void *entry, gfp_t gfp);
int mtree_erase(struct maple_tree *mt, unsigned long index);
int mtree_destroy(struct maple_tree *mt);
-
#endif
static struct maple_node *_maple_new_node(gfp_t gfp)
{
struct maple_node *mn;
- size_t size = sizeof(struct maple_node);
- mn = kmalloc(size, gfp);
- if (mn == NULL)
+
+ mn = kzalloc(sizeof(*mn), gfp);
+ if (!mn)
goto kmalloc_failed;
mn->map64.parent = NULL;
kmalloc_failed:
return mn;
-
}
static bool __maple_nomem(struct maple_state *ms, gfp_t gfp)
EXPORT_SYMBOL(maple_init);
/* Store an entry for a given range.
- * Does not overwrite, returns -EEXISTS if the entry exists already
+ * Does not overwrite, returns -EEXIST if the entry exists already
*/
int mtree_insert_range(struct maple_tree *mt, unsigned long start,
- unsigned long end, void *entry)
+ unsigned long end, void *entry, gfp_t gfp)
{
int ret = -EEXIST;
void *walked = NULL;
ret = _maple_insert(&ms, entry);
if (ret == -ENOMEM) {
- if (__maple_nomem(&ms, GFP_KERNEL | __GFP_ZERO)) // Drops lock.
+ if (__maple_nomem(&ms, gfp))
goto retry;
}
}
/* Store an entry at an index.
- * Does not overwrite, returns -EEXISTS if the entry exists already
+ * Does not overwrite, returns -EEXIST if the entry exists already
*/
-int mtree_insert(struct maple_tree *mt, unsigned long index, void *entry)
+int mtree_insert(struct maple_tree *mt, unsigned long index, void *entry,
+ gfp_t gfp)
{
- return mtree_insert_range(mt, index, index, entry);
+ return mtree_insert_range(mt, index, index, entry, gfp);
}
EXPORT_SYMBOL(mtree_insert);
static int mtree_test_insert(struct maple_tree *mt, unsigned long index,
void *ptr)
{
- return mtree_insert(mt, index, ptr);
+ return mtree_insert(mt, index, ptr, GFP_KERNEL);
}
static int mtree_test_insert_range(struct maple_tree *mt, unsigned long start,
unsigned long end, void *ptr)
{
- return mtree_insert_range(mt, start, end, ptr);
+ return mtree_insert_range(mt, start, end, ptr, GFP_KERNEL);
}
static void *mtree_test_load(struct maple_tree *mt, unsigned long index)