void rds_ib_remove_one(struct ib_device *device)
{
struct rds_ib_device *rds_ibdev;
+ int i;
rds_ibdev = ib_get_client_data(device, &rds_ib_client);
if (!rds_ibdev)
return;
- if (rds_ib_active_bonding_enabled)
+ if (rds_ib_active_bonding_enabled) {
+ for (i = 1; i <= ip_port_cnt; i++) {
+ if (ip_config[i].rds_ibdev == rds_ibdev)
+ ip_config[i].rds_ibdev = NULL;
+ }
ib_unregister_event_handler(&rds_ibdev->event_handler);
+ }
rds_ib_dev_shutdown(rds_ibdev);
NIPQUAD(addr), from_dev2, to_dev2);
rds_ibdev = ip_config[from_port].rds_ibdev;
+ if (!rds_ibdev)
+ goto out;
+
spin_lock_bh(&rds_ibdev->spinlock);
list_for_each_entry(ic, &rds_ibdev->conn_list, ib_node) {
if (ic->conn->c_laddr == addr) {
if (!port)
return NOTIFY_DONE;
+ if (ip_config[port].rds_ibdev == NULL)
+ return NOTIFY_DONE;
+
work = kzalloc(sizeof *work, GFP_ATOMIC);
if (!work) {
printk(KERN_ERR "RDS/IB: failed to allocate port work\n");