From: Anton Blanchard <anton@samba.org>

The follow patch special cases the NR_CPUS <= BITS_PER_COMPAT_LONG case. 
Without this patch, a 32bit task would be required to have a 64bit cpumask
no matter what value of NR_CPUS are used.

With this patch a compat long sized bitmask is allowed if NR_CPUS is small
enough to fit within it.

Of course applications should be using the glibc wrappers that use an
opaque cpu_mask_t type, but could be older applications using the syscalls
directly.

Signed-off-by: Anton Blanchard <anton@samba.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 25-akpm/kernel/compat.c |   10 +++++++---
 1 files changed, 7 insertions(+), 3 deletions(-)

diff -puN kernel/compat.c~allow-compat-long-sized-bitmasks-in-affinity-code kernel/compat.c
--- 25/kernel/compat.c~allow-compat-long-sized-bitmasks-in-affinity-code	2004-09-09 10:58:01.782054704 -0700
+++ 25-akpm/kernel/compat.c	2004-09-09 10:58:01.791053336 -0700
@@ -446,8 +446,12 @@ asmlinkage long compat_sys_sched_getaffi
 	int ret;
 	cpumask_t mask;
 	unsigned long *k;
+	unsigned int min_length = sizeof(cpumask_t);
 
-	if (len < sizeof(cpumask_t))
+	if (NR_CPUS <= BITS_PER_COMPAT_LONG)
+		min_length = sizeof(compat_ulong_t);
+
+	if (len < min_length)
 		return -EINVAL;
 
 	ret = sched_getaffinity(pid, &mask);
@@ -455,11 +459,11 @@ asmlinkage long compat_sys_sched_getaffi
 		return ret;
 
 	k = cpus_addr(mask);
-	ret = compat_put_bitmap(user_mask_ptr, k, sizeof(cpumask_t) * 8);
+	ret = compat_put_bitmap(user_mask_ptr, k, min_length * 8);
 	if (ret)
 		return ret;
 
-	return sizeof(cpumask_t);
+	return min_length;
 }
 
 static int get_compat_itimerspec(struct itimerspec *dst, 
_