diff options
author | Andrew Morton <akpm@osdl.org> | 2006-07-10 04:45:31 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-07-10 13:24:25 -0700 |
commit | 92eb7a2f28d551acedeb5752263267a64b1f5ddf (patch) | |
tree | e77b0dee5598df8f44a6f57783a3344e2e4e98c1 /fs | |
parent | 38e0e8c0550eaed1af48ec5ad9ddb8a25e8b04ae (diff) | |
download | op-kernel-dev-92eb7a2f28d551acedeb5752263267a64b1f5ddf.zip op-kernel-dev-92eb7a2f28d551acedeb5752263267a64b1f5ddf.tar.gz |
[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')
-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) if (!fdt) goto out; - nfds = 8 * L1_CACHE_BYTES; - /* Expand to the max in easy steps */ - while (nfds <= nr) { - nfds = nfds * 2; - if (nfds > NR_OPEN) - nfds = NR_OPEN; - } + nfds = max_t(int, 8 * L1_CACHE_BYTES, roundup_pow_of_two(nfds)); + if (nfds > NR_OPEN) + nfds = NR_OPEN; new_openset = alloc_fdset(nfds); new_execset = alloc_fdset(nfds); |