/* * linux/kernel/vserver/limit.c * * Virtual Server: Context Limits * * Copyright (C) 2004 Herbert Pötzl * * V0.01 broken out from vcontext V0.05 * */ #include //#include //#include //#include #include #include #include #include //#include //#include #include #include static int is_valid_rlimit(int id) { int valid = 0; switch (id) { case RLIMIT_NPROC: case RLIMIT_AS: case RLIMIT_RSS: valid = 1; break; } return valid; } int vc_get_rlimit(uint32_t id, void *data) { struct vx_info *vxi; struct vcmd_ctx_rlimit_v0 vc_data; if (!vx_check(0, VX_ADMIN)) return -ENOSYS; if (copy_from_user (&vc_data, data, sizeof(vc_data))) return -EFAULT; if (!is_valid_rlimit(vc_data.id)) return -ENOTSUPP; vxi = find_vx_info(id); if (!vxi) return -ESRCH; if (vc_data.maximum != CRLIM_KEEP) vc_data.maximum = vxi->limit.rlim[vc_data.id]; vc_data.minimum = CRLIM_UNSET; vc_data.softlimit = CRLIM_UNSET; put_vx_info(vxi); if (copy_to_user (data, &vc_data, sizeof(vc_data))) return -EFAULT; return 0; } int vc_set_rlimit(uint32_t id, void *data) { struct vx_info *vxi; struct vcmd_ctx_rlimit_v0 vc_data; if (!vx_check(0, VX_ADMIN)) return -ENOSYS; if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RESOURCE)) return -EPERM; if (copy_from_user (&vc_data, data, sizeof(vc_data))) return -EFAULT; if (!is_valid_rlimit(vc_data.id)) return -ENOTSUPP; vxi = find_vx_info(id); if (!vxi) return -ESRCH; if (vc_data.maximum != CRLIM_KEEP) vxi->limit.rlim[vc_data.id] = vc_data.maximum; printk("setting [%d] = %d\n", vc_data.id, (int)vc_data.maximum); put_vx_info(vxi); return 0; } int vc_get_rlimit_mask(uint32_t id, void *data) { static struct vcmd_ctx_rlimit_mask_v0 mask = { /* minimum */ 0 , /* softlimit */ 0 , /* maximum */ (1 << RLIMIT_NPROC) | (1 << RLIMIT_AS) | (1 << RLIMIT_RSS) }; if (!vx_check(0, VX_ADMIN)) return -ENOSYS; if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RESOURCE)) return -EPERM; if (copy_to_user(data, &mask, sizeof(mask))) return -EFAULT; return 0; }