
From: Greg Edwards <edwardsg@sgi.com>

On ia64, EXEC_PAGESIZE (max page size) is 65536, but the default page size is
16k.  This results in NGROUPS_PER_BLOCK in include/linux/sched.h being
calculated incorrectly when the page size is anything other than 64k.  For
example, on a 16k page size kernel, a setgroups() call with a gidsetsize of
65536 will end up walking over memory since only 1/4 of the needed pages were
allocated for the blocks[] array in the group_info struct.

Patch below calculates NGROUPS_PER_BLOCK from PAGE_SIZE instead.


---

 25-akpm/include/linux/sched.h |    2 +-
 1 files changed, 1 insertion(+), 1 deletion(-)

diff -puN include/linux/sched.h~calculate-ngroups_per_block-from-page_size include/linux/sched.h
--- 25/include/linux/sched.h~calculate-ngroups_per_block-from-page_size	Tue May 11 17:20:03 2004
+++ 25-akpm/include/linux/sched.h	Tue May 11 17:20:03 2004
@@ -363,7 +363,7 @@ struct io_context;			/* See blkdev.h */
 void exit_io_context(void);
 
 #define NGROUPS_SMALL		32
-#define NGROUPS_PER_BLOCK	((int)(EXEC_PAGESIZE / sizeof(gid_t)))
+#define NGROUPS_PER_BLOCK	((int)(PAGE_SIZE / sizeof(gid_t)))
 struct group_info {
 	int ngroups;
 	atomic_t usage;

_
