diff --git a/net/ethtool/netlink.c b/net/ethtool/netlink.c index 7d45f9a884e5..6cbd13b61bd1 100644 --- a/net/ethtool/netlink.c +++ b/net/ethtool/netlink.c @@ -526,13 +526,15 @@ static int ethnl_default_doit(struct sk_buff *skb, struct genl_info *info) goto err_free; ethnl_init_reply_data(reply_data, ops, req_info->dev); - rtnl_lock(); - if (req_info->dev) + if (req_info->dev) { + rtnl_lock(); netdev_lock_ops(req_info->dev); + } ret = ops->prepare_data(req_info, reply_data, info); - if (req_info->dev) + if (req_info->dev) { netdev_unlock_ops(req_info->dev); - rtnl_unlock(); + rtnl_unlock(); + } if (ret < 0) goto err_dev; ret = ops->reply_size(req_info, reply_data); diff --git a/net/ethtool/netlink.h b/net/ethtool/netlink.h index fd2198e45d2b..674c9c19529b 100644 --- a/net/ethtool/netlink.h +++ b/net/ethtool/netlink.h @@ -333,7 +333,9 @@ int ethnl_sock_priv_set(struct sk_buff *skb, struct net *net, u32 portid, * @hdr_attr: attribute type for request header * @req_info_size: size of request info * @reply_data_size: size of reply data - * @allow_nodev_do: allow non-dump request with no device identification + * @allow_nodev_do: + * Allow non-dump request with no device identification. + * Note that locks (rtnl_lock etc.) are only taken if device is set. * @set_ntf_cmd: notification to generate on changes (SET) * @parse_request: * Parse request except common header (struct ethnl_req_info). Common