From: Andrew Morton Date: Mon, 10 Jul 2006 11:45:31 +0000 (-0700) Subject: [PATCH] fix weird logic in alloc_fdtable() X-Git-Tag: v2.6.18-rc2~142 X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=92eb7a2f28d551acedeb5752263267a64b1f5ddf;p=linux-2.6 [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 Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds --- diff --git a/fs/file.c b/fs/file.c index 55f4e70225..3f35608606 100644 --- a/fs/file.c +++ b/fs/file.c @@ -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);