| /* | 
 |  * Copyright 2010 Tilera Corporation. All Rights Reserved. | 
 |  * | 
 |  *   This program is free software; you can redistribute it and/or | 
 |  *   modify it under the terms of the GNU General Public License | 
 |  *   as published by the Free Software Foundation, version 2. | 
 |  * | 
 |  *   This program is distributed in the hope that it will be useful, but | 
 |  *   WITHOUT ANY WARRANTY; without even the implied warranty of | 
 |  *   MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or | 
 |  *   NON INFRINGEMENT.  See the GNU General Public License for | 
 |  *   more details. | 
 |  */ | 
 |  | 
 | #include <linux/cpumask.h> | 
 | #include <linux/ctype.h> | 
 | #include <linux/errno.h> | 
 | #include <linux/smp.h> | 
 |  | 
 | /* | 
 |  * Allow cropping out bits beyond the end of the array. | 
 |  * Move to "lib" directory if more clients want to use this routine. | 
 |  */ | 
 | int bitmap_parselist_crop(const char *bp, unsigned long *maskp, int nmaskbits) | 
 | { | 
 | 	unsigned a, b; | 
 |  | 
 | 	bitmap_zero(maskp, nmaskbits); | 
 | 	do { | 
 | 		if (!isdigit(*bp)) | 
 | 			return -EINVAL; | 
 | 		a = simple_strtoul(bp, (char **)&bp, 10); | 
 | 		b = a; | 
 | 		if (*bp == '-') { | 
 | 			bp++; | 
 | 			if (!isdigit(*bp)) | 
 | 				return -EINVAL; | 
 | 			b = simple_strtoul(bp, (char **)&bp, 10); | 
 | 		} | 
 | 		if (!(a <= b)) | 
 | 			return -EINVAL; | 
 | 		if (b >= nmaskbits) | 
 | 			b = nmaskbits-1; | 
 | 		while (a <= b) { | 
 | 			set_bit(a, maskp); | 
 | 			a++; | 
 | 		} | 
 | 		if (*bp == ',') | 
 | 			bp++; | 
 | 	} while (*bp != '\0' && *bp != '\n'); | 
 | 	return 0; | 
 | } |