From: Neil Brown This way it is more balanced: if it puts a group_info, it also gets one. Thus don't need to conditionally put_group_info after the call. Also fix a missing '{' in compat_linux.c --- 25-akpm/arch/ia64/ia32/sys_ia32.c | 3 +-- 25-akpm/arch/s390/kernel/compat_linux.c | 5 ++--- 25-akpm/arch/sparc64/kernel/sys_sparc32.c | 3 +-- 25-akpm/fs/nfsd/auth.c | 4 ++-- 25-akpm/kernel/sys.c | 4 ++-- 25-akpm/kernel/uid16.c | 3 +-- 6 files changed, 9 insertions(+), 13 deletions(-) diff -puN arch/ia64/ia32/sys_ia32.c~increase-NGROUPS-cleanup-and-fix arch/ia64/ia32/sys_ia32.c --- 25/arch/ia64/ia32/sys_ia32.c~increase-NGROUPS-cleanup-and-fix Thu Feb 5 16:09:07 2004 +++ 25-akpm/arch/ia64/ia32/sys_ia32.c Thu Feb 5 16:09:07 2004 @@ -2489,8 +2489,7 @@ sys32_setgroups16 (int gidsetsize, short } retval = set_current_groups(group_info); - if (retval) - put_group_info(group_info); + put_group_info(group_info); return retval; } diff -puN arch/s390/kernel/compat_linux.c~increase-NGROUPS-cleanup-and-fix arch/s390/kernel/compat_linux.c --- 25/arch/s390/kernel/compat_linux.c~increase-NGROUPS-cleanup-and-fix Thu Feb 5 16:09:07 2004 +++ 25-akpm/arch/s390/kernel/compat_linux.c Thu Feb 5 16:09:07 2004 @@ -232,7 +232,7 @@ asmlinkage long sys32_getgroups16(int gi i = -EINVAL; goto out; } - if (groups16_to_user(grouplist, current->group_info)) + if (groups16_to_user(grouplist, current->group_info)) { i = -EFAULT; goto out; } @@ -262,8 +262,7 @@ asmlinkage long sys32_setgroups16(int gi } retval = set_current_groups(group_info); - if (retval) - put_group_info(group_info); + put_group_info(group_info); return retval; } diff -puN arch/sparc64/kernel/sys_sparc32.c~increase-NGROUPS-cleanup-and-fix arch/sparc64/kernel/sys_sparc32.c --- 25/arch/sparc64/kernel/sys_sparc32.c~increase-NGROUPS-cleanup-and-fix Thu Feb 5 16:09:07 2004 +++ 25-akpm/arch/sparc64/kernel/sys_sparc32.c Thu Feb 5 16:09:07 2004 @@ -251,8 +251,7 @@ asmlinkage long sys32_setgroups16(int gi } retval = set_current_groups(group_info); - if (retval) - put_group_info(group_info); + put_group_info(group_info); return retval; } diff -puN fs/nfsd/auth.c~increase-NGROUPS-cleanup-and-fix fs/nfsd/auth.c --- 25/fs/nfsd/auth.c~increase-NGROUPS-cleanup-and-fix Thu Feb 5 16:09:07 2004 +++ 25-akpm/fs/nfsd/auth.c Thu Feb 5 16:09:07 2004 @@ -70,8 +70,8 @@ int nfsd_setuser(struct svc_rqst *rqstp, cap_t(current->cap_effective) |= (CAP_NFSD_MASK & current->cap_permitted); } - } else { - put_group_info(group_info); } + put_group_info(group_info); + return ret; } diff -puN kernel/sys.c~increase-NGROUPS-cleanup-and-fix kernel/sys.c --- 25/kernel/sys.c~increase-NGROUPS-cleanup-and-fix Thu Feb 5 16:09:07 2004 +++ 25-akpm/kernel/sys.c Thu Feb 5 16:09:07 2004 @@ -1247,6 +1247,7 @@ int set_current_groups(struct group_info return retval; groups_sort(group_info); + get_group_info(group_info); old_info = current->group_info; current->group_info = group_info; put_group_info(old_info); @@ -1310,8 +1311,7 @@ asmlinkage long sys_setgroups(int gidset } retval = set_current_groups(group_info); - if (retval) - put_group_info(group_info); + put_group_info(group_info); return retval; } diff -puN kernel/uid16.c~increase-NGROUPS-cleanup-and-fix kernel/uid16.c --- 25/kernel/uid16.c~increase-NGROUPS-cleanup-and-fix Thu Feb 5 16:09:07 2004 +++ 25-akpm/kernel/uid16.c Thu Feb 5 16:09:07 2004 @@ -181,8 +181,7 @@ asmlinkage long sys_setgroups16(int gids } retval = set_current_groups(group_info); - if (retval) - put_group_info(group_info); + put_group_info(group_info); return retval; } _