| 1 |
Index: linux-2.6.18/kernel/vserver/limit.c |
| 2 |
=================================================================== |
| 3 |
--- linux-2.6.18.orig/kernel/vserver/limit.c |
| 4 |
+++ linux-2.6.18/kernel/vserver/limit.c |
| 5 |
@@ -41,31 +41,53 @@ const char *vlimit_name[NUM_LIMITS] = { |
| 6 |
|
| 7 |
EXPORT_SYMBOL_GPL(vlimit_name); |
| 8 |
|
| 9 |
+#define MASK_ENTRY(x) (1 << (x)) |
| 10 |
|
| 11 |
-static int is_valid_rlimit(int id) |
| 12 |
-{ |
| 13 |
- int valid = 0; |
| 14 |
- |
| 15 |
- switch (id) { |
| 16 |
- case RLIMIT_RSS: |
| 17 |
- case RLIMIT_NPROC: |
| 18 |
- case RLIMIT_NOFILE: |
| 19 |
- case RLIMIT_MEMLOCK: |
| 20 |
- case RLIMIT_AS: |
| 21 |
- case RLIMIT_LOCKS: |
| 22 |
- case RLIMIT_MSGQUEUE: |
| 23 |
- |
| 24 |
- case VLIMIT_NSOCK: |
| 25 |
- case VLIMIT_OPENFD: |
| 26 |
- case VLIMIT_ANON: |
| 27 |
- case VLIMIT_SHMEM: |
| 28 |
- case VLIMIT_DENTRY: |
| 29 |
- valid = 1; |
| 30 |
- break; |
| 31 |
- } |
| 32 |
- return valid; |
| 33 |
+const struct vcmd_ctx_rlimit_mask_v0 vlimit_mask = { |
| 34 |
+ /* minimum */ |
| 35 |
+ 0 |
| 36 |
+ , /* softlimit */ |
| 37 |
+ MASK_ENTRY( RLIMIT_RSS ) | |
| 38 |
+ MASK_ENTRY( VLIMIT_ANON ) | |
| 39 |
+ 0 |
| 40 |
+ , /* maximum */ |
| 41 |
+ MASK_ENTRY( RLIMIT_RSS ) | |
| 42 |
+ MASK_ENTRY( RLIMIT_NPROC ) | |
| 43 |
+ MASK_ENTRY( RLIMIT_NOFILE ) | |
| 44 |
+ MASK_ENTRY( RLIMIT_MEMLOCK ) | |
| 45 |
+ MASK_ENTRY( RLIMIT_AS ) | |
| 46 |
+ MASK_ENTRY( RLIMIT_LOCKS ) | |
| 47 |
+ MASK_ENTRY( RLIMIT_MSGQUEUE ) | |
| 48 |
+ |
| 49 |
+ MASK_ENTRY( VLIMIT_NSOCK ) | |
| 50 |
+ MASK_ENTRY( VLIMIT_OPENFD ) | |
| 51 |
+ MASK_ENTRY( VLIMIT_ANON ) | |
| 52 |
+ MASK_ENTRY( VLIMIT_SHMEM ) | |
| 53 |
+ MASK_ENTRY( VLIMIT_DENTRY ) | |
| 54 |
+ 0 |
| 55 |
+}; |
| 56 |
+ /* accounting only */ |
| 57 |
+uint32_t account_mask = |
| 58 |
+ MASK_ENTRY( VLIMIT_SEMARY ) | |
| 59 |
+ MASK_ENTRY( VLIMIT_NSEMS ) | |
| 60 |
+ 0; |
| 61 |
+ |
| 62 |
+ |
| 63 |
+static int is_valid_vlimit(int id) |
| 64 |
+{ |
| 65 |
+ uint32_t mask = vlimit_mask.minimum | |
| 66 |
+ vlimit_mask.softlimit | vlimit_mask.maximum; |
| 67 |
+ return mask & (1 << id); |
| 68 |
+} |
| 69 |
+ |
| 70 |
+static int is_accounted_vlimit(int id) |
| 71 |
+{ |
| 72 |
+ if (is_valid_vlimit(id)) |
| 73 |
+ return 1; |
| 74 |
+ return account_mask & (1 << id); |
| 75 |
} |
| 76 |
|
| 77 |
+ |
| 78 |
static inline uint64_t vc_get_soft(struct vx_info *vxi, int id) |
| 79 |
{ |
| 80 |
rlim_t limit = __rlim_soft(&vxi->limit, id); |
| 81 |
@@ -81,7 +103,7 @@ static inline uint64_t vc_get_hard(struc |
| 82 |
static int do_get_rlimit(struct vx_info *vxi, uint32_t id, |
| 83 |
uint64_t *minimum, uint64_t *softlimit, uint64_t *maximum) |
| 84 |
{ |
| 85 |
- if (!is_valid_rlimit(id)) |
| 86 |
+ if (!is_valid_vlimit(id)) |
| 87 |
return -EINVAL; |
| 88 |
|
| 89 |
if (minimum) |
| 90 |
@@ -114,7 +136,7 @@ int vc_get_rlimit(struct vx_info *vxi, v |
| 91 |
static int do_set_rlimit(struct vx_info *vxi, uint32_t id, |
| 92 |
uint64_t minimum, uint64_t softlimit, uint64_t maximum) |
| 93 |
{ |
| 94 |
- if (!is_valid_rlimit(id)) |
| 95 |
+ if (!is_valid_vlimit(id)) |
| 96 |
return -EINVAL; |
| 97 |
|
| 98 |
if (maximum != CRLIM_KEEP) |
| 99 |
@@ -176,26 +198,7 @@ int vc_get_rlimit_x32(struct vx_info *vx |
| 100 |
|
| 101 |
int vc_get_rlimit_mask(uint32_t id, void __user *data) |
| 102 |
{ |
| 103 |
- static struct vcmd_ctx_rlimit_mask_v0 mask = { |
| 104 |
- /* minimum */ |
| 105 |
- 0 |
| 106 |
- , /* softlimit */ |
| 107 |
- (1 << RLIMIT_RSS) | |
| 108 |
- (1 << VLIMIT_ANON) | |
| 109 |
- 0 |
| 110 |
- , /* maximum */ |
| 111 |
- (1 << RLIMIT_RSS) | |
| 112 |
- (1 << RLIMIT_NPROC) | |
| 113 |
- (1 << RLIMIT_NOFILE) | |
| 114 |
- (1 << RLIMIT_MEMLOCK) | |
| 115 |
- (1 << RLIMIT_LOCKS) | |
| 116 |
- (1 << RLIMIT_AS) | |
| 117 |
- (1 << VLIMIT_ANON) | |
| 118 |
- (1 << VLIMIT_DENTRY) | |
| 119 |
- 0 |
| 120 |
- }; |
| 121 |
- |
| 122 |
- if (copy_to_user(data, &mask, sizeof(mask))) |
| 123 |
+ if (copy_to_user(data, &vlimit_mask, sizeof(vlimit_mask))) |
| 124 |
return -EFAULT; |
| 125 |
return 0; |
| 126 |
} |
| 127 |
@@ -231,7 +234,7 @@ int vc_rlimit_stat(struct vx_info *vxi, |
| 128 |
return -EFAULT; |
| 129 |
|
| 130 |
id = vc_data.id; |
| 131 |
- if (!is_valid_rlimit(id)) |
| 132 |
+ if (!is_accounted_vlimit(id)) |
| 133 |
return -EINVAL; |
| 134 |
|
| 135 |
vc_data.hits = atomic_read(&__rlim_lhit(limit, id)); |