diff options
Diffstat (limited to 'mm/mempolicy.c')
| -rw-r--r-- | mm/mempolicy.c | 51 | 
1 files changed, 32 insertions, 19 deletions
diff --git a/mm/mempolicy.c b/mm/mempolicy.c index 643f66e1018..08f40a2f3fe 100644 --- a/mm/mempolicy.c +++ b/mm/mempolicy.c @@ -73,7 +73,6 @@  #include <linux/sched.h>  #include <linux/nodemask.h>  #include <linux/cpuset.h> -#include <linux/gfp.h>  #include <linux/slab.h>  #include <linux/string.h>  #include <linux/module.h> @@ -806,9 +805,13 @@ static long do_get_mempolicy(int *policy, nodemask_t *nmask,  	err = 0;  	if (nmask) { -		task_lock(current); -		get_policy_nodemask(pol, nmask); -		task_unlock(current); +		if (mpol_store_user_nodemask(pol)) { +			*nmask = pol->w.user_nodemask; +		} else { +			task_lock(current); +			get_policy_nodemask(pol, nmask); +			task_unlock(current); +		}  	}   out: @@ -2195,8 +2198,8 @@ int mpol_parse_str(char *str, struct mempolicy **mpol, int no_context)  			char *rest = nodelist;  			while (isdigit(*rest))  				rest++; -			if (!*rest) -				err = 0; +			if (*rest) +				goto out;  		}  		break;  	case MPOL_INTERLEAVE: @@ -2205,7 +2208,6 @@ int mpol_parse_str(char *str, struct mempolicy **mpol, int no_context)  		 */  		if (!nodelist)  			nodes = node_states[N_HIGH_MEMORY]; -		err = 0;  		break;  	case MPOL_LOCAL:  		/* @@ -2215,11 +2217,19 @@ int mpol_parse_str(char *str, struct mempolicy **mpol, int no_context)  			goto out;  		mode = MPOL_PREFERRED;  		break; - -	/* -	 * case MPOL_BIND:    mpol_new() enforces non-empty nodemask. -	 * case MPOL_DEFAULT: mpol_new() enforces empty nodemask, ignores flags. -	 */ +	case MPOL_DEFAULT: +		/* +		 * Insist on a empty nodelist +		 */ +		if (!nodelist) +			err = 0; +		goto out; +	case MPOL_BIND: +		/* +		 * Insist on a nodelist +		 */ +		if (!nodelist) +			goto out;  	}  	mode_flags = 0; @@ -2233,13 +2243,14 @@ int mpol_parse_str(char *str, struct mempolicy **mpol, int no_context)  		else if (!strcmp(flags, "relative"))  			mode_flags |= MPOL_F_RELATIVE_NODES;  		else -			err = 1; +			goto out;  	}  	new = mpol_new(mode, mode_flags, &nodes);  	if (IS_ERR(new)) -		err = 1; -	else { +		goto out; + +	{  		int ret;  		NODEMASK_SCRATCH(scratch);  		if (scratch) { @@ -2250,13 +2261,15 @@ int mpol_parse_str(char *str, struct mempolicy **mpol, int no_context)  			ret = -ENOMEM;  		NODEMASK_SCRATCH_FREE(scratch);  		if (ret) { -			err = 1;  			mpol_put(new); -		} else if (no_context) { -			/* save for contextualization */ -			new->w.user_nodemask = nodes; +			goto out;  		}  	} +	err = 0; +	if (no_context) { +		/* save for contextualization */ +		new->w.user_nodemask = nodes; +	}  out:  	/* Restore string for error message */  |