bonding: Fix up parameter parsing
A recent change to add an additional hash policy modified bond_parse_parm, but it now does not correctly match parameters passed in via sysfs. Rewrote bond_parse_parm to handle (a) parameter matches that are substrings of one another and (b) user input with whitespace (e.g., sysfs input often has a trailing newline). Signed-off-by: Jay Vosburgh <fubar@us.ibm.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
This commit is contained in:
committed by
Jeff Garzik
parent
3b96c858fc
commit
ece95f7fef
@@ -4540,18 +4540,27 @@ static void bond_free_all(void)
|
||||
|
||||
/*
|
||||
* Convert string input module parms. Accept either the
|
||||
* number of the mode or its string name.
|
||||
* number of the mode or its string name. A bit complicated because
|
||||
* some mode names are substrings of other names, and calls from sysfs
|
||||
* may have whitespace in the name (trailing newlines, for example).
|
||||
*/
|
||||
int bond_parse_parm(char *mode_arg, struct bond_parm_tbl *tbl)
|
||||
int bond_parse_parm(const char *buf, struct bond_parm_tbl *tbl)
|
||||
{
|
||||
int i;
|
||||
int mode = -1, i, rv;
|
||||
char modestr[BOND_MAX_MODENAME_LEN + 1] = { 0, };
|
||||
|
||||
rv = sscanf(buf, "%d", &mode);
|
||||
if (!rv) {
|
||||
rv = sscanf(buf, "%20s", modestr);
|
||||
if (!rv)
|
||||
return -1;
|
||||
}
|
||||
|
||||
for (i = 0; tbl[i].modename; i++) {
|
||||
if ((isdigit(*mode_arg) &&
|
||||
tbl[i].mode == simple_strtol(mode_arg, NULL, 0)) ||
|
||||
(strcmp(mode_arg, tbl[i].modename) == 0)) {
|
||||
if (mode == tbl[i].mode)
|
||||
return tbl[i].mode;
|
||||
if (strcmp(modestr, tbl[i].modename) == 0)
|
||||
return tbl[i].mode;
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
|
Reference in New Issue
Block a user