#include <linux/uio.h>
 #include <linux/slab.h>
 #include <linux/skbuff.h>
-#include <linux/smp_lock.h>
 #include <linux/socket.h>
 #include <linux/sockios.h>
 #include <linux/string.h>
        int opt;
        int rc = -EINVAL;
 
-       lock_kernel();
+       lock_sock(sk);
        if (optlen != sizeof(int))
                goto out;
 
        ipx_sk(sk)->type = opt;
        rc = 0;
 out:
-       unlock_kernel();
+       release_sock(sk);
        return rc;
 }
 
        int len;
        int rc = -ENOPROTOOPT;
 
-       lock_kernel();
+       lock_sock(sk);
        if (!(level == SOL_IPX && optname == IPX_TYPE))
                goto out;
 
 
        rc = 0;
 out:
-       unlock_kernel();
+       release_sock(sk);
        return rc;
 }
 
        if (!sk)
                goto out;
 
-       lock_kernel();
+       lock_sock(sk);
        if (!sock_flag(sk, SOCK_DEAD))
                sk->sk_state_change(sk);
 
        sock->sk = NULL;
        sk_refcnt_debug_release(sk);
        ipx_destroy_socket(sk);
-       unlock_kernel();
+       release_sock(sk);
 out:
        return 0;
 }
 
 static int ipx_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
 {
+       struct sock *sk = sock->sk;
        int rc;
 
-       lock_kernel();
+       lock_sock(sk);
        rc = __ipx_bind(sock, uaddr, addr_len);
-       unlock_kernel();
+       release_sock(sk);
 
        return rc;
 }
        sk->sk_state    = TCP_CLOSE;
        sock->state     = SS_UNCONNECTED;
 
-       lock_kernel();
+       lock_sock(sk);
        if (addr_len != sizeof(*addr))
                goto out;
        addr = (struct sockaddr_ipx *)uaddr;
                ipxrtr_put(rt);
        rc = 0;
 out:
-       unlock_kernel();
+       release_sock(sk);
        return rc;
 }
 
 
        *uaddr_len = sizeof(struct sockaddr_ipx);
 
-       lock_kernel();
+       lock_sock(sk);
        if (peer) {
                rc = -ENOTCONN;
                if (sk->sk_state != TCP_ESTABLISHED)
 
        rc = 0;
 out:
-       unlock_kernel();
-       return rc;
-}
-
-static unsigned int ipx_datagram_poll(struct file *file, struct socket *sock,
-                          poll_table *wait)
-{
-       int rc;
-
-       lock_kernel();
-       rc = datagram_poll(file, sock, wait);
-       unlock_kernel();
-
+       release_sock(sk);
        return rc;
 }
 
        int rc = -EINVAL;
        int flags = msg->msg_flags;
 
-       lock_kernel();
+       lock_sock(sk);
        /* Socket gets bound below anyway */
 /*     if (sk->sk_zapped)
                return -EIO; */ /* Socket not bound */
        if (rc >= 0)
                rc = len;
 out:
-       unlock_kernel();
+       release_sock(sk);
        return rc;
 }
 
        struct sk_buff *skb;
        int copied, rc;
 
-       lock_kernel();
+       lock_sock(sk);
        /* put the autobinding in */
        if (!ipxs->port) {
                struct sockaddr_ipx uaddr;
 out_free:
        skb_free_datagram(sk, skb);
 out:
-       unlock_kernel();
+       release_sock(sk);
        return rc;
 }
 
        struct sock *sk = sock->sk;
        void __user *argp = (void __user *)arg;
 
-       lock_kernel();
+       lock_sock(sk);
        switch (cmd) {
        case TIOCOUTQ:
                amount = sk->sk_sndbuf - sk_wmem_alloc_get(sk);
                rc = -ENOIOCTLCMD;
                break;
        }
-       unlock_kernel();
+       release_sock(sk);
 
        return rc;
 }
        .socketpair     = sock_no_socketpair,
        .accept         = sock_no_accept,
        .getname        = ipx_getname,
-       .poll           = ipx_datagram_poll,
+       .poll           = datagram_poll,
        .ioctl          = ipx_ioctl,
 #ifdef CONFIG_COMPAT
        .compat_ioctl   = ipx_compat_ioctl,