diff options
Diffstat (limited to 'drivers/net/bonding')
-rw-r--r-- | drivers/net/bonding/bond_sysfs.c | 133 |
1 files changed, 71 insertions, 62 deletions
diff --git a/drivers/net/bonding/bond_sysfs.c b/drivers/net/bonding/bond_sysfs.c index b60835f58650..2dfb4bf90087 100644 --- a/drivers/net/bonding/bond_sysfs.c +++ b/drivers/net/bonding/bond_sysfs.c | |||
@@ -1025,6 +1025,7 @@ static ssize_t bonding_store_primary(struct device *d, | |||
1025 | int i; | 1025 | int i; |
1026 | struct slave *slave; | 1026 | struct slave *slave; |
1027 | struct bonding *bond = to_bond(d); | 1027 | struct bonding *bond = to_bond(d); |
1028 | char ifname[IFNAMSIZ]; | ||
1028 | 1029 | ||
1029 | if (!rtnl_trylock()) | 1030 | if (!rtnl_trylock()) |
1030 | return restart_syscall(); | 1031 | return restart_syscall(); |
@@ -1035,32 +1036,33 @@ static ssize_t bonding_store_primary(struct device *d, | |||
1035 | if (!USES_PRIMARY(bond->params.mode)) { | 1036 | if (!USES_PRIMARY(bond->params.mode)) { |
1036 | pr_info("%s: Unable to set primary slave; %s is in mode %d\n", | 1037 | pr_info("%s: Unable to set primary slave; %s is in mode %d\n", |
1037 | bond->dev->name, bond->dev->name, bond->params.mode); | 1038 | bond->dev->name, bond->dev->name, bond->params.mode); |
1038 | } else { | 1039 | goto out; |
1039 | bond_for_each_slave(bond, slave, i) { | 1040 | } |
1040 | if (strnicmp | ||
1041 | (slave->dev->name, buf, | ||
1042 | strlen(slave->dev->name)) == 0) { | ||
1043 | pr_info("%s: Setting %s as primary slave.\n", | ||
1044 | bond->dev->name, slave->dev->name); | ||
1045 | bond->primary_slave = slave; | ||
1046 | strcpy(bond->params.primary, slave->dev->name); | ||
1047 | bond_select_active_slave(bond); | ||
1048 | goto out; | ||
1049 | } | ||
1050 | } | ||
1051 | 1041 | ||
1052 | /* if we got here, then we didn't match the name of any slave */ | 1042 | sscanf(buf, "%16s", ifname); /* IFNAMSIZ */ |
1053 | 1043 | ||
1054 | if (strlen(buf) == 0 || buf[0] == '\n') { | 1044 | /* check to see if we are clearing primary */ |
1055 | pr_info("%s: Setting primary slave to None.\n", | 1045 | if (!strlen(ifname) || buf[0] == '\n') { |
1056 | bond->dev->name); | 1046 | pr_info("%s: Setting primary slave to None.\n", |
1057 | bond->primary_slave = NULL; | 1047 | bond->dev->name); |
1058 | bond_select_active_slave(bond); | 1048 | bond->primary_slave = NULL; |
1059 | } else { | 1049 | bond_select_active_slave(bond); |
1060 | pr_info("%s: Unable to set %.*s as primary slave as it is not a slave.\n", | 1050 | goto out; |
1061 | bond->dev->name, (int)strlen(buf) - 1, buf); | 1051 | } |
1052 | |||
1053 | bond_for_each_slave(bond, slave, i) { | ||
1054 | if (strncmp(slave->dev->name, ifname, IFNAMSIZ) == 0) { | ||
1055 | pr_info("%s: Setting %s as primary slave.\n", | ||
1056 | bond->dev->name, slave->dev->name); | ||
1057 | bond->primary_slave = slave; | ||
1058 | strcpy(bond->params.primary, slave->dev->name); | ||
1059 | bond_select_active_slave(bond); | ||
1060 | goto out; | ||
1062 | } | 1061 | } |
1063 | } | 1062 | } |
1063 | |||
1064 | pr_info("%s: Unable to set %.*s as primary slave.\n", | ||
1065 | bond->dev->name, (int)strlen(buf) - 1, buf); | ||
1064 | out: | 1066 | out: |
1065 | write_unlock_bh(&bond->curr_slave_lock); | 1067 | write_unlock_bh(&bond->curr_slave_lock); |
1066 | read_unlock(&bond->lock); | 1068 | read_unlock(&bond->lock); |
@@ -1195,6 +1197,7 @@ static ssize_t bonding_store_active_slave(struct device *d, | |||
1195 | struct slave *old_active = NULL; | 1197 | struct slave *old_active = NULL; |
1196 | struct slave *new_active = NULL; | 1198 | struct slave *new_active = NULL; |
1197 | struct bonding *bond = to_bond(d); | 1199 | struct bonding *bond = to_bond(d); |
1200 | char ifname[IFNAMSIZ]; | ||
1198 | 1201 | ||
1199 | if (!rtnl_trylock()) | 1202 | if (!rtnl_trylock()) |
1200 | return restart_syscall(); | 1203 | return restart_syscall(); |
@@ -1203,56 +1206,62 @@ static ssize_t bonding_store_active_slave(struct device *d, | |||
1203 | read_lock(&bond->lock); | 1206 | read_lock(&bond->lock); |
1204 | write_lock_bh(&bond->curr_slave_lock); | 1207 | write_lock_bh(&bond->curr_slave_lock); |
1205 | 1208 | ||
1206 | if (!USES_PRIMARY(bond->params.mode)) | 1209 | if (!USES_PRIMARY(bond->params.mode)) { |
1207 | pr_info("%s: Unable to change active slave; %s is in mode %d\n", | 1210 | pr_info("%s: Unable to change active slave; %s is in mode %d\n", |
1208 | bond->dev->name, bond->dev->name, bond->params.mode); | 1211 | bond->dev->name, bond->dev->name, bond->params.mode); |
1209 | else { | 1212 | goto out; |
1210 | bond_for_each_slave(bond, slave, i) { | 1213 | } |
1211 | if (strnicmp | 1214 | |
1212 | (slave->dev->name, buf, | 1215 | sscanf(buf, "%16s", ifname); /* IFNAMSIZ */ |
1213 | strlen(slave->dev->name)) == 0) { | 1216 | |
1214 | old_active = bond->curr_active_slave; | 1217 | /* check to see if we are clearing active */ |
1215 | new_active = slave; | 1218 | if (!strlen(ifname) || buf[0] == '\n') { |
1216 | if (new_active == old_active) { | 1219 | pr_info("%s: Clearing current active slave.\n", |
1217 | /* do nothing */ | 1220 | bond->dev->name); |
1218 | pr_info("%s: %s is already the current active slave.\n", | 1221 | bond->curr_active_slave = NULL; |
1222 | bond_select_active_slave(bond); | ||
1223 | goto out; | ||
1224 | } | ||
1225 | |||
1226 | bond_for_each_slave(bond, slave, i) { | ||
1227 | if (strncmp(slave->dev->name, ifname, IFNAMSIZ) == 0) { | ||
1228 | old_active = bond->curr_active_slave; | ||
1229 | new_active = slave; | ||
1230 | if (new_active == old_active) { | ||
1231 | /* do nothing */ | ||
1232 | pr_info("%s: %s is already the current" | ||
1233 | " active slave.\n", | ||
1234 | bond->dev->name, | ||
1235 | slave->dev->name); | ||
1236 | goto out; | ||
1237 | } | ||
1238 | else { | ||
1239 | if ((new_active) && | ||
1240 | (old_active) && | ||
1241 | (new_active->link == BOND_LINK_UP) && | ||
1242 | IS_UP(new_active->dev)) { | ||
1243 | pr_info("%s: Setting %s as active" | ||
1244 | " slave.\n", | ||
1219 | bond->dev->name, | 1245 | bond->dev->name, |
1220 | slave->dev->name); | 1246 | slave->dev->name); |
1221 | goto out; | 1247 | bond_change_active_slave(bond, |
1248 | new_active); | ||
1222 | } | 1249 | } |
1223 | else { | 1250 | else { |
1224 | if ((new_active) && | 1251 | pr_info("%s: Could not set %s as" |
1225 | (old_active) && | 1252 | " active slave; either %s is" |
1226 | (new_active->link == BOND_LINK_UP) && | 1253 | " down or the link is down.\n", |
1227 | IS_UP(new_active->dev)) { | 1254 | bond->dev->name, |
1228 | pr_info("%s: Setting %s as active slave.\n", | 1255 | slave->dev->name, |
1229 | bond->dev->name, | 1256 | slave->dev->name); |
1230 | slave->dev->name); | ||
1231 | bond_change_active_slave(bond, new_active); | ||
1232 | } | ||
1233 | else { | ||
1234 | pr_info("%s: Could not set %s as active slave; either %s is down or the link is down.\n", | ||
1235 | bond->dev->name, | ||
1236 | slave->dev->name, | ||
1237 | slave->dev->name); | ||
1238 | } | ||
1239 | goto out; | ||
1240 | } | 1257 | } |
1258 | goto out; | ||
1241 | } | 1259 | } |
1242 | } | 1260 | } |
1243 | |||
1244 | /* if we got here, then we didn't match the name of any slave */ | ||
1245 | |||
1246 | if (strlen(buf) == 0 || buf[0] == '\n') { | ||
1247 | pr_info("%s: Setting active slave to None.\n", | ||
1248 | bond->dev->name); | ||
1249 | bond->primary_slave = NULL; | ||
1250 | bond_select_active_slave(bond); | ||
1251 | } else { | ||
1252 | pr_info("%s: Unable to set %.*s as active slave as it is not a slave.\n", | ||
1253 | bond->dev->name, (int)strlen(buf) - 1, buf); | ||
1254 | } | ||
1255 | } | 1261 | } |
1262 | |||
1263 | pr_info("%s: Unable to set %.*s as active slave.\n", | ||
1264 | bond->dev->name, (int)strlen(buf) - 1, buf); | ||
1256 | out: | 1265 | out: |
1257 | write_unlock_bh(&bond->curr_slave_lock); | 1266 | write_unlock_bh(&bond->curr_slave_lock); |
1258 | read_unlock(&bond->lock); | 1267 | read_unlock(&bond->lock); |