RDMA/i40iw: Fix a race condition
authorBart Van Assche <bart.vanassche@wdc.com>
Wed, 11 Oct 2017 17:49:02 +0000 (10:49 -0700)
committerDoug Ledford <dledford@redhat.com>
Sun, 15 Oct 2017 00:47:06 +0000 (20:47 -0400)
Use the proper primitives to dereference the RCU pointer
upper_dev->ip_ptr. Compile-tested only.

Signed-off-by: Bart Van Assche <bart.vanassche@wdc.com>
Reviewed-by: Shiraz Saleem <shiraz.saleem@intel.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/infiniband/hw/i40iw/i40iw_utils.c

index e52dbbb4165ec555d94eb5f55f5310c71562b387..7304189b62ef893d24c4e3a65a1d8a280d26bdb9 100644 (file)
@@ -168,11 +168,16 @@ int i40iw_inetaddr_event(struct notifier_block *notifier,
        if (netdev != event_netdev)
                return NOTIFY_DONE;
 
-       if (upper_dev)
-               local_ipaddr = ntohl(
-                       ((struct in_device *)upper_dev->ip_ptr)->ifa_list->ifa_address);
-       else
+       if (upper_dev) {
+               struct in_device *in;
+
+               rcu_read_lock();
+               in = __in_dev_get_rcu(upper_dev);
+               local_ipaddr = ntohl(in->ifa_list->ifa_address);
+               rcu_read_unlock();
+       } else {
                local_ipaddr = ntohl(ifa->ifa_address);
+       }
        switch (event) {
        case NETDEV_DOWN:
                action = I40IW_ARP_DELETE;