IB/mlx4: Avoid null pointer dereference in mlx4_ib_scan_netdevs()
When Ethernet netdev is not present for a port (e.g. when the link
layer type of the port is InfiniBand) it's possible to dereference a
null pointer when we do netdevice scanning.
To fix that, we move a section of code that needs to run only when
netdev is present to a proper if () statement.
Fixes: ad4885d279
("IB/mlx4: Build the port IBoE GID table properly under bonding")
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Moni Shoua <monis@mellanox.com>
Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com>
Signed-off-by: Roland Dreier <roland@purestorage.com>
This commit is contained in:
parent
4ff0acca73
commit
e381835cf1
|
@ -1789,32 +1789,35 @@ static void mlx4_ib_scan_netdevs(struct mlx4_ib_dev *ibdev,
|
||||||
port_state = (netif_running(curr_netdev) && netif_carrier_ok(curr_netdev)) ?
|
port_state = (netif_running(curr_netdev) && netif_carrier_ok(curr_netdev)) ?
|
||||||
IB_PORT_ACTIVE : IB_PORT_DOWN;
|
IB_PORT_ACTIVE : IB_PORT_DOWN;
|
||||||
mlx4_ib_set_default_gid(ibdev, curr_netdev, port);
|
mlx4_ib_set_default_gid(ibdev, curr_netdev, port);
|
||||||
|
/* if using bonding/team and a slave port is down, we
|
||||||
|
* don't the bond IP based gids in the table since
|
||||||
|
* flows that select port by gid may get the down port.
|
||||||
|
*/
|
||||||
|
if (curr_master && (port_state == IB_PORT_DOWN)) {
|
||||||
|
reset_gid_table(ibdev, port);
|
||||||
|
mlx4_ib_set_default_gid(ibdev,
|
||||||
|
curr_netdev, port);
|
||||||
|
}
|
||||||
|
/* if bonding is used it is possible that we add it to
|
||||||
|
* masters only after IP address is assigned to the
|
||||||
|
* net bonding interface.
|
||||||
|
*/
|
||||||
|
if (curr_master && (old_master != curr_master)) {
|
||||||
|
reset_gid_table(ibdev, port);
|
||||||
|
mlx4_ib_set_default_gid(ibdev,
|
||||||
|
curr_netdev, port);
|
||||||
|
mlx4_ib_get_dev_addr(curr_master, ibdev, port);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!curr_master && (old_master != curr_master)) {
|
||||||
|
reset_gid_table(ibdev, port);
|
||||||
|
mlx4_ib_set_default_gid(ibdev,
|
||||||
|
curr_netdev, port);
|
||||||
|
mlx4_ib_get_dev_addr(curr_netdev, ibdev, port);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
reset_gid_table(ibdev, port);
|
reset_gid_table(ibdev, port);
|
||||||
}
|
}
|
||||||
/* if using bonding/team and a slave port is down, we don't the bond IP
|
|
||||||
* based gids in the table since flows that select port by gid may get
|
|
||||||
* the down port.
|
|
||||||
*/
|
|
||||||
if (curr_master && (port_state == IB_PORT_DOWN)) {
|
|
||||||
reset_gid_table(ibdev, port);
|
|
||||||
mlx4_ib_set_default_gid(ibdev, curr_netdev, port);
|
|
||||||
}
|
|
||||||
/* if bonding is used it is possible that we add it to masters
|
|
||||||
* only after IP address is assigned to the net bonding
|
|
||||||
* interface.
|
|
||||||
*/
|
|
||||||
if (curr_master && (old_master != curr_master)) {
|
|
||||||
reset_gid_table(ibdev, port);
|
|
||||||
mlx4_ib_set_default_gid(ibdev, curr_netdev, port);
|
|
||||||
mlx4_ib_get_dev_addr(curr_master, ibdev, port);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!curr_master && (old_master != curr_master)) {
|
|
||||||
reset_gid_table(ibdev, port);
|
|
||||||
mlx4_ib_set_default_gid(ibdev, curr_netdev, port);
|
|
||||||
mlx4_ib_get_dev_addr(curr_netdev, ibdev, port);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
spin_unlock(&iboe->lock);
|
spin_unlock(&iboe->lock);
|
||||||
|
|
Loading…
Reference in New Issue