When calling into devlink compat code make sure we have a reference on the netdevice on which the operation was invoked.
Signed-off-by: Jakub Kicinski <jakub.kicin...@netronome.com> --- net/core/ethtool.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/net/core/ethtool.c b/net/core/ethtool.c index 1320e8dce559..6832476dfcaf 100644 --- a/net/core/ethtool.c +++ b/net/core/ethtool.c @@ -805,11 +805,14 @@ static noinline_for_stack int ethtool_get_drvinfo(struct net_device *dev, if (ops->get_eeprom_len) info.eedump_len = ops->get_eeprom_len(dev); - rtnl_unlock(); - if (!info.fw_version[0]) + if (!info.fw_version[0]) { + dev_hold(dev); + rtnl_unlock(); devlink_compat_running_version(dev, info.fw_version, sizeof(info.fw_version)); - rtnl_lock(); + rtnl_lock(); + dev_put(dev); + } if (copy_to_user(useraddr, &info, sizeof(info))) return -EFAULT; @@ -2043,9 +2046,11 @@ static noinline_for_stack int ethtool_flash_device(struct net_device *dev, if (!dev->ethtool_ops->flash_device) { int ret; + dev_hold(dev); rtnl_unlock(); ret = devlink_compat_flash_update(dev, efl.data); rtnl_lock(); + dev_put(dev); return ret; } -- 2.19.2