Eric Dumazet says that my previous fix for an ERR_PTR dereference
(
ea857f28ab 'ipip: dereferencing an ERR_PTR in ip_tunnel_init_net()')
could be racy and suggests the following fix instead.
Reported-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
 
 
        rtnl_lock();
        itn->fb_tunnel_dev = __ip_tunnel_create(net, ops, &parms);
-       rtnl_unlock();
-
-       if (IS_ERR(itn->fb_tunnel_dev))
-               return PTR_ERR(itn->fb_tunnel_dev);
        /* FB netdevice is special: we have one, and only one per netns.
         * Allowing to move it to another netns is clearly unsafe.
         */
-       itn->fb_tunnel_dev->features |= NETIF_F_NETNS_LOCAL;
+       if (!IS_ERR(itn->fb_tunnel_dev))
+               itn->fb_tunnel_dev->features |= NETIF_F_NETNS_LOCAL;
+       rtnl_unlock();
 
-       return 0;
+       return PTR_RET(itn->fb_tunnel_dev);
 }
 EXPORT_SYMBOL_GPL(ip_tunnel_init_net);