Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

net: rework SIOCGSTAMP ioctl handling

The SIOCGSTAMP/SIOCGSTAMPNS ioctl commands are implemented by many
socket protocol handlers, and all of those end up calling the same
sock_get_timestamp()/sock_get_timestampns() helper functions, which
results in a lot of duplicate code.

With the introduction of 64-bit time_t on 32-bit architectures, this
gets worse, as we then need four different ioctl commands in each
socket protocol implementation.

To simplify that, let's add a new .gettstamp() operation in
struct proto_ops, and move ioctl implementation into the common
sock_ioctl()/compat_sock_ioctl_trans() functions that these all go
through.

We can reuse the sock_get_timestamp() implementation, but generalize
it so it can deal with both native and compat mode, as well as
timeval and timespec structures.

Acked-by: Stefan Schmidt <stefan@datenfreihafen.org>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
Acked-by: Marc Kleine-Budde <mkl@pengutronix.de>
Link: https://lore.kernel.org/lkml/CAK8P3a038aDQQotzua_QtKGhq8O9n+rdiz2=WDCp82ys8eUT+A@mail.gmail.com/
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Acked-by: Willem de Bruijn <willemb@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Arnd Bergmann and committed by
David S. Miller
c7cbdbf2 1ab83928

+76 -233
+2
include/linux/net.h
··· 161 161 int (*compat_ioctl) (struct socket *sock, unsigned int cmd, 162 162 unsigned long arg); 163 163 #endif 164 + int (*gettstamp) (struct socket *sock, void __user *userstamp, 165 + bool timeval, bool time32); 164 166 int (*listen) (struct socket *sock, int len); 165 167 int (*shutdown) (struct socket *sock, int flags); 166 168 int (*setsockopt)(struct socket *sock, int level,
-3
include/net/compat.h
··· 30 30 compat_int_t cmsg_type; 31 31 }; 32 32 33 - int compat_sock_get_timestamp(struct sock *, struct timeval __user *); 34 - int compat_sock_get_timestampns(struct sock *, struct timespec __user *); 35 - 36 33 #else /* defined(CONFIG_COMPAT) */ 37 34 /* 38 35 * To avoid compiler warnings:
+2 -2
include/net/sock.h
··· 1614 1614 1615 1615 int sock_getsockopt(struct socket *sock, int level, int op, 1616 1616 char __user *optval, int __user *optlen); 1617 + int sock_gettstamp(struct socket *sock, void __user *userstamp, 1618 + bool timeval, bool time32); 1617 1619 struct sk_buff *sock_alloc_send_skb(struct sock *sk, unsigned long size, 1618 1620 int noblock, int *errcode); 1619 1621 struct sk_buff *sock_alloc_send_pskb(struct sock *sk, unsigned long header_len, ··· 2505 2503 } 2506 2504 2507 2505 void sock_enable_timestamp(struct sock *sk, int flag); 2508 - int sock_get_timestamp(struct sock *, struct timeval __user *); 2509 - int sock_get_timestampns(struct sock *, struct timespec __user *); 2510 2506 int sock_recv_errqueue(struct sock *sk, struct msghdr *msg, int len, int level, 2511 2507 int type); 2512 2508
+1 -6
net/appletalk/ddp.c
··· 1806 1806 rc = put_user(amount, (int __user *)argp); 1807 1807 break; 1808 1808 } 1809 - case SIOCGSTAMP: 1810 - rc = sock_get_timestamp(sk, argp); 1811 - break; 1812 - case SIOCGSTAMPNS: 1813 - rc = sock_get_timestampns(sk, argp); 1814 - break; 1815 1809 /* Routing */ 1816 1810 case SIOCADDRT: 1817 1811 case SIOCDELRT: ··· 1865 1871 .getname = atalk_getname, 1866 1872 .poll = datagram_poll, 1867 1873 .ioctl = atalk_ioctl, 1874 + .gettstamp = sock_gettstamp, 1868 1875 #ifdef CONFIG_COMPAT 1869 1876 .compat_ioctl = atalk_compat_ioctl, 1870 1877 #endif
-16
net/atm/ioctl.c
··· 81 81 (int __user *)argp) ? -EFAULT : 0; 82 82 goto done; 83 83 } 84 - case SIOCGSTAMP: /* borrowed from IP */ 85 - #ifdef CONFIG_COMPAT 86 - if (compat) 87 - error = compat_sock_get_timestamp(sk, argp); 88 - else 89 - #endif 90 - error = sock_get_timestamp(sk, argp); 91 - goto done; 92 - case SIOCGSTAMPNS: /* borrowed from IP */ 93 - #ifdef CONFIG_COMPAT 94 - if (compat) 95 - error = compat_sock_get_timestampns(sk, argp); 96 - else 97 - #endif 98 - error = sock_get_timestampns(sk, argp); 99 - goto done; 100 84 case ATM_SETSC: 101 85 net_warn_ratelimited("ATM_SETSC is obsolete; used by %s:%d\n", 102 86 current->comm, task_pid_nr(current));
+1
net/atm/pvc.c
··· 118 118 #ifdef CONFIG_COMPAT 119 119 .compat_ioctl = vcc_compat_ioctl, 120 120 #endif 121 + .gettstamp = sock_gettstamp, 121 122 .listen = sock_no_listen, 122 123 .shutdown = pvc_shutdown, 123 124 .setsockopt = pvc_setsockopt,
+1
net/atm/svc.c
··· 641 641 #ifdef CONFIG_COMPAT 642 642 .compat_ioctl = svc_compat_ioctl, 643 643 #endif 644 + .gettstamp = sock_gettstamp, 644 645 .listen = svc_listen, 645 646 .shutdown = svc_shutdown, 646 647 .setsockopt = svc_setsockopt,
+1 -8
net/ax25/af_ax25.c
··· 1714 1714 break; 1715 1715 } 1716 1716 1717 - case SIOCGSTAMP: 1718 - res = sock_get_timestamp(sk, argp); 1719 - break; 1720 - 1721 - case SIOCGSTAMPNS: 1722 - res = sock_get_timestampns(sk, argp); 1723 - break; 1724 - 1725 1717 case SIOCAX25ADDUID: /* Add a uid to the uid/call map table */ 1726 1718 case SIOCAX25DELUID: /* Delete a uid from the uid/call map table */ 1727 1719 case SIOCAX25GETUID: { ··· 1942 1950 .getname = ax25_getname, 1943 1951 .poll = datagram_poll, 1944 1952 .ioctl = ax25_ioctl, 1953 + .gettstamp = sock_gettstamp, 1945 1954 .listen = ax25_listen, 1946 1955 .shutdown = ax25_shutdown, 1947 1956 .setsockopt = ax25_setsockopt,
-8
net/bluetooth/af_bluetooth.c
··· 521 521 err = put_user(amount, (int __user *) arg); 522 522 break; 523 523 524 - case SIOCGSTAMP: 525 - err = sock_get_timestamp(sk, (struct timeval __user *) arg); 526 - break; 527 - 528 - case SIOCGSTAMPNS: 529 - err = sock_get_timestampns(sk, (struct timespec __user *) arg); 530 - break; 531 - 532 524 default: 533 525 err = -ENOIOCTLCMD; 534 526 break;
+1
net/bluetooth/l2cap_sock.c
··· 1655 1655 .recvmsg = l2cap_sock_recvmsg, 1656 1656 .poll = bt_sock_poll, 1657 1657 .ioctl = bt_sock_ioctl, 1658 + .gettstamp = sock_gettstamp, 1658 1659 .mmap = sock_no_mmap, 1659 1660 .socketpair = sock_no_socketpair, 1660 1661 .shutdown = l2cap_sock_shutdown,
+1
net/bluetooth/rfcomm/sock.c
··· 1039 1039 .setsockopt = rfcomm_sock_setsockopt, 1040 1040 .getsockopt = rfcomm_sock_getsockopt, 1041 1041 .ioctl = rfcomm_sock_ioctl, 1042 + .gettstamp = sock_gettstamp, 1042 1043 .poll = bt_sock_poll, 1043 1044 .socketpair = sock_no_socketpair, 1044 1045 .mmap = sock_no_mmap
+1
net/bluetooth/sco.c
··· 1190 1190 .recvmsg = sco_sock_recvmsg, 1191 1191 .poll = bt_sock_poll, 1192 1192 .ioctl = bt_sock_ioctl, 1193 + .gettstamp = sock_gettstamp, 1193 1194 .mmap = sock_no_mmap, 1194 1195 .socketpair = sock_no_socketpair, 1195 1196 .shutdown = sco_sock_shutdown,
-6
net/can/af_can.c
··· 89 89 90 90 int can_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) 91 91 { 92 - struct sock *sk = sock->sk; 93 - 94 92 switch (cmd) { 95 - 96 - case SIOCGSTAMP: 97 - return sock_get_timestamp(sk, (struct timeval __user *)arg); 98 - 99 93 default: 100 94 return -ENOIOCTLCMD; 101 95 }
+1
net/can/bcm.c
··· 1689 1689 .getname = sock_no_getname, 1690 1690 .poll = datagram_poll, 1691 1691 .ioctl = can_ioctl, /* use can_ioctl() from af_can.c */ 1692 + .gettstamp = sock_gettstamp, 1692 1693 .listen = sock_no_listen, 1693 1694 .shutdown = sock_no_shutdown, 1694 1695 .setsockopt = sock_no_setsockopt,
+1
net/can/raw.c
··· 846 846 .getname = raw_getname, 847 847 .poll = datagram_poll, 848 848 .ioctl = can_ioctl, /* use can_ioctl() from af_can.c */ 849 + .gettstamp = sock_gettstamp, 849 850 .listen = sock_no_listen, 850 851 .shutdown = sock_no_shutdown, 851 852 .setsockopt = raw_setsockopt,
-57
net/compat.c
··· 395 395 return __compat_sys_setsockopt(fd, level, optname, optval, optlen); 396 396 } 397 397 398 - int compat_sock_get_timestamp(struct sock *sk, struct timeval __user *userstamp) 399 - { 400 - struct compat_timeval __user *ctv; 401 - int err; 402 - struct timeval tv; 403 - 404 - if (COMPAT_USE_64BIT_TIME) 405 - return sock_get_timestamp(sk, userstamp); 406 - 407 - ctv = (struct compat_timeval __user *) userstamp; 408 - err = -ENOENT; 409 - sock_enable_timestamp(sk, SOCK_TIMESTAMP); 410 - tv = ktime_to_timeval(sock_read_timestamp(sk)); 411 - 412 - if (tv.tv_sec == -1) 413 - return err; 414 - if (tv.tv_sec == 0) { 415 - ktime_t kt = ktime_get_real(); 416 - sock_write_timestamp(sk, kt); 417 - tv = ktime_to_timeval(kt); 418 - } 419 - err = 0; 420 - if (put_user(tv.tv_sec, &ctv->tv_sec) || 421 - put_user(tv.tv_usec, &ctv->tv_usec)) 422 - err = -EFAULT; 423 - return err; 424 - } 425 - EXPORT_SYMBOL(compat_sock_get_timestamp); 426 - 427 - int compat_sock_get_timestampns(struct sock *sk, struct timespec __user *userstamp) 428 - { 429 - struct compat_timespec __user *ctv; 430 - int err; 431 - struct timespec ts; 432 - 433 - if (COMPAT_USE_64BIT_TIME) 434 - return sock_get_timestampns (sk, userstamp); 435 - 436 - ctv = (struct compat_timespec __user *) userstamp; 437 - err = -ENOENT; 438 - sock_enable_timestamp(sk, SOCK_TIMESTAMP); 439 - ts = ktime_to_timespec(sock_read_timestamp(sk)); 440 - if (ts.tv_sec == -1) 441 - return err; 442 - if (ts.tv_sec == 0) { 443 - ktime_t kt = ktime_get_real(); 444 - sock_write_timestamp(sk, kt); 445 - ts = ktime_to_timespec(kt); 446 - } 447 - err = 0; 448 - if (put_user(ts.tv_sec, &ctv->tv_sec) || 449 - put_user(ts.tv_nsec, &ctv->tv_nsec)) 450 - err = -EFAULT; 451 - return err; 452 - } 453 - EXPORT_SYMBOL(compat_sock_get_timestampns); 454 - 455 398 static int __compat_sys_getsockopt(int fd, int level, int optname, 456 399 char __user *optval, 457 400 int __user *optlen)
+29 -24
net/core/sock.c
··· 2977 2977 } 2978 2978 EXPORT_SYMBOL(lock_sock_fast); 2979 2979 2980 - int sock_get_timestamp(struct sock *sk, struct timeval __user *userstamp) 2980 + int sock_gettstamp(struct socket *sock, void __user *userstamp, 2981 + bool timeval, bool time32) 2981 2982 { 2982 - struct timeval tv; 2983 + struct sock *sk = sock->sk; 2984 + struct timespec64 ts; 2983 2985 2984 2986 sock_enable_timestamp(sk, SOCK_TIMESTAMP); 2985 - tv = ktime_to_timeval(sock_read_timestamp(sk)); 2986 - if (tv.tv_sec == -1) 2987 - return -ENOENT; 2988 - if (tv.tv_sec == 0) { 2989 - ktime_t kt = ktime_get_real(); 2990 - sock_write_timestamp(sk, kt); 2991 - tv = ktime_to_timeval(kt); 2992 - } 2993 - return copy_to_user(userstamp, &tv, sizeof(tv)) ? -EFAULT : 0; 2994 - } 2995 - EXPORT_SYMBOL(sock_get_timestamp); 2996 - 2997 - int sock_get_timestampns(struct sock *sk, struct timespec __user *userstamp) 2998 - { 2999 - struct timespec ts; 3000 - 3001 - sock_enable_timestamp(sk, SOCK_TIMESTAMP); 3002 - ts = ktime_to_timespec(sock_read_timestamp(sk)); 2987 + ts = ktime_to_timespec64(sock_read_timestamp(sk)); 3003 2988 if (ts.tv_sec == -1) 3004 2989 return -ENOENT; 3005 2990 if (ts.tv_sec == 0) { 3006 2991 ktime_t kt = ktime_get_real(); 3007 - sock_write_timestamp(sk, kt); 3008 - ts = ktime_to_timespec(sk->sk_stamp); 2992 + sock_write_timestamp(sk, kt);; 2993 + ts = ktime_to_timespec64(kt); 3009 2994 } 3010 - return copy_to_user(userstamp, &ts, sizeof(ts)) ? -EFAULT : 0; 2995 + 2996 + if (timeval) 2997 + ts.tv_nsec /= 1000; 2998 + 2999 + #ifdef CONFIG_COMPAT_32BIT_TIME 3000 + if (time32) 3001 + return put_old_timespec32(&ts, userstamp); 3002 + #endif 3003 + #ifdef CONFIG_SPARC64 3004 + /* beware of padding in sparc64 timeval */ 3005 + if (timeval && !in_compat_syscall()) { 3006 + struct __kernel_old_timeval __user tv = { 3007 + .tv_sec = ts.tv_sec; 3008 + .tv_usec = ts.tv_nsec; 3009 + }; 3010 + if (copy_to_user(userstamp, &tv, sizeof(tv)) 3011 + return -EFAULT; 3012 + return 0; 3013 + } 3014 + #endif 3015 + return put_timespec64(&ts, userstamp); 3011 3016 } 3012 - EXPORT_SYMBOL(sock_get_timestampns); 3017 + EXPORT_SYMBOL(sock_gettstamp); 3013 3018 3014 3019 void sock_enable_timestamp(struct sock *sk, int flag) 3015 3020 {
+1
net/dccp/ipv4.c
··· 991 991 /* FIXME: work on tcp_poll to rename it to inet_csk_poll */ 992 992 .poll = dccp_poll, 993 993 .ioctl = inet_ioctl, 994 + .gettstamp = sock_gettstamp, 994 995 /* FIXME: work on inet_listen to rename it to sock_common_listen */ 995 996 .listen = inet_dccp_listen, 996 997 .shutdown = inet_shutdown,
+1
net/dccp/ipv6.c
··· 1075 1075 .getname = inet6_getname, 1076 1076 .poll = dccp_poll, 1077 1077 .ioctl = inet6_ioctl, 1078 + .gettstamp = sock_gettstamp, 1078 1079 .listen = inet_dccp_listen, 1079 1080 .shutdown = inet_shutdown, 1080 1081 .setsockopt = sock_common_setsockopt,
+2 -4
net/ieee802154/socket.c
··· 164 164 struct sock *sk = sock->sk; 165 165 166 166 switch (cmd) { 167 - case SIOCGSTAMP: 168 - return sock_get_timestamp(sk, (struct timeval __user *)arg); 169 - case SIOCGSTAMPNS: 170 - return sock_get_timestampns(sk, (struct timespec __user *)arg); 171 167 case SIOCGIFADDR: 172 168 case SIOCSIFADDR: 173 169 return ieee802154_dev_ioctl(sk, (struct ifreq __user *)arg, ··· 422 426 .getname = sock_no_getname, 423 427 .poll = datagram_poll, 424 428 .ioctl = ieee802154_sock_ioctl, 429 + .gettstamp = sock_gettstamp, 425 430 .listen = sock_no_listen, 426 431 .shutdown = sock_no_shutdown, 427 432 .setsockopt = sock_common_setsockopt, ··· 985 988 .getname = sock_no_getname, 986 989 .poll = datagram_poll, 987 990 .ioctl = ieee802154_sock_ioctl, 991 + .gettstamp = sock_gettstamp, 988 992 .listen = sock_no_listen, 989 993 .shutdown = sock_no_shutdown, 990 994 .setsockopt = sock_common_setsockopt,
+3 -6
net/ipv4/af_inet.c
··· 915 915 struct rtentry rt; 916 916 917 917 switch (cmd) { 918 - case SIOCGSTAMP: 919 - err = sock_get_timestamp(sk, (struct timeval __user *)arg); 920 - break; 921 - case SIOCGSTAMPNS: 922 - err = sock_get_timestampns(sk, (struct timespec __user *)arg); 923 - break; 924 918 case SIOCADDRT: 925 919 case SIOCDELRT: 926 920 if (copy_from_user(&rt, p, sizeof(struct rtentry))) ··· 986 992 .getname = inet_getname, 987 993 .poll = tcp_poll, 988 994 .ioctl = inet_ioctl, 995 + .gettstamp = sock_gettstamp, 989 996 .listen = inet_listen, 990 997 .shutdown = inet_shutdown, 991 998 .setsockopt = sock_common_setsockopt, ··· 1022 1027 .getname = inet_getname, 1023 1028 .poll = udp_poll, 1024 1029 .ioctl = inet_ioctl, 1030 + .gettstamp = sock_gettstamp, 1025 1031 .listen = sock_no_listen, 1026 1032 .shutdown = inet_shutdown, 1027 1033 .setsockopt = sock_common_setsockopt, ··· 1055 1059 .getname = inet_getname, 1056 1060 .poll = datagram_poll, 1057 1061 .ioctl = inet_ioctl, 1062 + .gettstamp = sock_gettstamp, 1058 1063 .listen = sock_no_listen, 1059 1064 .shutdown = inet_shutdown, 1060 1065 .setsockopt = sock_common_setsockopt,
+2 -6
net/ipv6/af_inet6.c
··· 547 547 struct net *net = sock_net(sk); 548 548 549 549 switch (cmd) { 550 - case SIOCGSTAMP: 551 - return sock_get_timestamp(sk, (struct timeval __user *)arg); 552 - 553 - case SIOCGSTAMPNS: 554 - return sock_get_timestampns(sk, (struct timespec __user *)arg); 555 - 556 550 case SIOCADDRT: 557 551 case SIOCDELRT: 558 552 ··· 579 585 .getname = inet6_getname, 580 586 .poll = tcp_poll, /* ok */ 581 587 .ioctl = inet6_ioctl, /* must change */ 588 + .gettstamp = sock_gettstamp, 582 589 .listen = inet_listen, /* ok */ 583 590 .shutdown = inet_shutdown, /* ok */ 584 591 .setsockopt = sock_common_setsockopt, /* ok */ ··· 613 618 .getname = inet6_getname, 614 619 .poll = udp_poll, /* ok */ 615 620 .ioctl = inet6_ioctl, /* must change */ 621 + .gettstamp = sock_gettstamp, 616 622 .listen = sock_no_listen, /* ok */ 617 623 .shutdown = inet_shutdown, /* ok */ 618 624 .setsockopt = sock_common_setsockopt, /* ok */
+1
net/ipv6/raw.c
··· 1356 1356 .getname = inet6_getname, 1357 1357 .poll = datagram_poll, /* ok */ 1358 1358 .ioctl = inet6_ioctl, /* must change */ 1359 + .gettstamp = sock_gettstamp, 1359 1360 .listen = sock_no_listen, /* ok */ 1360 1361 .shutdown = inet_shutdown, /* ok */ 1361 1362 .setsockopt = sock_common_setsockopt, /* ok */
+1
net/l2tp/l2tp_ip.c
··· 618 618 .getname = l2tp_ip_getname, 619 619 .poll = datagram_poll, 620 620 .ioctl = inet_ioctl, 621 + .gettstamp = sock_gettstamp, 621 622 .listen = sock_no_listen, 622 623 .shutdown = inet_shutdown, 623 624 .setsockopt = sock_common_setsockopt,
+1
net/l2tp/l2tp_ip6.c
··· 752 752 .getname = l2tp_ip6_getname, 753 753 .poll = datagram_poll, 754 754 .ioctl = inet6_ioctl, 755 + .gettstamp = sock_gettstamp, 755 756 .listen = sock_no_listen, 756 757 .shutdown = inet_shutdown, 757 758 .setsockopt = sock_common_setsockopt,
+1 -13
net/netrom/af_netrom.c
··· 1199 1199 { 1200 1200 struct sock *sk = sock->sk; 1201 1201 void __user *argp = (void __user *)arg; 1202 - int ret; 1203 1202 1204 1203 switch (cmd) { 1205 1204 case TIOCOUTQ: { ··· 1223 1224 release_sock(sk); 1224 1225 return put_user(amount, (int __user *)argp); 1225 1226 } 1226 - 1227 - case SIOCGSTAMP: 1228 - lock_sock(sk); 1229 - ret = sock_get_timestamp(sk, argp); 1230 - release_sock(sk); 1231 - return ret; 1232 - 1233 - case SIOCGSTAMPNS: 1234 - lock_sock(sk); 1235 - ret = sock_get_timestampns(sk, argp); 1236 - release_sock(sk); 1237 - return ret; 1238 1227 1239 1228 case SIOCGIFADDR: 1240 1229 case SIOCSIFADDR: ··· 1349 1362 .getname = nr_getname, 1350 1363 .poll = datagram_poll, 1351 1364 .ioctl = nr_ioctl, 1365 + .gettstamp = sock_gettstamp, 1352 1366 .listen = nr_listen, 1353 1367 .shutdown = sock_no_shutdown, 1354 1368 .setsockopt = nr_setsockopt,
+2 -5
net/packet/af_packet.c
··· 4075 4075 spin_unlock_bh(&sk->sk_receive_queue.lock); 4076 4076 return put_user(amount, (int __user *)arg); 4077 4077 } 4078 - case SIOCGSTAMP: 4079 - return sock_get_timestamp(sk, (struct timeval __user *)arg); 4080 - case SIOCGSTAMPNS: 4081 - return sock_get_timestampns(sk, (struct timespec __user *)arg); 4082 - 4083 4078 #ifdef CONFIG_INET 4084 4079 case SIOCADDRT: 4085 4080 case SIOCDELRT: ··· 4450 4455 .getname = packet_getname_spkt, 4451 4456 .poll = datagram_poll, 4452 4457 .ioctl = packet_ioctl, 4458 + .gettstamp = sock_gettstamp, 4453 4459 .listen = sock_no_listen, 4454 4460 .shutdown = sock_no_shutdown, 4455 4461 .setsockopt = sock_no_setsockopt, ··· 4472 4476 .getname = packet_getname, 4473 4477 .poll = packet_poll, 4474 4478 .ioctl = packet_ioctl, 4479 + .gettstamp = sock_gettstamp, 4475 4480 .listen = sock_no_listen, 4476 4481 .shutdown = sock_no_shutdown, 4477 4482 .setsockopt = packet_setsockopt,
+1 -3
net/qrtr/qrtr.c
··· 968 968 break; 969 969 } 970 970 break; 971 - case SIOCGSTAMP: 972 - rc = sock_get_timestamp(sk, argp); 973 - break; 974 971 case SIOCADDRT: 975 972 case SIOCDELRT: 976 973 case SIOCSIFADDR: ··· 1030 1033 .recvmsg = qrtr_recvmsg, 1031 1034 .getname = qrtr_getname, 1032 1035 .ioctl = qrtr_ioctl, 1036 + .gettstamp = sock_gettstamp, 1033 1037 .poll = datagram_poll, 1034 1038 .shutdown = sock_no_shutdown, 1035 1039 .setsockopt = sock_no_setsockopt,
+1 -6
net/rose/af_rose.c
··· 1301 1301 return put_user(amount, (unsigned int __user *) argp); 1302 1302 } 1303 1303 1304 - case SIOCGSTAMP: 1305 - return sock_get_timestamp(sk, (struct timeval __user *) argp); 1306 - 1307 - case SIOCGSTAMPNS: 1308 - return sock_get_timestampns(sk, (struct timespec __user *) argp); 1309 - 1310 1304 case SIOCGIFADDR: 1311 1305 case SIOCSIFADDR: 1312 1306 case SIOCGIFDSTADDR: ··· 1468 1474 .getname = rose_getname, 1469 1475 .poll = datagram_poll, 1470 1476 .ioctl = rose_ioctl, 1477 + .gettstamp = sock_gettstamp, 1471 1478 .listen = rose_listen, 1472 1479 .shutdown = sock_no_shutdown, 1473 1480 .setsockopt = rose_setsockopt,
+1
net/sctp/ipv6.c
··· 1030 1030 .getname = sctp_getname, 1031 1031 .poll = sctp_poll, 1032 1032 .ioctl = inet6_ioctl, 1033 + .gettstamp = sock_gettstamp, 1033 1034 .listen = sctp_inet_listen, 1034 1035 .shutdown = inet_shutdown, 1035 1036 .setsockopt = sock_common_setsockopt,
+1
net/sctp/protocol.c
··· 1026 1026 .getname = inet_getname, /* Semantics are different. */ 1027 1027 .poll = sctp_poll, 1028 1028 .ioctl = inet_ioctl, 1029 + .gettstamp = sock_gettstamp, 1029 1030 .listen = sctp_inet_listen, 1030 1031 .shutdown = inet_shutdown, /* Looks harmless. */ 1031 1032 .setsockopt = sock_common_setsockopt, /* IP_SOL IP_OPTION is a problem */
+14 -34
net/socket.c
··· 1164 1164 1165 1165 err = open_related_ns(&net->ns, get_net_ns); 1166 1166 break; 1167 + case SIOCGSTAMP: 1168 + case SIOCGSTAMPNS: 1169 + if (!sock->ops->gettstamp) { 1170 + err = -ENOIOCTLCMD; 1171 + break; 1172 + } 1173 + err = sock->ops->gettstamp(sock, argp, 1174 + cmd == SIOCGSTAMP, false); 1175 + break; 1167 1176 default: 1168 1177 err = sock_do_ioctl(net, sock, cmd, arg); 1169 1178 break; ··· 2925 2916 #endif /* CONFIG_PROC_FS */ 2926 2917 2927 2918 #ifdef CONFIG_COMPAT 2928 - static int do_siocgstamp(struct net *net, struct socket *sock, 2929 - unsigned int cmd, void __user *up) 2930 - { 2931 - mm_segment_t old_fs = get_fs(); 2932 - struct timeval ktv; 2933 - int err; 2934 - 2935 - set_fs(KERNEL_DS); 2936 - err = sock_do_ioctl(net, sock, cmd, (unsigned long)&ktv); 2937 - set_fs(old_fs); 2938 - if (!err) 2939 - err = compat_put_timeval(&ktv, up); 2940 - 2941 - return err; 2942 - } 2943 - 2944 - static int do_siocgstampns(struct net *net, struct socket *sock, 2945 - unsigned int cmd, void __user *up) 2946 - { 2947 - mm_segment_t old_fs = get_fs(); 2948 - struct timespec kts; 2949 - int err; 2950 - 2951 - set_fs(KERNEL_DS); 2952 - err = sock_do_ioctl(net, sock, cmd, (unsigned long)&kts); 2953 - set_fs(old_fs); 2954 - if (!err) 2955 - err = compat_put_timespec(&kts, up); 2956 - 2957 - return err; 2958 - } 2959 - 2960 2919 static int compat_dev_ifconf(struct net *net, struct compat_ifconf __user *uifc32) 2961 2920 { 2962 2921 struct compat_ifconf ifc32; ··· 3325 3348 case SIOCDELRT: 3326 3349 return routing_ioctl(net, sock, cmd, argp); 3327 3350 case SIOCGSTAMP: 3328 - return do_siocgstamp(net, sock, cmd, argp); 3329 3351 case SIOCGSTAMPNS: 3330 - return do_siocgstampns(net, sock, cmd, argp); 3352 + if (!sock->ops->gettstamp) 3353 + return -ENOIOCTLCMD; 3354 + return sock->ops->gettstamp(sock, argp, cmd == SIOCGSTAMP, 3355 + !COMPAT_USE_64BIT_TIME); 3356 + 3331 3357 case SIOCBONDSLAVEINFOQUERY: 3332 3358 case SIOCBONDINFOQUERY: 3333 3359 case SIOCSHWTSTAMP:
+1 -26
net/x25/af_x25.c
··· 1398 1398 break; 1399 1399 } 1400 1400 1401 - case SIOCGSTAMP: 1402 - rc = -EINVAL; 1403 - if (sk) 1404 - rc = sock_get_timestamp(sk, 1405 - (struct timeval __user *)argp); 1406 - break; 1407 - case SIOCGSTAMPNS: 1408 - rc = -EINVAL; 1409 - if (sk) 1410 - rc = sock_get_timestampns(sk, 1411 - (struct timespec __user *)argp); 1412 - break; 1413 1401 case SIOCGIFADDR: 1414 1402 case SIOCSIFADDR: 1415 1403 case SIOCGIFDSTADDR: ··· 1669 1681 unsigned long arg) 1670 1682 { 1671 1683 void __user *argp = compat_ptr(arg); 1672 - struct sock *sk = sock->sk; 1673 - 1674 1684 int rc = -ENOIOCTLCMD; 1675 1685 1676 1686 switch(cmd) { 1677 1687 case TIOCOUTQ: 1678 1688 case TIOCINQ: 1679 1689 rc = x25_ioctl(sock, cmd, (unsigned long)argp); 1680 - break; 1681 - case SIOCGSTAMP: 1682 - rc = -EINVAL; 1683 - if (sk) 1684 - rc = compat_sock_get_timestamp(sk, 1685 - (struct timeval __user*)argp); 1686 - break; 1687 - case SIOCGSTAMPNS: 1688 - rc = -EINVAL; 1689 - if (sk) 1690 - rc = compat_sock_get_timestampns(sk, 1691 - (struct timespec __user*)argp); 1692 1690 break; 1693 1691 case SIOCGIFADDR: 1694 1692 case SIOCSIFADDR: ··· 1739 1765 #ifdef CONFIG_COMPAT 1740 1766 .compat_ioctl = compat_x25_ioctl, 1741 1767 #endif 1768 + .gettstamp = sock_gettstamp, 1742 1769 .listen = x25_listen, 1743 1770 .shutdown = sock_no_shutdown, 1744 1771 .setsockopt = x25_setsockopt,