lkml.org 
[lkml]   [2020]   [May]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 1/4] ipv4: streamline ipmr_new_tunnel
    Date
    Reduce a few level of indentation to simplify the function.

    Signed-off-by: Christoph Hellwig <hch@lst.de>
    ---
    net/ipv4/ipmr.c | 73 ++++++++++++++++++++++++-------------------------
    1 file changed, 36 insertions(+), 37 deletions(-)

    diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c
    index 9cf83cc85e4ad..84541c601cfab 100644
    --- a/net/ipv4/ipmr.c
    +++ b/net/ipv4/ipmr.c
    @@ -469,50 +469,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;
    + mm_segment_t oldfs = get_fs();
    + struct net_device *tunnel_dev, *new_dev;
    + struct ip_tunnel_parm p = { };
    + 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;
    }

    --
    2.26.2
    \
     
     \ /
      Last update: 2020-05-14 16:52    [W:2.712 / U:0.420 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site