diff --git a/mm/mempolicy.c b/mm/mempolicy.c index 155bb284dbf1b8c5f0b8e10b6ee2088d9abbb2d9..6b751565eed17172349a8e397782907f374b876c 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;