[PATCH] fix weird logic in alloc_fdtable()
Andrew Morton [Mon, 10 Jul 2006 11:45:31 +0000 (04:45 -0700)]
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>

fs/file.c

index 55f4e70..3f35608 100644 (file)
--- 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);