aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mm/mempolicy.c25
1 files changed, 17 insertions, 8 deletions
diff --git a/mm/mempolicy.c b/mm/mempolicy.c
index 155bb284dbf..6b751565eed 100644
--- a/mm/mempolicy.c
+++ b/mm/mempolicy.c
@@ -1951,7 +1951,7 @@ void numa_default_policy(void)
/*
* "local" is pseudo-policy: MPOL_PREFERRED with MPOL_F_LOCAL flag
- * Used only for mpol_to_str()
+ * Used only for mpol_parse_str() and mpol_to_str()
*/
#define MPOL_LOCAL (MPOL_INTERLEAVE + 1)
static const char * const policy_types[] =
@@ -1990,21 +1990,16 @@ int mpol_parse_str(char *str, unsigned short *mode, unsigned short *mode_flags,
if (flags)
*flags++ = '\0'; /* terminate mode string */
- for (i = 0; i < MPOL_MAX; i++) {
+ for (i = 0; i <= MPOL_LOCAL; i++) {
if (!strcmp(str, policy_types[i])) {
*mode = i;
break;
}
}
- if (i == MPOL_MAX)
+ if (i > MPOL_LOCAL)
goto out;
switch (*mode) {
- case MPOL_DEFAULT:
- /* Don't allow a nodelist nor flags */
- if (!nodelist && !flags)
- err = 0;
- break;
case MPOL_PREFERRED:
/* Insist on a nodelist of one node only */
if (nodelist) {
@@ -2027,6 +2022,20 @@ int mpol_parse_str(char *str, unsigned short *mode, unsigned short *mode_flags,
if (!nodelist)
*policy_nodes = node_states[N_HIGH_MEMORY];
err = 0;
+ break;
+ default:
+ /*
+ * MPOL_DEFAULT or MPOL_LOCAL
+ * Don't allow a nodelist nor flags
+ */
+ if (!nodelist && !flags)
+ err = 0;
+ if (*mode == MPOL_DEFAULT)
+ goto out;
+ /* else MPOL_LOCAL */
+ *mode = MPOL_PREFERRED;
+ nodes_clear(*policy_nodes);
+ break;
}
*mode_flags = 0;