@@ -574,15 +574,28 @@ static int netdev_trig_notify(struct notifier_block *nb,
container_of(nb, struct led_netdev_data, notifier);
struct led_classdev *led_cdev = trigger_data->led_cdev;
- if (evt != NETDEV_UP && evt != NETDEV_DOWN && evt != NETDEV_CHANGE
- && evt != NETDEV_REGISTER && evt != NETDEV_UNREGISTER
- && evt != NETDEV_CHANGENAME)
- return NOTIFY_DONE;
-
- if (!(dev == trigger_data->net_dev ||
- (evt == NETDEV_CHANGENAME && !strcmp(dev->name, trigger_data->device_name)) ||
- (evt == NETDEV_REGISTER && !strcmp(dev->name, trigger_data->device_name))))
+ switch (evt) {
+ case NETDEV_REGISTER:
+ if (trigger_data->net_dev ||
+ strcmp(dev->name, trigger_data->device_name))
+ return NOTIFY_DONE;
+ break;
+ case NETDEV_CHANGENAME:
+ if (trigger_data->net_dev != dev &&
+ (trigger_data->net_dev ||
+ strcmp(dev->name, trigger_data->device_name)))
+ return NOTIFY_DONE;
+ break;
+ case NETDEV_UNREGISTER:
+ case NETDEV_UP:
+ case NETDEV_DOWN:
+ case NETDEV_CHANGE:
+ if (trigger_data->net_dev != dev)
+ return NOTIFY_DONE;
+ break;
+ default:
return NOTIFY_DONE;
+ }
cancel_delayed_work_sync(&trigger_data->work);
If there are network devices with the same name in different namespaces, ledtrig-netdev gets confused easily and switches between these devices whenever there are NETDEV_CHANGENAME/NETDEV_REGISTER notifications. This happens since ledtrig-netdev only checks for device name equality regardless of previous associations with another network device with the same name. Real world example: eth0 is the primary physical network interface and ledltrig-netdev is associated with that interface. If now Docker creates a virtual Ethernet interface (vethXXXX), moves it to the container's net namespace and renames it to eth0, ledtrig-netdev switches to this device and the LED no longer blinks for the original (physical) network device. Fix this by refactoring the conditions under which to return early with NOTIFY_DONE inside netdev_trig_notify(): - For processing NETDEV_REGISTER events, the device name has to match and no association with a net_dev must exist. - For processing NETDEV_CHANGENAME events, the associated and notified network device have to match. Alternatively the device name has to match and no association with a net_dev must exist. - For all other events, the associated and notified network device have to match. Signed-off-by: Tobias Junghans <tobias.junghans@inhub.de> --- drivers/leds/trigger/ledtrig-netdev.c | 29 +++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-)