mempolicy: support mpol=local tmpfs mount option
[linux-2.6.git] / mm / mempolicy.c
index 155bb28..6b75156 100644 (file)
@@ -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;