|
@@ -108,10 +108,18 @@ static int masq_inet_event(struct notifier_block *this,
|
|
|
unsigned long event,
|
|
|
void *ptr)
|
|
|
{
|
|
|
- struct net_device *dev = ((struct in_ifaddr *)ptr)->ifa_dev->dev;
|
|
|
+ struct in_device *idev = ((struct in_ifaddr *)ptr)->ifa_dev;
|
|
|
struct netdev_notifier_info info;
|
|
|
|
|
|
- netdev_notifier_info_init(&info, dev);
|
|
|
+ /* The masq_dev_notifier will catch the case of the device going
|
|
|
+ * down. So if the inetdev is dead and being destroyed we have
|
|
|
+ * no work to do. Otherwise this is an individual address removal
|
|
|
+ * and we have to perform the flush.
|
|
|
+ */
|
|
|
+ if (idev->dead)
|
|
|
+ return NOTIFY_DONE;
|
|
|
+
|
|
|
+ netdev_notifier_info_init(&info, idev->dev);
|
|
|
return masq_device_event(this, event, &info);
|
|
|
}
|
|
|
|