|
@@ -140,7 +140,8 @@ static int sub_alloc(struct idr *idp, int *starting_id, struct idr_layer **pa)
|
|
id = *starting_id;
|
|
id = *starting_id;
|
|
restart:
|
|
restart:
|
|
p = idp->top;
|
|
p = idp->top;
|
|
- l = p->layer;
|
|
|
|
|
|
+ l = idp->layers;
|
|
|
|
+ pa[l--] = NULL;
|
|
while (1) {
|
|
while (1) {
|
|
/*
|
|
/*
|
|
* We run around this while until we reach the leaf node...
|
|
* We run around this while until we reach the leaf node...
|
|
@@ -154,8 +155,8 @@ static int sub_alloc(struct idr *idp, int *starting_id, struct idr_layer **pa)
|
|
oid = id;
|
|
oid = id;
|
|
id = (id | ((1 << (IDR_BITS * l)) - 1)) + 1;
|
|
id = (id | ((1 << (IDR_BITS * l)) - 1)) + 1;
|
|
|
|
|
|
- /* did id go over the limit? */
|
|
|
|
- if (id >= (1 << (idp->layers * IDR_BITS))) {
|
|
|
|
|
|
+ /* if already at the top layer, we need to grow */
|
|
|
|
+ if (!(p = pa[l])) {
|
|
*starting_id = id;
|
|
*starting_id = id;
|
|
return IDR_NEED_TO_GROW;
|
|
return IDR_NEED_TO_GROW;
|
|
}
|
|
}
|