aboutsummaryrefslogtreecommitdiffstats
path: root/net/x25/af_x25.c
diff options
context:
space:
mode:
authorArnd Bergmann <arnd@arndb.de>2009-11-04 23:37:29 -0500
committerDavid S. Miller <davem@davemloft.net>2009-11-07 03:46:40 -0500
commit91774904fbf0fe1c71441dd8299342a4654f7103 (patch)
treeef788b00bb8bbf8bbc7552d843a3093ec68026c2 /net/x25/af_x25.c
parent58a9d73202dd40076992154e9acfb98489cc8eab (diff)
net/x25: push BKL usage into x25_proto
The x25 driver uses lock_kernel() implicitly through its proto_ops wrapper. The makes the usage explicit in order to get rid of that wrapper and to better document the usage of the BKL. The next step should be to get rid of the usage of the BKL in x25 entirely, which requires understanding what data structures need serialized accesses. Cc: Henner Eisen <eis@baty.hanse.de> Cc: David S. Miller <davem@davemloft.net> Cc: linux-x25@vger.kernel.org Cc: netdev@vger.kernel.org Signed-off-by: Arnd Bergmann <arnd@arndb.de> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/x25/af_x25.c')
-rw-r--r--net/x25/af_x25.c71
1 files changed, 60 insertions, 11 deletions
diff --git a/net/x25/af_x25.c b/net/x25/af_x25.c
index 38e235f61e2..39ce03e07d1 100644
--- a/net/x25/af_x25.c
+++ b/net/x25/af_x25.c
@@ -415,6 +415,7 @@ static int x25_setsockopt(struct socket *sock, int level, int optname,
415 struct sock *sk = sock->sk; 415 struct sock *sk = sock->sk;
416 int rc = -ENOPROTOOPT; 416 int rc = -ENOPROTOOPT;
417 417
418 lock_kernel();
418 if (level != SOL_X25 || optname != X25_QBITINCL) 419 if (level != SOL_X25 || optname != X25_QBITINCL)
419 goto out; 420 goto out;
420 421
@@ -429,6 +430,7 @@ static int x25_setsockopt(struct socket *sock, int level, int optname,
429 x25_sk(sk)->qbitincl = !!opt; 430 x25_sk(sk)->qbitincl = !!opt;
430 rc = 0; 431 rc = 0;
431out: 432out:
433 unlock_kernel();
432 return rc; 434 return rc;
433} 435}
434 436
@@ -438,6 +440,7 @@ static int x25_getsockopt(struct socket *sock, int level, int optname,
438 struct sock *sk = sock->sk; 440 struct sock *sk = sock->sk;
439 int val, len, rc = -ENOPROTOOPT; 441 int val, len, rc = -ENOPROTOOPT;
440 442
443 lock_kernel();
441 if (level != SOL_X25 || optname != X25_QBITINCL) 444 if (level != SOL_X25 || optname != X25_QBITINCL)
442 goto out; 445 goto out;
443 446
@@ -458,6 +461,7 @@ static int x25_getsockopt(struct socket *sock, int level, int optname,
458 val = x25_sk(sk)->qbitincl; 461 val = x25_sk(sk)->qbitincl;
459 rc = copy_to_user(optval, &val, len) ? -EFAULT : 0; 462 rc = copy_to_user(optval, &val, len) ? -EFAULT : 0;
460out: 463out:
464 unlock_kernel();
461 return rc; 465 return rc;
462} 466}
463 467
@@ -466,12 +470,14 @@ static int x25_listen(struct socket *sock, int backlog)
466 struct sock *sk = sock->sk; 470 struct sock *sk = sock->sk;
467 int rc = -EOPNOTSUPP; 471 int rc = -EOPNOTSUPP;
468 472
473 lock_kernel();
469 if (sk->sk_state != TCP_LISTEN) { 474 if (sk->sk_state != TCP_LISTEN) {
470 memset(&x25_sk(sk)->dest_addr, 0, X25_ADDR_LEN); 475 memset(&x25_sk(sk)->dest_addr, 0, X25_ADDR_LEN);
471 sk->sk_max_ack_backlog = backlog; 476 sk->sk_max_ack_backlog = backlog;
472 sk->sk_state = TCP_LISTEN; 477 sk->sk_state = TCP_LISTEN;
473 rc = 0; 478 rc = 0;
474 } 479 }
480 unlock_kernel();
475 481
476 return rc; 482 return rc;
477} 483}
@@ -598,6 +604,7 @@ static int x25_release(struct socket *sock)
598 struct sock *sk = sock->sk; 604 struct sock *sk = sock->sk;
599 struct x25_sock *x25; 605 struct x25_sock *x25;
600 606
607 lock_kernel();
601 if (!sk) 608 if (!sk)
602 goto out; 609 goto out;
603 610
@@ -628,6 +635,7 @@ static int x25_release(struct socket *sock)
628 635
629 sock_orphan(sk); 636 sock_orphan(sk);
630out: 637out:
638 unlock_kernel();
631 return 0; 639 return 0;
632} 640}
633 641
@@ -635,18 +643,23 @@ static int x25_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
635{ 643{
636 struct sock *sk = sock->sk; 644 struct sock *sk = sock->sk;
637 struct sockaddr_x25 *addr = (struct sockaddr_x25 *)uaddr; 645 struct sockaddr_x25 *addr = (struct sockaddr_x25 *)uaddr;
646 int rc = 0;
638 647
648 lock_kernel();
639 if (!sock_flag(sk, SOCK_ZAPPED) || 649 if (!sock_flag(sk, SOCK_ZAPPED) ||
640 addr_len != sizeof(struct sockaddr_x25) || 650 addr_len != sizeof(struct sockaddr_x25) ||
641 addr->sx25_family != AF_X25) 651 addr->sx25_family != AF_X25) {
642 return -EINVAL; 652 rc = -EINVAL;
653 goto out;
654 }
643 655
644 x25_sk(sk)->source_addr = addr->sx25_addr; 656 x25_sk(sk)->source_addr = addr->sx25_addr;
645 x25_insert_socket(sk); 657 x25_insert_socket(sk);
646 sock_reset_flag(sk, SOCK_ZAPPED); 658 sock_reset_flag(sk, SOCK_ZAPPED);
647 SOCK_DEBUG(sk, "x25_bind: socket is bound\n"); 659 SOCK_DEBUG(sk, "x25_bind: socket is bound\n");
648 660out:
649 return 0; 661 unlock_kernel();
662 return rc;
650} 663}
651 664
652static int x25_wait_for_connection_establishment(struct sock *sk) 665static int x25_wait_for_connection_establishment(struct sock *sk)
@@ -687,6 +700,7 @@ static int x25_connect(struct socket *sock, struct sockaddr *uaddr,
687 struct x25_route *rt; 700 struct x25_route *rt;
688 int rc = 0; 701 int rc = 0;
689 702
703 lock_kernel();
690 lock_sock(sk); 704 lock_sock(sk);
691 if (sk->sk_state == TCP_ESTABLISHED && sock->state == SS_CONNECTING) { 705 if (sk->sk_state == TCP_ESTABLISHED && sock->state == SS_CONNECTING) {
692 sock->state = SS_CONNECTED; 706 sock->state = SS_CONNECTED;
@@ -764,6 +778,7 @@ out_put_route:
764 x25_route_put(rt); 778 x25_route_put(rt);
765out: 779out:
766 release_sock(sk); 780 release_sock(sk);
781 unlock_kernel();
767 return rc; 782 return rc;
768} 783}
769 784
@@ -803,6 +818,7 @@ static int x25_accept(struct socket *sock, struct socket *newsock, int flags)
803 struct sk_buff *skb; 818 struct sk_buff *skb;
804 int rc = -EINVAL; 819 int rc = -EINVAL;
805 820
821 lock_kernel();
806 if (!sk || sk->sk_state != TCP_LISTEN) 822 if (!sk || sk->sk_state != TCP_LISTEN)
807 goto out; 823 goto out;
808 824
@@ -830,6 +846,7 @@ static int x25_accept(struct socket *sock, struct socket *newsock, int flags)
830out2: 846out2:
831 release_sock(sk); 847 release_sock(sk);
832out: 848out:
849 unlock_kernel();
833 return rc; 850 return rc;
834} 851}
835 852
@@ -839,10 +856,14 @@ static int x25_getname(struct socket *sock, struct sockaddr *uaddr,
839 struct sockaddr_x25 *sx25 = (struct sockaddr_x25 *)uaddr; 856 struct sockaddr_x25 *sx25 = (struct sockaddr_x25 *)uaddr;
840 struct sock *sk = sock->sk; 857 struct sock *sk = sock->sk;
841 struct x25_sock *x25 = x25_sk(sk); 858 struct x25_sock *x25 = x25_sk(sk);
859 int rc = 0;
842 860
861 lock_kernel();
843 if (peer) { 862 if (peer) {
844 if (sk->sk_state != TCP_ESTABLISHED) 863 if (sk->sk_state != TCP_ESTABLISHED) {
845 return -ENOTCONN; 864 rc = -ENOTCONN;
865 goto out;
866 }
846 sx25->sx25_addr = x25->dest_addr; 867 sx25->sx25_addr = x25->dest_addr;
847 } else 868 } else
848 sx25->sx25_addr = x25->source_addr; 869 sx25->sx25_addr = x25->source_addr;
@@ -850,7 +871,21 @@ static int x25_getname(struct socket *sock, struct sockaddr *uaddr,
850 sx25->sx25_family = AF_X25; 871 sx25->sx25_family = AF_X25;
851 *uaddr_len = sizeof(*sx25); 872 *uaddr_len = sizeof(*sx25);
852 873
853 return 0; 874out:
875 unlock_kernel();
876 return rc;
877}
878
879static unsigned int x25_datagram_poll(struct file *file, struct socket *sock,
880 poll_table *wait)
881{
882 int rc;
883
884 lock_kernel();
885 rc = datagram_poll(file, sock, wait);
886 unlock_kernel();
887
888 return rc;
854} 889}
855 890
856int x25_rx_call_request(struct sk_buff *skb, struct x25_neigh *nb, 891int x25_rx_call_request(struct sk_buff *skb, struct x25_neigh *nb,
@@ -1003,6 +1038,7 @@ static int x25_sendmsg(struct kiocb *iocb, struct socket *sock,
1003 size_t size; 1038 size_t size;
1004 int qbit = 0, rc = -EINVAL; 1039 int qbit = 0, rc = -EINVAL;
1005 1040
1041 lock_kernel();
1006 if (msg->msg_flags & ~(MSG_DONTWAIT|MSG_OOB|MSG_EOR|MSG_CMSG_COMPAT)) 1042 if (msg->msg_flags & ~(MSG_DONTWAIT|MSG_OOB|MSG_EOR|MSG_CMSG_COMPAT))
1007 goto out; 1043 goto out;
1008 1044
@@ -1167,6 +1203,7 @@ static int x25_sendmsg(struct kiocb *iocb, struct socket *sock,
1167 release_sock(sk); 1203 release_sock(sk);
1168 rc = len; 1204 rc = len;
1169out: 1205out:
1206 unlock_kernel();
1170 return rc; 1207 return rc;
1171out_kfree_skb: 1208out_kfree_skb:
1172 kfree_skb(skb); 1209 kfree_skb(skb);
@@ -1187,6 +1224,7 @@ static int x25_recvmsg(struct kiocb *iocb, struct socket *sock,
1187 unsigned char *asmptr; 1224 unsigned char *asmptr;
1188 int rc = -ENOTCONN; 1225 int rc = -ENOTCONN;
1189 1226
1227 lock_kernel();
1190 /* 1228 /*
1191 * This works for seqpacket too. The receiver has ordered the queue for 1229 * This works for seqpacket too. The receiver has ordered the queue for
1192 * us! We do one quick check first though 1230 * us! We do one quick check first though
@@ -1260,6 +1298,7 @@ static int x25_recvmsg(struct kiocb *iocb, struct socket *sock,
1260out_free_dgram: 1298out_free_dgram:
1261 skb_free_datagram(sk, skb); 1299 skb_free_datagram(sk, skb);
1262out: 1300out:
1301 unlock_kernel();
1263 return rc; 1302 return rc;
1264} 1303}
1265 1304
@@ -1271,6 +1310,7 @@ static int x25_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
1271 void __user *argp = (void __user *)arg; 1310 void __user *argp = (void __user *)arg;
1272 int rc; 1311 int rc;
1273 1312
1313 lock_kernel();
1274 switch (cmd) { 1314 switch (cmd) {
1275 case TIOCOUTQ: { 1315 case TIOCOUTQ: {
1276 int amount = sk->sk_sndbuf - sk_wmem_alloc_get(sk); 1316 int amount = sk->sk_sndbuf - sk_wmem_alloc_get(sk);
@@ -1473,6 +1513,7 @@ static int x25_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
1473 rc = -ENOIOCTLCMD; 1513 rc = -ENOIOCTLCMD;
1474 break; 1514 break;
1475 } 1515 }
1516 unlock_kernel();
1476 1517
1477 return rc; 1518 return rc;
1478} 1519}
@@ -1543,15 +1584,19 @@ static int compat_x25_ioctl(struct socket *sock, unsigned int cmd,
1543 break; 1584 break;
1544 case SIOCGSTAMP: 1585 case SIOCGSTAMP:
1545 rc = -EINVAL; 1586 rc = -EINVAL;
1587 lock_kernel();
1546 if (sk) 1588 if (sk)
1547 rc = compat_sock_get_timestamp(sk, 1589 rc = compat_sock_get_timestamp(sk,
1548 (struct timeval __user*)argp); 1590 (struct timeval __user*)argp);
1591 unlock_kernel();
1549 break; 1592 break;
1550 case SIOCGSTAMPNS: 1593 case SIOCGSTAMPNS:
1551 rc = -EINVAL; 1594 rc = -EINVAL;
1595 lock_kernel();
1552 if (sk) 1596 if (sk)
1553 rc = compat_sock_get_timestampns(sk, 1597 rc = compat_sock_get_timestampns(sk,
1554 (struct timespec __user*)argp); 1598 (struct timespec __user*)argp);
1599 unlock_kernel();
1555 break; 1600 break;
1556 case SIOCGIFADDR: 1601 case SIOCGIFADDR:
1557 case SIOCSIFADDR: 1602 case SIOCSIFADDR:
@@ -1570,16 +1615,22 @@ static int compat_x25_ioctl(struct socket *sock, unsigned int cmd,
1570 rc = -EPERM; 1615 rc = -EPERM;
1571 if (!capable(CAP_NET_ADMIN)) 1616 if (!capable(CAP_NET_ADMIN))
1572 break; 1617 break;
1618 lock_kernel();
1573 rc = x25_route_ioctl(cmd, argp); 1619 rc = x25_route_ioctl(cmd, argp);
1620 unlock_kernel();
1574 break; 1621 break;
1575 case SIOCX25GSUBSCRIP: 1622 case SIOCX25GSUBSCRIP:
1623 lock_kernel();
1576 rc = compat_x25_subscr_ioctl(cmd, argp); 1624 rc = compat_x25_subscr_ioctl(cmd, argp);
1625 unlock_kernel();
1577 break; 1626 break;
1578 case SIOCX25SSUBSCRIP: 1627 case SIOCX25SSUBSCRIP:
1579 rc = -EPERM; 1628 rc = -EPERM;
1580 if (!capable(CAP_NET_ADMIN)) 1629 if (!capable(CAP_NET_ADMIN))
1581 break; 1630 break;
1631 lock_kernel();
1582 rc = compat_x25_subscr_ioctl(cmd, argp); 1632 rc = compat_x25_subscr_ioctl(cmd, argp);
1633 unlock_kernel();
1583 break; 1634 break;
1584 case SIOCX25GFACILITIES: 1635 case SIOCX25GFACILITIES:
1585 case SIOCX25SFACILITIES: 1636 case SIOCX25SFACILITIES:
@@ -1601,7 +1652,7 @@ static int compat_x25_ioctl(struct socket *sock, unsigned int cmd,
1601} 1652}
1602#endif 1653#endif
1603 1654
1604static const struct proto_ops SOCKOPS_WRAPPED(x25_proto_ops) = { 1655static const struct proto_ops x25_proto_ops = {
1605 .family = AF_X25, 1656 .family = AF_X25,
1606 .owner = THIS_MODULE, 1657 .owner = THIS_MODULE,
1607 .release = x25_release, 1658 .release = x25_release,
@@ -1610,7 +1661,7 @@ static const struct proto_ops SOCKOPS_WRAPPED(x25_proto_ops) = {
1610 .socketpair = sock_no_socketpair, 1661 .socketpair = sock_no_socketpair,
1611 .accept = x25_accept, 1662 .accept = x25_accept,
1612 .getname = x25_getname, 1663 .getname = x25_getname,
1613 .poll = datagram_poll, 1664 .poll = x25_datagram_poll,
1614 .ioctl = x25_ioctl, 1665 .ioctl = x25_ioctl,
1615#ifdef CONFIG_COMPAT 1666#ifdef CONFIG_COMPAT
1616 .compat_ioctl = compat_x25_ioctl, 1667 .compat_ioctl = compat_x25_ioctl,
@@ -1625,8 +1676,6 @@ static const struct proto_ops SOCKOPS_WRAPPED(x25_proto_ops) = {
1625 .sendpage = sock_no_sendpage, 1676 .sendpage = sock_no_sendpage,
1626}; 1677};
1627 1678
1628SOCKOPS_WRAP(x25_proto, AF_X25);
1629
1630static struct packet_type x25_packet_type __read_mostly = { 1679static struct packet_type x25_packet_type __read_mostly = {
1631 .type = cpu_to_be16(ETH_P_X25), 1680 .type = cpu_to_be16(ETH_P_X25),
1632 .func = x25_lapb_receive_frame, 1681 .func = x25_lapb_receive_frame,