OSDN Git Service

ipv4: streamline ipmr_new_tunnel
authorChristoph Hellwig <hch@lst.de>
Tue, 19 May 2020 13:03:11 +0000 (15:03 +0200)
committerDavid S. Miller <davem@davemloft.net>
Tue, 19 May 2020 22:45:11 +0000 (15:45 -0700)
Reduce a few level of indentation to simplify the function.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv4/ipmr.c

index 5c218db..a1169b6 100644 (file)
@@ -471,50 +471,49 @@ static bool ipmr_init_vif_indev(const struct net_device *dev)
 
 static struct net_device *ipmr_new_tunnel(struct net *net, struct vifctl *v)
 {
-       struct net_device  *dev;
+       struct net_device *tunnel_dev, *new_dev;
+       struct ip_tunnel_parm p = { };
+       mm_segment_t oldfs = get_fs();
+       struct ifreq ifr;
+       int err;
 
-       dev = __dev_get_by_name(net, "tunl0");
+       tunnel_dev = __dev_get_by_name(net, "tunl0");
+       if (!tunnel_dev)
+               goto out;
 
-       if (dev) {
-               const struct net_device_ops *ops = dev->netdev_ops;
-               int err;
-               struct ifreq ifr;
-               struct ip_tunnel_parm p;
+       p.iph.daddr = v->vifc_rmt_addr.s_addr;
+       p.iph.saddr = v->vifc_lcl_addr.s_addr;
+       p.iph.version = 4;
+       p.iph.ihl = 5;
+       p.iph.protocol = IPPROTO_IPIP;
+       sprintf(p.name, "dvmrp%d", v->vifc_vifi);
+       ifr.ifr_ifru.ifru_data = (__force void __user *)&p;
 
-               memset(&p, 0, sizeof(p));
-               p.iph.daddr = v->vifc_rmt_addr.s_addr;
-               p.iph.saddr = v->vifc_lcl_addr.s_addr;
-               p.iph.version = 4;
-               p.iph.ihl = 5;
-               p.iph.protocol = IPPROTO_IPIP;
-               sprintf(p.name, "dvmrp%d", v->vifc_vifi);
-               ifr.ifr_ifru.ifru_data = (__force void __user *)&p;
+       if (!tunnel_dev->netdev_ops->ndo_do_ioctl)
+               goto out;
 
-               if (ops->ndo_do_ioctl) {
-                       mm_segment_t oldfs = get_fs();
+       set_fs(KERNEL_DS);
+       err = tunnel_dev->netdev_ops->ndo_do_ioctl(tunnel_dev, &ifr,
+                       SIOCADDTUNNEL);
+       set_fs(oldfs);
+       if (err)
+               goto out;
 
-                       set_fs(KERNEL_DS);
-                       err = ops->ndo_do_ioctl(dev, &ifr, SIOCADDTUNNEL);
-                       set_fs(oldfs);
-               } else {
-                       err = -EOPNOTSUPP;
-               }
-               dev = NULL;
+       new_dev = __dev_get_by_name(net, p.name);
+       if (!new_dev)
+               goto out;
 
-               if (err == 0 &&
-                   (dev = __dev_get_by_name(net, p.name)) != NULL) {
-                       dev->flags |= IFF_MULTICAST;
-                       if (!ipmr_init_vif_indev(dev))
-                               goto failure;
-                       if (dev_open(dev, NULL))
-                               goto failure;
-                       dev_hold(dev);
-               }
-       }
-       return dev;
+       new_dev->flags |= IFF_MULTICAST;
+       if (!ipmr_init_vif_indev(new_dev))
+               goto out_unregister;
+       if (dev_open(new_dev, NULL))
+               goto out_unregister;
+       dev_hold(new_dev);
+       return new_dev;
 
-failure:
-       unregister_netdevice(dev);
+out_unregister:
+       unregister_netdevice(new_dev);
+out:
        return NULL;
 }