@@ -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;
}
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.kicinski@netronome.com> --- net/core/ethtool.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-)