Commit 8df3aaaf authored by Joern Engel's avatar Joern Engel Committed by Linus Torvalds

btree: avoid variable-length allocations

geo->keylen cannot be larger than 4.  So we might as well make
fixed-size allocations.

Given the one remaining user, geo->keylen cannot even be larger than 1.
Logfs used to have 64bit and 128bit keys, tcm_qla2xxx only has 32bit
keys.  But let's not break the code if we don't have to.
Signed-off-by: default avatarJoern Engel <joern@purestorage.com>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent fed8f509
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* *
* As should be obvious for Linux kernel code, license is GPLv2 * As should be obvious for Linux kernel code, license is GPLv2
* *
* Copyright (c) 2007-2008 Joern Engel <joern@logfs.org> * Copyright (c) 2007-2008 Joern Engel <joern@purestorage.com>
* Bits and pieces stolen from Peter Zijlstra's code, which is * Bits and pieces stolen from Peter Zijlstra's code, which is
* Copyright 2007, Red Hat Inc. Peter Zijlstra * Copyright 2007, Red Hat Inc. Peter Zijlstra
* GPLv2 * GPLv2
...@@ -76,6 +76,8 @@ struct btree_geo btree_geo128 = { ...@@ -76,6 +76,8 @@ struct btree_geo btree_geo128 = {
}; };
EXPORT_SYMBOL_GPL(btree_geo128); EXPORT_SYMBOL_GPL(btree_geo128);
#define MAX_KEYLEN (2 * LONG_PER_U64)
static struct kmem_cache *btree_cachep; static struct kmem_cache *btree_cachep;
void *btree_alloc(gfp_t gfp_mask, void *pool_data) void *btree_alloc(gfp_t gfp_mask, void *pool_data)
...@@ -313,7 +315,7 @@ void *btree_get_prev(struct btree_head *head, struct btree_geo *geo, ...@@ -313,7 +315,7 @@ void *btree_get_prev(struct btree_head *head, struct btree_geo *geo,
{ {
int i, height; int i, height;
unsigned long *node, *oldnode; unsigned long *node, *oldnode;
unsigned long *retry_key = NULL, key[geo->keylen]; unsigned long *retry_key = NULL, key[MAX_KEYLEN];
if (keyzero(geo, __key)) if (keyzero(geo, __key))
return NULL; return NULL;
...@@ -639,8 +641,8 @@ EXPORT_SYMBOL_GPL(btree_remove); ...@@ -639,8 +641,8 @@ EXPORT_SYMBOL_GPL(btree_remove);
int btree_merge(struct btree_head *target, struct btree_head *victim, int btree_merge(struct btree_head *target, struct btree_head *victim,
struct btree_geo *geo, gfp_t gfp) struct btree_geo *geo, gfp_t gfp)
{ {
unsigned long key[geo->keylen]; unsigned long key[MAX_KEYLEN];
unsigned long dup[geo->keylen]; unsigned long dup[MAX_KEYLEN];
void *val; void *val;
int err; int err;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment