Merge branch 'siocghwtstamp' of git://git.kernel.org/pub/scm/linux/kernel/git/bwh...
[linux-drm-fsl-dcu.git] / net / socket.c
index e83c416708af5554f89c98723bba150b8750b3f0..cd38a785f7d2bb7e14f86df38b964e39266e605b 100644 (file)
@@ -2968,11 +2968,8 @@ static int bond_ioctl(struct net *net, unsigned int cmd,
                         struct compat_ifreq __user *ifr32)
 {
        struct ifreq kifr;
-       struct ifreq __user *uifr;
        mm_segment_t old_fs;
        int err;
-       u32 data;
-       void __user *datap;
 
        switch (cmd) {
        case SIOCBONDENSLAVE:
@@ -2989,26 +2986,13 @@ static int bond_ioctl(struct net *net, unsigned int cmd,
                set_fs(old_fs);
 
                return err;
-       case SIOCBONDSLAVEINFOQUERY:
-       case SIOCBONDINFOQUERY:
-               uifr = compat_alloc_user_space(sizeof(*uifr));
-               if (copy_in_user(&uifr->ifr_name, &ifr32->ifr_name, IFNAMSIZ))
-                       return -EFAULT;
-
-               if (get_user(data, &ifr32->ifr_ifru.ifru_data))
-                       return -EFAULT;
-
-               datap = compat_ptr(data);
-               if (put_user(datap, &uifr->ifr_ifru.ifru_data))
-                       return -EFAULT;
-
-               return dev_ioctl(net, cmd, uifr);
        default:
                return -ENOIOCTLCMD;
        }
 }
 
-static int siocdevprivate_ioctl(struct net *net, unsigned int cmd,
+/* Handle ioctls that use ifreq::ifr_data and just need struct ifreq converted */
+static int compat_ifr_data_ioctl(struct net *net, unsigned int cmd,
                                 struct compat_ifreq __user *u_ifreq32)
 {
        struct ifreq __user *u_ifreq64;
@@ -3019,19 +3003,16 @@ static int siocdevprivate_ioctl(struct net *net, unsigned int cmd,
        if (copy_from_user(&tmp_buf[0], &(u_ifreq32->ifr_ifrn.ifrn_name[0]),
                           IFNAMSIZ))
                return -EFAULT;
-       if (__get_user(data32, &u_ifreq32->ifr_ifru.ifru_data))
+       if (get_user(data32, &u_ifreq32->ifr_ifru.ifru_data))
                return -EFAULT;
        data64 = compat_ptr(data32);
 
        u_ifreq64 = compat_alloc_user_space(sizeof(*u_ifreq64));
 
-       /* Don't check these user accesses, just let that get trapped
-        * in the ioctl handler instead.
-        */
        if (copy_to_user(&u_ifreq64->ifr_ifrn.ifrn_name[0], &tmp_buf[0],
                         IFNAMSIZ))
                return -EFAULT;
-       if (__put_user(data64, &u_ifreq64->ifr_ifru.ifru_data))
+       if (put_user(data64, &u_ifreq64->ifr_ifru.ifru_data))
                return -EFAULT;
 
        return dev_ioctl(net, cmd, u_ifreq64);
@@ -3111,27 +3092,6 @@ static int compat_sioc_ifmap(struct net *net, unsigned int cmd,
        return err;
 }
 
-static int compat_siocshwtstamp(struct net *net, struct compat_ifreq __user *uifr32)
-{
-       void __user *uptr;
-       compat_uptr_t uptr32;
-       struct ifreq __user *uifr;
-
-       uifr = compat_alloc_user_space(sizeof(*uifr));
-       if (copy_in_user(uifr, uifr32, sizeof(struct compat_ifreq)))
-               return -EFAULT;
-
-       if (get_user(uptr32, &uifr32->ifr_data))
-               return -EFAULT;
-
-       uptr = compat_ptr(uptr32);
-
-       if (put_user(uptr, &uifr->ifr_data))
-               return -EFAULT;
-
-       return dev_ioctl(net, SIOCSHWTSTAMP, uifr);
-}
-
 struct rtentry32 {
        u32             rt_pad1;
        struct sockaddr rt_dst;         /* target address               */
@@ -3243,7 +3203,7 @@ static int compat_sock_ioctl_trans(struct file *file, struct socket *sock,
        struct net *net = sock_net(sk);
 
        if (cmd >= SIOCDEVPRIVATE && cmd <= (SIOCDEVPRIVATE + 15))
-               return siocdevprivate_ioctl(net, cmd, argp);
+               return compat_ifr_data_ioctl(net, cmd, argp);
 
        switch (cmd) {
        case SIOCSIFBR:
@@ -3263,8 +3223,6 @@ static int compat_sock_ioctl_trans(struct file *file, struct socket *sock,
        case SIOCBONDENSLAVE:
        case SIOCBONDRELEASE:
        case SIOCBONDSETHWADDR:
-       case SIOCBONDSLAVEINFOQUERY:
-       case SIOCBONDINFOQUERY:
        case SIOCBONDCHANGEACTIVE:
                return bond_ioctl(net, cmd, argp);
        case SIOCADDRT:
@@ -3274,8 +3232,11 @@ static int compat_sock_ioctl_trans(struct file *file, struct socket *sock,
                return do_siocgstamp(net, sock, cmd, argp);
        case SIOCGSTAMPNS:
                return do_siocgstampns(net, sock, cmd, argp);
+       case SIOCBONDSLAVEINFOQUERY:
+       case SIOCBONDINFOQUERY:
        case SIOCSHWTSTAMP:
-               return compat_siocshwtstamp(net, argp);
+       case SIOCGHWTSTAMP:
+               return compat_ifr_data_ioctl(net, cmd, argp);
 
        case FIOSETOWN:
        case SIOCSPGRP: