Commit 6f14a668f1a8b715a6e855f4e32705e54a6e86a1
Committed by
Linus Torvalds
1 parent
e9e70bc14e
Exists in
master
and in
20 other branches
idr: revert misallocation bug fix
Commit 859ddf09743a8cc680af33f7259ccd0fd36bfe9d tried to fix misallocation bug but broke full bit marking by not clearing pa[idp->layers] and also is causing X failures due to lookup failure in drm code. The cause of the latter hasn't been found yet. Revert the fix for now. Signed-off-by: Tejun Heo <tj@kernel.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Showing 1 changed file with 4 additions and 3 deletions Side-by-side Diff
lib/idr.c
... | ... | @@ -140,7 +140,8 @@ |
140 | 140 | id = *starting_id; |
141 | 141 | restart: |
142 | 142 | p = idp->top; |
143 | - l = p->layer; | |
143 | + l = idp->layers; | |
144 | + pa[l--] = NULL; | |
144 | 145 | while (1) { |
145 | 146 | /* |
146 | 147 | * We run around this while until we reach the leaf node... |
... | ... | @@ -154,8 +155,8 @@ |
154 | 155 | oid = id; |
155 | 156 | id = (id | ((1 << (IDR_BITS * l)) - 1)) + 1; |
156 | 157 | |
157 | - /* did id go over the limit? */ | |
158 | - if (id >= (1 << (idp->layers * IDR_BITS))) { | |
158 | + /* if already at the top layer, we need to grow */ | |
159 | + if (!(p = pa[l])) { | |
159 | 160 | *starting_id = id; |
160 | 161 | return IDR_NEED_TO_GROW; |
161 | 162 | } |