diff options
author | Andrew Morton <akpm@osdl.org> | 2006-07-10 07:45:31 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-07-10 16:24:25 -0400 |
commit | 92eb7a2f28d551acedeb5752263267a64b1f5ddf (patch) | |
tree | e77b0dee5598df8f44a6f57783a3344e2e4e98c1 /fs/file.c | |
parent | 38e0e8c0550eaed1af48ec5ad9ddb8a25e8b04ae (diff) |
[PATCH] fix weird logic in alloc_fdtable()
There's a fairly obvious infinite loop in there.
Also, use roundup_pow_of_two() rather than open-coding stuff.
Cc: Eric Dumazet <dada1@cosmosbay.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'fs/file.c')
-rw-r--r-- | fs/file.c | 10 |
1 files changed, 3 insertions, 7 deletions
@@ -240,13 +240,9 @@ static struct fdtable *alloc_fdtable(int nr) | |||
240 | if (!fdt) | 240 | if (!fdt) |
241 | goto out; | 241 | goto out; |
242 | 242 | ||
243 | nfds = 8 * L1_CACHE_BYTES; | 243 | nfds = max_t(int, 8 * L1_CACHE_BYTES, roundup_pow_of_two(nfds)); |
244 | /* Expand to the max in easy steps */ | 244 | if (nfds > NR_OPEN) |
245 | while (nfds <= nr) { | 245 | nfds = NR_OPEN; |
246 | nfds = nfds * 2; | ||
247 | if (nfds > NR_OPEN) | ||
248 | nfds = NR_OPEN; | ||
249 | } | ||
250 | 246 | ||
251 | new_openset = alloc_fdset(nfds); | 247 | new_openset = alloc_fdset(nfds); |
252 | new_execset = alloc_fdset(nfds); | 248 | new_execset = alloc_fdset(nfds); |