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

Reply via email to