|
@@ -178,11 +178,16 @@ static int nes_inetaddr_event(struct notifier_block *notifier,
|
|
|
/* fall through */
|
|
|
case NETDEV_CHANGEADDR:
|
|
|
/* Add the address to the IP table */
|
|
|
- if (upper_dev)
|
|
|
- nesvnic->local_ipaddr =
|
|
|
- ((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);
|
|
|
+ nesvnic->local_ipaddr = in->ifa_list->ifa_address;
|
|
|
+ rcu_read_unlock();
|
|
|
+ } else {
|
|
|
nesvnic->local_ipaddr = ifa->ifa_address;
|
|
|
+ }
|
|
|
|
|
|
nes_write_indexed(nesdev,
|
|
|
NES_IDX_DST_IP_ADDR+(0x10*PCI_FUNC(nesdev->pcidev->devfn)),
|