On 06/30/2017 03:50 PM, Sabrina Dubroca wrote:
> Commit a985343ba906 ("vxlan: refactor verification and application of
> configuration") modified vxlan device creation, and replaced the
> assignment of vxlan->net to src_net with dev_net(netdev) in ->setup().
> 
> But dev_net(netdev) is not the same as src_net. At the time ->setup()
> is called, dev_net hasn't been set yet, so we end up creating the
> socket for the vxlan device in init_net.
> 
> Fix this by bringing back the assignment of vxlan->net during device
> creation.
> 
> Fixes: a985343ba906 ("vxlan: refactor verification and application of 
> configuration")
> Signed-off-by: Sabrina Dubroca <s...@queasysnail.net>

Thanks for fixing this up, I really didn't expect dev_net() not to return
the correct net in setup().

Reviewed-by: Matthias Schiffer <mschif...@universe-factory.net>


> ---
>  drivers/net/vxlan.c | 9 ++++++---
>  1 file changed, 6 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c
> index fd0ff97e3d81..47d6e65851aa 100644
> --- a/drivers/net/vxlan.c
> +++ b/drivers/net/vxlan.c
> @@ -2656,7 +2656,6 @@ static void vxlan_setup(struct net_device *dev)
>       vxlan->age_timer.data = (unsigned long) vxlan;
>  
>       vxlan->dev = dev;
> -     vxlan->net = dev_net(dev);
>  
>       gro_cells_init(&vxlan->gro_cells, dev);
>  
> @@ -3028,7 +3027,9 @@ static int vxlan_config_validate(struct net *src_net, 
> struct vxlan_config *conf,
>  
>  static void vxlan_config_apply(struct net_device *dev,
>                              struct vxlan_config *conf,
> -                            struct net_device *lowerdev, bool changelink)
> +                            struct net_device *lowerdev,
> +                            struct net *src_net,
> +                            bool changelink)
>  {
>       struct vxlan_dev *vxlan = netdev_priv(dev);
>       struct vxlan_rdst *dst = &vxlan->default_dst;
> @@ -3044,6 +3045,8 @@ static void vxlan_config_apply(struct net_device *dev,
>  
>               if (conf->mtu)
>                       dev->mtu = conf->mtu;
> +
> +             vxlan->net = src_net;
>       }
>  
>       dst->remote_vni = conf->vni;
> @@ -3086,7 +3089,7 @@ static int vxlan_dev_configure(struct net *src_net, 
> struct net_device *dev,
>       if (ret)
>               return ret;
>  
> -     vxlan_config_apply(dev, conf, lowerdev, changelink);
> +     vxlan_config_apply(dev, conf, lowerdev, src_net, changelink);
>  
>       return 0;
>  }
> 


Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to