diff options
-rw-r--r-- | kernel/cpuset.c | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/kernel/cpuset.c b/kernel/cpuset.c index f513dd937eee..3ea63da11d71 100644 --- a/kernel/cpuset.c +++ b/kernel/cpuset.c @@ -799,18 +799,23 @@ static int update_nodemask(struct cpuset *cs, char *buf) trialcs = *cs; retval = nodelist_parse(buf, trialcs.mems_allowed); if (retval < 0) - return retval; + goto done; nodes_and(trialcs.mems_allowed, trialcs.mems_allowed, node_online_map); - if (nodes_empty(trialcs.mems_allowed)) - return -ENOSPC; - retval = validate_change(cs, &trialcs); - if (retval == 0) { - down(&callback_sem); - cs->mems_allowed = trialcs.mems_allowed; - atomic_inc(&cpuset_mems_generation); - cs->mems_generation = atomic_read(&cpuset_mems_generation); - up(&callback_sem); + if (nodes_empty(trialcs.mems_allowed)) { + retval = -ENOSPC; + goto done; } + retval = validate_change(cs, &trialcs); + if (retval < 0) + goto done; + + down(&callback_sem); + cs->mems_allowed = trialcs.mems_allowed; + atomic_inc(&cpuset_mems_generation); + cs->mems_generation = atomic_read(&cpuset_mems_generation); + up(&callback_sem); + +done: return retval; } |