diff options
author | Paolo Abeni <pabeni@redhat.com> | 2025-03-19 18:52:02 +0100 |
---|---|---|
committer | Paolo Abeni <pabeni@redhat.com> | 2025-03-19 18:52:03 +0100 |
commit | 05b815fc500be8c625f8eae86e58d32b468d53e7 (patch) | |
tree | decb418263cf909476a8c5d33166e8477e58affb /net/core/dev_api.c | |
parent | 756f88ff9c6ae3d059180813102610c39ea99c27 (diff) | |
parent | 6dd132516f8e467f144f7871ff2708ce827417a1 (diff) |
Merge branch 'net-bring-back-dev_addr_sem'
Stanislav Fomichev says:
====================
net: bring back dev_addr_sem
Kohei reports an issue with dev_addr_sem conversion to netdev instance
lock in [0]. Based on the discussion, switching to netdev instance
lock to protect the address might not work for the devices that
are not using netdev ops lock.
Bring dev_addr_sem instance lock back but fix the ordering.
0: https://lore.kernel.org/netdev/20250308203835.60633-2-enjuk@amazon.com
====================
Link: https://patch.msgid.link/20250312190513.1252045-1-sdf@fomichev.me
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Diffstat (limited to 'net/core/dev_api.c')
-rw-r--r-- | net/core/dev_api.c | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/net/core/dev_api.c b/net/core/dev_api.c index 1f0e24849bc6..8dbc60612100 100644 --- a/net/core/dev_api.c +++ b/net/core/dev_api.c @@ -84,6 +84,21 @@ void dev_set_group(struct net_device *dev, int new_group) netdev_unlock_ops(dev); } +int dev_set_mac_address_user(struct net_device *dev, struct sockaddr *sa, + struct netlink_ext_ack *extack) +{ + int ret; + + down_write(&dev_addr_sem); + netdev_lock_ops(dev); + ret = netif_set_mac_address(dev, sa, extack); + netdev_unlock_ops(dev); + up_write(&dev_addr_sem); + + return ret; +} +EXPORT_SYMBOL(dev_set_mac_address_user); + /** * dev_change_net_namespace() - move device to different nethost namespace * @dev: device @@ -299,9 +314,9 @@ int dev_set_mac_address(struct net_device *dev, struct sockaddr *sa, { int ret; - netdev_lock(dev); + netdev_lock_ops(dev); ret = netif_set_mac_address(dev, sa, extack); - netdev_unlock(dev); + netdev_unlock_ops(dev); return ret; } |