struct ip_tunnel *nt;
        struct net_device *dev;
        int t_hlen;
+       int mtu;
+       int err;
 
        BUG_ON(!itn->fb_tunnel_dev);
        dev = __ip_tunnel_create(net, itn->fb_tunnel_dev->rtnl_link_ops, parms);
        if (IS_ERR(dev))
                return ERR_CAST(dev);
 
-       dev->mtu = ip_tunnel_bind_dev(dev);
+       mtu = ip_tunnel_bind_dev(dev);
+       err = dev_set_mtu(dev, mtu);
+       if (err)
+               goto err_dev_set_mtu;
 
        nt = netdev_priv(dev);
        t_hlen = nt->hlen + sizeof(struct iphdr);
        dev->max_mtu = 0xFFF8 - dev->hard_header_len - t_hlen;
        ip_tunnel_add(itn, nt);
        return nt;
+
+err_dev_set_mtu:
+       unregister_netdevice(dev);
+       return ERR_PTR(err);
 }
 
 int ip_tunnel_rcv(struct ip_tunnel *tunnel, struct sk_buff *skb,
        nt->fwmark = fwmark;
        err = register_netdevice(dev);
        if (err)
-               goto out;
+               goto err_register_netdevice;
 
        if (dev->type == ARPHRD_ETHER && !tb[IFLA_ADDRESS])
                eth_hw_addr_random(dev);
 
        mtu = ip_tunnel_bind_dev(dev);
-       if (!tb[IFLA_MTU])
-               dev->mtu = mtu;
+       if (!tb[IFLA_MTU]) {
+               err = dev_set_mtu(dev, mtu);
+               if (err)
+                       goto err_dev_set_mtu;
+       }
 
        ip_tunnel_add(itn, nt);
-out:
+       return 0;
+
+err_dev_set_mtu:
+       unregister_netdevice(dev);
+err_register_netdevice:
        return err;
 }
 EXPORT_SYMBOL_GPL(ip_tunnel_newlink);