forked from Openwrt/openwrt
2253645411
Move LEDs netdev trigger patch from pending to backport as it has been merged upstream. Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
56 lines
2.2 KiB
Diff
56 lines
2.2 KiB
Diff
From 12ce20e02e532f101b725d71c52a36c5cc8ad1e6 Mon Sep 17 00:00:00 2001
|
|
From: Christian Marangi <ansuelsmth@gmail.com>
|
|
Date: Sun, 4 Feb 2024 00:54:01 +0100
|
|
Subject: [PATCH] leds: trigger: netdev: Fix kernel panic on interface rename
|
|
trig notify
|
|
|
|
Commit d5e01266e7f5 ("leds: trigger: netdev: add additional specific link
|
|
speed mode") in the various changes, reworked the way to set the LINKUP
|
|
mode in commit cee4bd16c319 ("leds: trigger: netdev: Recheck
|
|
NETDEV_LED_MODE_LINKUP on dev rename") and moved it to a generic function.
|
|
|
|
This changed the logic where, in the previous implementation the dev
|
|
from the trigger event was used to check if the carrier was ok, but in
|
|
the new implementation with the generic function, the dev in
|
|
trigger_data is used instead.
|
|
|
|
This is problematic and cause a possible kernel panic due to the fact
|
|
that the dev in the trigger_data still reference the old one as the
|
|
new one (passed from the trigger event) still has to be hold and saved
|
|
in the trigger_data struct (done in the NETDEV_REGISTER case).
|
|
|
|
On calling of get_device_state(), an invalid net_dev is used and this
|
|
cause a kernel panic.
|
|
|
|
To handle this correctly, move the call to get_device_state() after the
|
|
new net_dev is correctly set in trigger_data (in the NETDEV_REGISTER
|
|
case) and correctly parse the new dev.
|
|
|
|
Fixes: d5e01266e7f5 ("leds: trigger: netdev: add additional specific link speed mode")
|
|
Cc: stable@vger.kernel.org
|
|
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
|
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
|
|
Link: https://lore.kernel.org/r/20240203235413.1146-1-ansuelsmth@gmail.com
|
|
Signed-off-by: Lee Jones <lee@kernel.org>
|
|
---
|
|
drivers/leds/trigger/ledtrig-netdev.c | 4 ++--
|
|
1 file changed, 2 insertions(+), 2 deletions(-)
|
|
|
|
--- a/drivers/leds/trigger/ledtrig-netdev.c
|
|
+++ b/drivers/leds/trigger/ledtrig-netdev.c
|
|
@@ -489,12 +489,12 @@ static int netdev_trig_notify(struct not
|
|
trigger_data->duplex = DUPLEX_UNKNOWN;
|
|
switch (evt) {
|
|
case NETDEV_CHANGENAME:
|
|
- get_device_state(trigger_data);
|
|
- fallthrough;
|
|
case NETDEV_REGISTER:
|
|
dev_put(trigger_data->net_dev);
|
|
dev_hold(dev);
|
|
trigger_data->net_dev = dev;
|
|
+ if (evt == NETDEV_CHANGENAME)
|
|
+ get_device_state(trigger_data);
|
|
break;
|
|
case NETDEV_UNREGISTER:
|
|
dev_put(trigger_data->net_dev);
|