diff -NurpP --minimal linux-2.6.19.1-vs2.2.0-rc6.5/include/linux/vserver/limit_int.h linux-2.6.19.1-vs2.2.0-rc6.5.1/include/linux/vserver/limit_int.h --- linux-2.6.19.1-vs2.2.0-rc6.5/include/linux/vserver/limit_int.h 2006-12-04 05:22:12 +0100 +++ linux-2.6.19.1-vs2.2.0-rc6.5.1/include/linux/vserver/limit_int.h 2007-01-10 18:05:44 +0100 @@ -171,5 +171,28 @@ static inline int __vx_cres_array_avail( } +static inline void vx_limit_fixup(struct _vx_limit *limit, int id) +{ + rlim_t value; + int res; + + /* complex resources first */ + if ((id < 0) || (id == RLIMIT_RSS)) + __vx_cres_array_fixup(limit, VLA_RSS); + + for (res=0; res 0) && (res != id)) + continue; + + value = __rlim_get(limit, res); + __vx_cres_fixup(limit, res, value); + + /* not supposed to happen, maybe warn? */ + if (__rlim_rmax(limit, res) > __rlim_hard(limit, res)) + __rlim_rmax(limit, res) = __rlim_hard(limit, res); + } +} + + #endif /* __KERNEL__ */ #endif /* _VX_LIMIT_INT_H */ diff -NurpP --minimal linux-2.6.19.1-vs2.2.0-rc6.5/kernel/vserver/limit.c linux-2.6.19.1-vs2.2.0-rc6.5.1/kernel/vserver/limit.c --- linux-2.6.19.1-vs2.2.0-rc6.5/kernel/vserver/limit.c 2006-11-30 19:32:53 +0100 +++ linux-2.6.19.1-vs2.2.0-rc6.5.1/kernel/vserver/limit.c 2007-01-10 18:02:35 +0100 @@ -237,6 +237,7 @@ int vc_rlimit_stat(struct vx_info *vxi, if (!is_accounted_vlimit(id)) return -EINVAL; + vx_limit_fixup(limit, id); vc_data.hits = atomic_read(&__rlim_lhit(limit, id)); vc_data.value = __rlim_get(limit, id); vc_data.minimum = __rlim_rmin(limit, id); diff -NurpP --minimal linux-2.6.19.1-vs2.2.0-rc6.5/kernel/vserver/limit_proc.h linux-2.6.19.1-vs2.2.0-rc6.5.1/kernel/vserver/limit_proc.h --- linux-2.6.19.1-vs2.2.0-rc6.5/kernel/vserver/limit_proc.h 2006-11-30 19:31:41 +0100 +++ linux-2.6.19.1-vs2.2.0-rc6.5.1/kernel/vserver/limit_proc.h 2007-01-10 18:05:27 +0100 @@ -3,24 +3,6 @@ #include -static inline void vx_limit_fixup(struct _vx_limit *limit) -{ - rlim_t value; - int res; - - /* complex resources first */ - __vx_cres_array_fixup(limit, VLA_RSS); - - for (res=0; res __rlim_hard(limit, res)) - __rlim_rmax(limit, res) = __rlim_hard(limit, res); - } -} - #define VX_LIMIT_FMT ":\t%8ld\t%8ld/%8ld\t%8lld/%8lld\t%6d\n" #define VX_LIMIT_TOP \ @@ -36,7 +18,7 @@ static inline void vx_limit_fixup(struct static inline int vx_info_proc_limit(struct _vx_limit *limit, char *buffer) { - vx_limit_fixup(limit); + vx_limit_fixup(limit, -1); return sprintf(buffer, VX_LIMIT_TOP "PROC" VX_LIMIT_FMT "VM" VX_LIMIT_FMT