On Thu, 2012-06-28 at 16:10 +0200, Jiri Pirko wrote:
> Introduce IFF_LIFE_ADDR_CHANGE priv_flag and use it to disable
> netif_running() check in eth_mac_addr()
> 
> Signed-off-by: Jiri Pirko <[email protected]>
> ---
>  include/linux/if.h |    2 ++
>  net/ethernet/eth.c |    2 +-
>  2 files changed, 3 insertions(+), 1 deletion(-)
> 
> diff --git a/include/linux/if.h b/include/linux/if.h
> index f995c66..fd9ee7c 100644
> --- a/include/linux/if.h
> +++ b/include/linux/if.h
> @@ -81,6 +81,8 @@
>  #define IFF_UNICAST_FLT      0x20000         /* Supports unicast filtering   
> */
>  #define IFF_TEAM_PORT        0x40000         /* device used as team port */
>  #define IFF_SUPP_NOFCS       0x80000         /* device supports sending 
> custom FCS */
> +#define IFF_LIFE_ADDR_CHANGE 0x100000        /* device supports hardware 
> address
> +                                      * change when it's running */
>  
> 
>  #define IF_GET_IFACE 0x0001          /* for querying only */
> diff --git a/net/ethernet/eth.c b/net/ethernet/eth.c
> index 36e5880..8f8ded4 100644
> --- a/net/ethernet/eth.c
> +++ b/net/ethernet/eth.c
> @@ -283,7 +283,7 @@ int eth_mac_addr(struct net_device *dev, void *p)
>  {
>       struct sockaddr *addr = p;
>  
> -     if (netif_running(dev))
> +     if (!(dev->priv_flags & IFF_LIFE_ADDR_CHANGE) && netif_running(dev))
>               return -EBUSY;
>       if (!is_valid_ether_addr(addr->sa_data))
>               return -EADDRNOTAVAIL;

Since the memcpy() is not atomic, there is a small window where a reader
could get a half-changed mac address. I guess its a detail.



_______________________________________________
Virtualization mailing list
[email protected]
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

Reply via email to