summaryrefslogtreecommitdiffstats
path: root/lib/idr.c
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2010-05-31 14:46:45 +0200
committerDavid S. Miller <davem@davemloft.net>2010-05-31 14:46:45 +0200
commit64960848abd18d0bcde3f53ffa7ed0b631e6b25d (patch)
tree8424a1c550a98ce09f127425fde9b7b5f2f5027a /lib/idr.c
parentnet: fix sk_forward_alloc corruptions (diff)
parentLinux 2.6.35-rc1 (diff)
downloadlinux-64960848abd18d0bcde3f53ffa7ed0b631e6b25d.tar.xz
linux-64960848abd18d0bcde3f53ffa7ed0b631e6b25d.zip
Merge branch 'master' of /home/davem/src/GIT/linux-2.6/
Diffstat (limited to 'lib/idr.c')
-rw-r--r--lib/idr.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/lib/idr.c b/lib/idr.c
index 2eb1dca03681..c1a206901761 100644
--- a/lib/idr.c
+++ b/lib/idr.c
@@ -445,6 +445,7 @@ EXPORT_SYMBOL(idr_remove);
void idr_remove_all(struct idr *idp)
{
int n, id, max;
+ int bt_mask;
struct idr_layer *p;
struct idr_layer *pa[MAX_LEVEL];
struct idr_layer **paa = &pa[0];
@@ -462,8 +463,10 @@ void idr_remove_all(struct idr *idp)
p = p->ary[(id >> n) & IDR_MASK];
}
+ bt_mask = id;
id += 1 << n;
- while (n < fls(id)) {
+ /* Get the highest bit that the above add changed from 0->1. */
+ while (n < fls(id ^ bt_mask)) {
if (p)
free_layer(p);
n += IDR_BITS;
@@ -623,7 +626,7 @@ void *idr_get_next(struct idr *idp, int *nextidp)
}
return NULL;
}
-
+EXPORT_SYMBOL(idr_get_next);
/**