From: Anton Blanchard 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 Signed-off-by: Andrew Morton --- 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, _