diff options
| author | Lai Jiangshan <laijs@cn.fujitsu.com> | 2008-06-06 01:46:32 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-06-06 14:29:11 -0400 |
| commit | 37340746a66e5e7feed5945f28cb75d90a8fd9f6 (patch) | |
| tree | b056132aad9eab38886b7359797302cbeeabc3fa /kernel | |
| parent | aae8679b0ebcaa92f99c1c3cb0cd651594a43915 (diff) | |
cpusets: fix bug when adding nonexistent cpu or mem
Adding a nonexistent cpu to a cpuset will be omitted quietly. It should
return -EINVAL.
Example: (real_nr_cpus <= 4 < NR_CPUS or cpu#4 was just offline)
# cat cpus
0-1
# /bin/echo 4 > cpus
# /bin/echo $?
0
# cat cpus
#
The same occurs when add a nonexistent mem.
This patch will fix this bug.
And when *buf == "", the check is unneeded.
Signed-off-by: Lai Jiangshan <laijs@cn.fujitsu.com>
Acked-by: Paul Jackson <pj@sgi.com>
Cc: David Rientjes <rientjes@google.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/cpuset.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/kernel/cpuset.c b/kernel/cpuset.c index 86ea9e34e326..039baa4cd90c 100644 --- a/kernel/cpuset.c +++ b/kernel/cpuset.c | |||
| @@ -797,8 +797,10 @@ static int update_cpumask(struct cpuset *cs, char *buf) | |||
| 797 | retval = cpulist_parse(buf, trialcs.cpus_allowed); | 797 | retval = cpulist_parse(buf, trialcs.cpus_allowed); |
| 798 | if (retval < 0) | 798 | if (retval < 0) |
| 799 | return retval; | 799 | return retval; |
| 800 | |||
| 801 | if (!cpus_subset(trialcs.cpus_allowed, cpu_online_map)) | ||
| 802 | return -EINVAL; | ||
| 800 | } | 803 | } |
| 801 | cpus_and(trialcs.cpus_allowed, trialcs.cpus_allowed, cpu_online_map); | ||
| 802 | retval = validate_change(cs, &trialcs); | 804 | retval = validate_change(cs, &trialcs); |
| 803 | if (retval < 0) | 805 | if (retval < 0) |
| 804 | return retval; | 806 | return retval; |
| @@ -932,9 +934,11 @@ static int update_nodemask(struct cpuset *cs, char *buf) | |||
| 932 | retval = nodelist_parse(buf, trialcs.mems_allowed); | 934 | retval = nodelist_parse(buf, trialcs.mems_allowed); |
| 933 | if (retval < 0) | 935 | if (retval < 0) |
| 934 | goto done; | 936 | goto done; |
| 937 | |||
| 938 | if (!nodes_subset(trialcs.mems_allowed, | ||
| 939 | node_states[N_HIGH_MEMORY])) | ||
| 940 | return -EINVAL; | ||
| 935 | } | 941 | } |
| 936 | nodes_and(trialcs.mems_allowed, trialcs.mems_allowed, | ||
| 937 | node_states[N_HIGH_MEMORY]); | ||
| 938 | oldmem = cs->mems_allowed; | 942 | oldmem = cs->mems_allowed; |
| 939 | if (nodes_equal(oldmem, trialcs.mems_allowed)) { | 943 | if (nodes_equal(oldmem, trialcs.mems_allowed)) { |
| 940 | retval = 0; /* Too easy - nothing to do */ | 944 | retval = 0; /* Too easy - nothing to do */ |
