aboutsummaryrefslogtreecommitdiffstats
path: root/net/appletalk/ddp.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/appletalk/ddp.c')
-rw-r--r--net/appletalk/ddp.c44
1 files changed, 20 insertions, 24 deletions
diff --git a/net/appletalk/ddp.c b/net/appletalk/ddp.c
index c410b93fda2e..956a5302002a 100644
--- a/net/appletalk/ddp.c
+++ b/net/appletalk/ddp.c
@@ -54,7 +54,6 @@
54#include <linux/capability.h> 54#include <linux/capability.h>
55#include <linux/module.h> 55#include <linux/module.h>
56#include <linux/if_arp.h> 56#include <linux/if_arp.h>
57#include <linux/smp_lock.h>
58#include <linux/termios.h> /* For TIOCOUTQ/INQ */ 57#include <linux/termios.h> /* For TIOCOUTQ/INQ */
59#include <linux/compat.h> 58#include <linux/compat.h>
60#include <linux/slab.h> 59#include <linux/slab.h>
@@ -1052,13 +1051,17 @@ static int atalk_release(struct socket *sock)
1052{ 1051{
1053 struct sock *sk = sock->sk; 1052 struct sock *sk = sock->sk;
1054 1053
1055 lock_kernel();
1056 if (sk) { 1054 if (sk) {
1055 sock_hold(sk);
1056 lock_sock(sk);
1057
1057 sock_orphan(sk); 1058 sock_orphan(sk);
1058 sock->sk = NULL; 1059 sock->sk = NULL;
1059 atalk_destroy_socket(sk); 1060 atalk_destroy_socket(sk);
1061
1062 release_sock(sk);
1063 sock_put(sk);
1060 } 1064 }
1061 unlock_kernel();
1062 return 0; 1065 return 0;
1063} 1066}
1064 1067
@@ -1143,7 +1146,7 @@ static int atalk_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
1143 if (addr->sat_family != AF_APPLETALK) 1146 if (addr->sat_family != AF_APPLETALK)
1144 return -EAFNOSUPPORT; 1147 return -EAFNOSUPPORT;
1145 1148
1146 lock_kernel(); 1149 lock_sock(sk);
1147 if (addr->sat_addr.s_net == htons(ATADDR_ANYNET)) { 1150 if (addr->sat_addr.s_net == htons(ATADDR_ANYNET)) {
1148 struct atalk_addr *ap = atalk_find_primary(); 1151 struct atalk_addr *ap = atalk_find_primary();
1149 1152
@@ -1179,7 +1182,7 @@ static int atalk_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
1179 sock_reset_flag(sk, SOCK_ZAPPED); 1182 sock_reset_flag(sk, SOCK_ZAPPED);
1180 err = 0; 1183 err = 0;
1181out: 1184out:
1182 unlock_kernel(); 1185 release_sock(sk);
1183 return err; 1186 return err;
1184} 1187}
1185 1188
@@ -1215,7 +1218,7 @@ static int atalk_connect(struct socket *sock, struct sockaddr *uaddr,
1215#endif 1218#endif
1216 } 1219 }
1217 1220
1218 lock_kernel(); 1221 lock_sock(sk);
1219 err = -EBUSY; 1222 err = -EBUSY;
1220 if (sock_flag(sk, SOCK_ZAPPED)) 1223 if (sock_flag(sk, SOCK_ZAPPED))
1221 if (atalk_autobind(sk) < 0) 1224 if (atalk_autobind(sk) < 0)
@@ -1233,7 +1236,7 @@ static int atalk_connect(struct socket *sock, struct sockaddr *uaddr,
1233 sk->sk_state = TCP_ESTABLISHED; 1236 sk->sk_state = TCP_ESTABLISHED;
1234 err = 0; 1237 err = 0;
1235out: 1238out:
1236 unlock_kernel(); 1239 release_sock(sk);
1237 return err; 1240 return err;
1238} 1241}
1239 1242
@@ -1249,7 +1252,7 @@ static int atalk_getname(struct socket *sock, struct sockaddr *uaddr,
1249 struct atalk_sock *at = at_sk(sk); 1252 struct atalk_sock *at = at_sk(sk);
1250 int err; 1253 int err;
1251 1254
1252 lock_kernel(); 1255 lock_sock(sk);
1253 err = -ENOBUFS; 1256 err = -ENOBUFS;
1254 if (sock_flag(sk, SOCK_ZAPPED)) 1257 if (sock_flag(sk, SOCK_ZAPPED))
1255 if (atalk_autobind(sk) < 0) 1258 if (atalk_autobind(sk) < 0)
@@ -1277,17 +1280,7 @@ static int atalk_getname(struct socket *sock, struct sockaddr *uaddr,
1277 memcpy(uaddr, &sat, sizeof(sat)); 1280 memcpy(uaddr, &sat, sizeof(sat));
1278 1281
1279out: 1282out:
1280 unlock_kernel(); 1283 release_sock(sk);
1281 return err;
1282}
1283
1284static unsigned int atalk_poll(struct file *file, struct socket *sock,
1285 poll_table *wait)
1286{
1287 int err;
1288 lock_kernel();
1289 err = datagram_poll(file, sock, wait);
1290 unlock_kernel();
1291 return err; 1284 return err;
1292} 1285}
1293 1286
@@ -1596,7 +1589,7 @@ static int atalk_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr
1596 if (len > DDP_MAXSZ) 1589 if (len > DDP_MAXSZ)
1597 return -EMSGSIZE; 1590 return -EMSGSIZE;
1598 1591
1599 lock_kernel(); 1592 lock_sock(sk);
1600 if (usat) { 1593 if (usat) {
1601 err = -EBUSY; 1594 err = -EBUSY;
1602 if (sock_flag(sk, SOCK_ZAPPED)) 1595 if (sock_flag(sk, SOCK_ZAPPED))
@@ -1651,7 +1644,9 @@ static int atalk_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr
1651 sk, size, dev->name); 1644 sk, size, dev->name);
1652 1645
1653 size += dev->hard_header_len; 1646 size += dev->hard_header_len;
1647 release_sock(sk);
1654 skb = sock_alloc_send_skb(sk, size, (flags & MSG_DONTWAIT), &err); 1648 skb = sock_alloc_send_skb(sk, size, (flags & MSG_DONTWAIT), &err);
1649 lock_sock(sk);
1655 if (!skb) 1650 if (!skb)
1656 goto out; 1651 goto out;
1657 1652
@@ -1738,7 +1733,7 @@ static int atalk_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr
1738 SOCK_DEBUG(sk, "SK %p: Done write (%Zd).\n", sk, len); 1733 SOCK_DEBUG(sk, "SK %p: Done write (%Zd).\n", sk, len);
1739 1734
1740out: 1735out:
1741 unlock_kernel(); 1736 release_sock(sk);
1742 return err ? : len; 1737 return err ? : len;
1743} 1738}
1744 1739
@@ -1753,9 +1748,10 @@ static int atalk_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr
1753 int err = 0; 1748 int err = 0;
1754 struct sk_buff *skb; 1749 struct sk_buff *skb;
1755 1750
1756 lock_kernel();
1757 skb = skb_recv_datagram(sk, flags & ~MSG_DONTWAIT, 1751 skb = skb_recv_datagram(sk, flags & ~MSG_DONTWAIT,
1758 flags & MSG_DONTWAIT, &err); 1752 flags & MSG_DONTWAIT, &err);
1753 lock_sock(sk);
1754
1759 if (!skb) 1755 if (!skb)
1760 goto out; 1756 goto out;
1761 1757
@@ -1787,7 +1783,7 @@ static int atalk_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr
1787 skb_free_datagram(sk, skb); /* Free the datagram. */ 1783 skb_free_datagram(sk, skb); /* Free the datagram. */
1788 1784
1789out: 1785out:
1790 unlock_kernel(); 1786 release_sock(sk);
1791 return err ? : copied; 1787 return err ? : copied;
1792} 1788}
1793 1789
@@ -1887,7 +1883,7 @@ static const struct proto_ops atalk_dgram_ops = {
1887 .socketpair = sock_no_socketpair, 1883 .socketpair = sock_no_socketpair,
1888 .accept = sock_no_accept, 1884 .accept = sock_no_accept,
1889 .getname = atalk_getname, 1885 .getname = atalk_getname,
1890 .poll = atalk_poll, 1886 .poll = datagram_poll,
1891 .ioctl = atalk_ioctl, 1887 .ioctl = atalk_ioctl,
1892#ifdef CONFIG_COMPAT 1888#ifdef CONFIG_COMPAT
1893 .compat_ioctl = atalk_compat_ioctl, 1889 .compat_ioctl = atalk_compat_ioctl,