Merge tag 'perf-tools-for-v5.15-2021-09-11' of git://git.kernel.org/pub/scm/linux...
[linux-2.6-microblaze.git] / net / ipv6 / sit.c
index df5bea8..ef0c7a7 100644 (file)
@@ -299,9 +299,8 @@ __ipip6_tunnel_locate_prl(struct ip_tunnel *t, __be32 addr)
 
 }
 
-static int ipip6_tunnel_get_prl(struct net_device *dev, struct ifreq *ifr)
+static int ipip6_tunnel_get_prl(struct net_device *dev, struct ip_tunnel_prl __user *a)
 {
-       struct ip_tunnel_prl __user *a = ifr->ifr_ifru.ifru_data;
        struct ip_tunnel *t = netdev_priv(dev);
        struct ip_tunnel_prl kprl, *kp;
        struct ip_tunnel_prl_entry *prl;
@@ -321,7 +320,7 @@ static int ipip6_tunnel_get_prl(struct net_device *dev, struct ifreq *ifr)
         * we try harder to allocate.
         */
        kp = (cmax <= 1 || capable(CAP_NET_ADMIN)) ?
-               kcalloc(cmax, sizeof(*kp), GFP_KERNEL | __GFP_NOWARN) :
+               kcalloc(cmax, sizeof(*kp), GFP_KERNEL_ACCOUNT | __GFP_NOWARN) :
                NULL;
 
        rcu_read_lock();
@@ -334,7 +333,8 @@ static int ipip6_tunnel_get_prl(struct net_device *dev, struct ifreq *ifr)
                 * For root users, retry allocating enough memory for
                 * the answer.
                 */
-               kp = kcalloc(ca, sizeof(*kp), GFP_ATOMIC);
+               kp = kcalloc(ca, sizeof(*kp), GFP_ATOMIC | __GFP_ACCOUNT |
+                                             __GFP_NOWARN);
                if (!kp) {
                        ret = -ENOMEM;
                        goto out;
@@ -453,8 +453,8 @@ out:
        return err;
 }
 
-static int ipip6_tunnel_prl_ctl(struct net_device *dev, struct ifreq *ifr,
-               int cmd)
+static int ipip6_tunnel_prl_ctl(struct net_device *dev,
+                               struct ip_tunnel_prl __user *data, int cmd)
 {
        struct ip_tunnel *t = netdev_priv(dev);
        struct ip_tunnel_prl prl;
@@ -465,7 +465,7 @@ static int ipip6_tunnel_prl_ctl(struct net_device *dev, struct ifreq *ifr,
        if (dev == dev_to_sit_net(dev)->fb_tunnel_dev)
                return -EINVAL;
 
-       if (copy_from_user(&prl, ifr->ifr_ifru.ifru_data, sizeof(prl)))
+       if (copy_from_user(&prl, data, sizeof(prl)))
                return -EFAULT;
 
        switch (cmd) {
@@ -1197,14 +1197,14 @@ static int ipip6_tunnel_update_6rd(struct ip_tunnel *t,
 }
 
 static int
-ipip6_tunnel_get6rd(struct net_device *dev, struct ifreq *ifr)
+ipip6_tunnel_get6rd(struct net_device *dev, struct ip_tunnel_parm __user *data)
 {
        struct ip_tunnel *t = netdev_priv(dev);
        struct ip_tunnel_6rd ip6rd;
        struct ip_tunnel_parm p;
 
        if (dev == dev_to_sit_net(dev)->fb_tunnel_dev) {
-               if (copy_from_user(&p, ifr->ifr_ifru.ifru_data, sizeof(p)))
+               if (copy_from_user(&p, data, sizeof(p)))
                        return -EFAULT;
                t = ipip6_tunnel_locate(t->net, &p, 0);
        }
@@ -1215,13 +1215,14 @@ ipip6_tunnel_get6rd(struct net_device *dev, struct ifreq *ifr)
        ip6rd.relay_prefix = t->ip6rd.relay_prefix;
        ip6rd.prefixlen = t->ip6rd.prefixlen;
        ip6rd.relay_prefixlen = t->ip6rd.relay_prefixlen;
-       if (copy_to_user(ifr->ifr_ifru.ifru_data, &ip6rd, sizeof(ip6rd)))
+       if (copy_to_user(data, &ip6rd, sizeof(ip6rd)))
                return -EFAULT;
        return 0;
 }
 
 static int
-ipip6_tunnel_6rdctl(struct net_device *dev, struct ifreq *ifr, int cmd)
+ipip6_tunnel_6rdctl(struct net_device *dev, struct ip_tunnel_6rd __user *data,
+                   int cmd)
 {
        struct ip_tunnel *t = netdev_priv(dev);
        struct ip_tunnel_6rd ip6rd;
@@ -1229,7 +1230,7 @@ ipip6_tunnel_6rdctl(struct net_device *dev, struct ifreq *ifr, int cmd)
 
        if (!ns_capable(t->net->user_ns, CAP_NET_ADMIN))
                return -EPERM;
-       if (copy_from_user(&ip6rd, ifr->ifr_ifru.ifru_data, sizeof(ip6rd)))
+       if (copy_from_user(&ip6rd, data, sizeof(ip6rd)))
                return -EFAULT;
 
        if (cmd != SIOCDEL6RD) {
@@ -1368,27 +1369,28 @@ ipip6_tunnel_ctl(struct net_device *dev, struct ip_tunnel_parm *p, int cmd)
 }
 
 static int
-ipip6_tunnel_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
+ipip6_tunnel_siocdevprivate(struct net_device *dev, struct ifreq *ifr,
+                           void __user *data, int cmd)
 {
        switch (cmd) {
        case SIOCGETTUNNEL:
        case SIOCADDTUNNEL:
        case SIOCCHGTUNNEL:
        case SIOCDELTUNNEL:
-               return ip_tunnel_ioctl(dev, ifr, cmd);
+               return ip_tunnel_siocdevprivate(dev, ifr, data, cmd);
        case SIOCGETPRL:
-               return ipip6_tunnel_get_prl(dev, ifr);
+               return ipip6_tunnel_get_prl(dev, data);
        case SIOCADDPRL:
        case SIOCDELPRL:
        case SIOCCHGPRL:
-               return ipip6_tunnel_prl_ctl(dev, ifr, cmd);
+               return ipip6_tunnel_prl_ctl(dev, data, cmd);
 #ifdef CONFIG_IPV6_SIT_6RD
        case SIOCGET6RD:
-               return ipip6_tunnel_get6rd(dev, ifr);
+               return ipip6_tunnel_get6rd(dev, data);
        case SIOCADD6RD:
        case SIOCCHG6RD:
        case SIOCDEL6RD:
-               return ipip6_tunnel_6rdctl(dev, ifr, cmd);
+               return ipip6_tunnel_6rdctl(dev, data, cmd);
 #endif
        default:
                return -EINVAL;
@@ -1399,7 +1401,7 @@ static const struct net_device_ops ipip6_netdev_ops = {
        .ndo_init       = ipip6_tunnel_init,
        .ndo_uninit     = ipip6_tunnel_uninit,
        .ndo_start_xmit = sit_tunnel_xmit,
-       .ndo_do_ioctl   = ipip6_tunnel_ioctl,
+       .ndo_siocdevprivate = ipip6_tunnel_siocdevprivate,
        .ndo_get_stats64 = dev_get_tstats64,
        .ndo_get_iflink = ip_tunnel_get_iflink,
        .ndo_tunnel_ctl = ipip6_tunnel_ctl,