diff -NurpP linux-2.6.15-vs2.1.0.5/include/linux/vserver/limit.h linux-2.6.15-vs2.1.0.5.1/include/linux/vserver/limit.h --- linux-2.6.15-vs2.1.0.5/include/linux/vserver/limit.h 2006-01-20 20:38:33.000000000 +0100 +++ linux-2.6.15-vs2.1.0.5.1/include/linux/vserver/limit.h 2006-01-20 21:24:13.000000000 +0100 @@ -31,6 +31,7 @@ typedef unsigned long rlim_t; #define __rlim_inc(l,r) atomic64_inc(&__rlim_val(l,r)) #define __rlim_dec(l,r) atomic64_dec(&__rlim_val(l,r)) #define __rlim_add(l,r,v) atomic64_add(v, &__rlim_val(l,r)) +#define __rlim_sub(l,r,v) atomic64_sub(v, &__rlim_val(l,r)) #else /* !ATOMIC64_INIT */ typedef atomic_t rlim_atomic_t; @@ -41,6 +42,8 @@ typedef unsigned rlim_t; #define __rlim_inc(l,r) atomic_inc(&__rlim_val(l,r)) #define __rlim_dec(l,r) atomic_dec(&__rlim_val(l,r)) #define __rlim_add(l,r,v) atomic_add(v, &__rlim_val(l,r)) +#define __rlim_sub(l,r,v) atomic_sub(v, &__rlim_val(l,r)) + #endif /* ATOMIC64_INIT */ #if (RLIM_INFINITY == VLIM_INFINITY) diff -NurpP linux-2.6.15-vs2.1.0.5/kernel/vserver/context.c linux-2.6.15-vs2.1.0.5.1/kernel/vserver/context.c --- linux-2.6.15-vs2.1.0.5/kernel/vserver/context.c 2006-01-20 20:38:33.000000000 +0100 +++ linux-2.6.15-vs2.1.0.5.1/kernel/vserver/context.c 2006-01-20 21:11:19.000000000 +0100 @@ -660,15 +660,15 @@ int vx_migrate_task(struct task_struct * if (old_vxi) { atomic_dec(&old_vxi->cvirt.nr_threads); atomic_dec(&old_vxi->cvirt.nr_running); - atomic_dec(&old_vxi->limit.rcur[RLIMIT_NPROC]); + __rlim_dec(&old_vxi->limit, RLIMIT_NPROC); /* FIXME: what about the struct files here? */ - atomic_sub(openfd, &old_vxi->limit.rcur[VLIMIT_OPENFD]); + __rlim_sub(&old_vxi->limit, VLIMIT_OPENFD, openfd); } atomic_inc(&vxi->cvirt.nr_threads); atomic_inc(&vxi->cvirt.nr_running); - atomic_inc(&vxi->limit.rcur[RLIMIT_NPROC]); + __rlim_inc(&vxi->limit, RLIMIT_NPROC); /* FIXME: what about the struct files here? */ - atomic_add(openfd, &vxi->limit.rcur[VLIMIT_OPENFD]); + __rlim_add(&vxi->limit, VLIMIT_OPENFD, openfd); if (old_vxi) { release_vx_info(old_vxi, p);