- static struct vcmd_ctx_rlimit_mask_v0 mask = {
- /* minimum */
- 0
- , /* softlimit */
- 0
- , /* maximum */
- (1 << RLIMIT_RSS) |
- (1 << RLIMIT_NPROC) |
- (1 << RLIMIT_NOFILE) |
- (1 << RLIMIT_MEMLOCK) |
- (1 << RLIMIT_LOCKS) |
- (1 << RLIMIT_AS) |
- (1 << VLIMIT_ANON) |
- 0
- };
-
- if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RESOURCE))
- return -EPERM;
- if (copy_to_user(data, &mask, sizeof(mask)))
+ if (copy_to_user(data, &vlimit_mask, sizeof(vlimit_mask)))
+ return -EFAULT;
+ return 0;
+}
+
+
+static inline void vx_reset_minmax(struct _vx_limit *limit)
+{
+ rlim_t value;
+ int lim;
+
+ for (lim=0; lim<NUM_LIMITS; lim++) {
+ value = __rlim_get(limit, lim);
+ __rlim_rmax(limit, lim) = value;
+ __rlim_rmin(limit, lim) = value;
+ }
+}
+
+
+int vc_reset_minmax(struct vx_info *vxi, void __user *data)
+{
+ vx_reset_minmax(&vxi->limit);
+ return 0;
+}
+
+
+int vc_rlimit_stat(struct vx_info *vxi, void __user *data)
+{
+ struct vcmd_rlimit_stat_v0 vc_data;
+ struct _vx_limit *limit = &vxi->limit;
+ int id;
+
+ if (copy_from_user (&vc_data, data, sizeof(vc_data)))
+ return -EFAULT;
+
+ id = vc_data.id;
+ 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);
+ vc_data.maximum = __rlim_rmax(limit, id);
+
+ if (copy_to_user (data, &vc_data, sizeof(vc_data)))