[IrDA] af_irda: IRDA_ASSERT cleanups
[safe/jmp/linux-2.6] / net / irda / af_irda.c
index fbfa967..06c97c6 100644 (file)
@@ -42,7 +42,7 @@
  *
  ********************************************************************/
 
-#include <linux/config.h>
+#include <linux/capability.h>
 #include <linux/module.h>
 #include <linux/types.h>
 #include <linux/socket.h>
@@ -89,7 +89,6 @@ static int irda_data_indication(void *instance, void *sap, struct sk_buff *skb)
 
        self = instance;
        sk = instance;
-       IRDA_ASSERT(sk != NULL, return -1;);
 
        err = sock_queue_rcv_skb(sk, skb);
        if (err) {
@@ -131,14 +130,12 @@ static void irda_disconnect_indication(void *instance, void *sap,
        }
 
        /* Prevent race conditions with irda_release() and irda_shutdown() */
+       bh_lock_sock(sk);
        if (!sock_flag(sk, SOCK_DEAD) && sk->sk_state != TCP_CLOSE) {
                sk->sk_state     = TCP_CLOSE;
-               sk->sk_err       = ECONNRESET;
                sk->sk_shutdown |= SEND_SHUTDOWN;
 
                sk->sk_state_change(sk);
-               /* Uh-oh... Should use sock_orphan ? */
-                sock_set_flag(sk, SOCK_DEAD);
 
                /* Close our TSAP.
                 * If we leave it open, IrLMP put it back into the list of
@@ -157,7 +154,8 @@ static void irda_disconnect_indication(void *instance, void *sap,
                        irttp_close_tsap(self->tsap);
                        self->tsap = NULL;
                }
-        }
+       }
+       bh_unlock_sock(sk);
 
        /* Note : once we are there, there is not much you want to do
         * with the socket anymore, apart from closing it.
@@ -220,7 +218,7 @@ static void irda_connect_confirm(void *instance, void *sap,
                break;
        default:
                self->max_data_size = irttp_get_max_seg_size(self->tsap);
-       };
+       }
 
        IRDA_DEBUG(2, "%s(), max_data_size=%d\n", __FUNCTION__,
                   self->max_data_size);
@@ -283,7 +281,7 @@ static void irda_connect_indication(void *instance, void *sap,
                break;
        default:
                self->max_data_size = irttp_get_max_seg_size(self->tsap);
-       };
+       }
 
        IRDA_DEBUG(2, "%s(), max_data_size=%d\n", __FUNCTION__,
                   self->max_data_size);
@@ -306,9 +304,8 @@ static void irda_connect_response(struct irda_sock *self)
 
        IRDA_DEBUG(2, "%s()\n", __FUNCTION__);
 
-       IRDA_ASSERT(self != NULL, return;);
-
-       skb = dev_alloc_skb(64);
+       skb = alloc_skb(TTP_MAX_HEADER + TTP_SAR_HEADER,
+                       GFP_ATOMIC);
        if (skb == NULL) {
                IRDA_DEBUG(0, "%s() Unable to allocate sk_buff!\n",
                           __FUNCTION__);
@@ -336,7 +333,7 @@ static void irda_flow_indication(void *instance, void *sap, LOCAL_FLOW flow)
 
        self = instance;
        sk = instance;
-       IRDA_ASSERT(sk != NULL, return;);
+       BUG_ON(sk == NULL);
 
        switch (flow) {
        case FLOW_STOP:
@@ -448,7 +445,7 @@ static void irda_discovery_timeout(u_long priv)
        IRDA_DEBUG(2, "%s()\n", __FUNCTION__);
 
        self = (struct irda_sock *) priv;
-       IRDA_ASSERT(self != NULL, return;);
+       BUG_ON(self == NULL);
 
        /* Nothing for the caller */
        self->cachelog = NULL;
@@ -545,8 +542,6 @@ static int irda_find_lsap_sel(struct irda_sock *self, char *name)
 {
        IRDA_DEBUG(2, "%s(%p, %s)\n", __FUNCTION__, self, name);
 
-       IRDA_ASSERT(self != NULL, return -1;);
-
        if (self->iriap) {
                IRDA_WARNING("%s(): busy with a previous query\n",
                             __FUNCTION__);
@@ -634,8 +629,6 @@ static int irda_discover_daddr_and_lsap_sel(struct irda_sock *self, char *name)
 
        IRDA_DEBUG(2, "%s(), name=%s\n", __FUNCTION__, name);
 
-       IRDA_ASSERT(self != NULL, return -1;);
-
        /* Ask lmp for the current discovery log
         * Note : we have to use irlmp_get_discoveries(), as opposed
         * to play with the cachelog directly, because while we are
@@ -783,8 +776,6 @@ static int irda_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
        struct irda_sock *self = irda_sk(sk);
        int err;
 
-       IRDA_ASSERT(self != NULL, return -1;);
-
        IRDA_DEBUG(2, "%s(%p)\n", __FUNCTION__, self);
 
        if (addr_len != sizeof(struct sockaddr_irda))
@@ -840,8 +831,6 @@ static int irda_accept(struct socket *sock, struct socket *newsock, int flags)
 
        IRDA_DEBUG(2, "%s()\n", __FUNCTION__);
 
-       IRDA_ASSERT(self != NULL, return -1;);
-
        err = irda_create(newsock, sk->sk_protocol);
        if (err)
                return err;
@@ -872,44 +861,28 @@ static int irda_accept(struct socket *sock, struct socket *newsock, int flags)
         * calling us, the data is waiting for us ;-)
         * Jean II
         */
-       skb = skb_dequeue(&sk->sk_receive_queue);
-       if (skb == NULL) {
-               int ret = 0;
-               DECLARE_WAITQUEUE(waitq, current);
+       while (1) {
+               skb = skb_dequeue(&sk->sk_receive_queue);
+               if (skb)
+                       break;
 
                /* Non blocking operation */
                if (flags & O_NONBLOCK)
                        return -EWOULDBLOCK;
 
-               /* The following code is a cut'n'paste of the
-                * wait_event_interruptible() macro.
-                * We don't us the macro because the condition has
-                * side effects : we want to make sure that only one
-                * skb get dequeued - Jean II */
-               add_wait_queue(sk->sk_sleep, &waitq);
-               for (;;) {
-                       set_current_state(TASK_INTERRUPTIBLE);
-                       skb = skb_dequeue(&sk->sk_receive_queue);
-                       if (skb != NULL)
-                               break;
-                       if (!signal_pending(current)) {
-                               schedule();
-                               continue;
-                       }
-                       ret = -ERESTARTSYS;
-                       break;
-               }
-               current->state = TASK_RUNNING;
-               remove_wait_queue(sk->sk_sleep, &waitq);
-               if(ret)
-                       return -ERESTARTSYS;
+               err = wait_event_interruptible(*(sk->sk_sleep),
+                                       skb_peek(&sk->sk_receive_queue));
+               if (err)
+                       return err;
        }
 
        newsk = newsock->sk;
+       if (newsk == NULL)
+               return -EIO;
+
        newsk->sk_state = TCP_ESTABLISHED;
 
        new = irda_sk(newsk);
-       IRDA_ASSERT(new != NULL, return -1;);
 
        /* Now attach up the new socket */
        new->tsap = irttp_dup(self->tsap, new);
@@ -1060,7 +1033,8 @@ static int irda_connect(struct socket *sock, struct sockaddr *uaddr,
 
        if (sk->sk_state != TCP_ESTABLISHED) {
                sock->state = SS_UNCONNECTED;
-               return sock_error(sk);  /* Always set at this point */
+               err = sock_error(sk);
+               return err? err : -ECONNRESET;
        }
 
        sock->state = SS_CONNECTED;
@@ -1170,8 +1144,6 @@ static void irda_destroy_socket(struct irda_sock *self)
 {
        IRDA_DEBUG(2, "%s(%p)\n", __FUNCTION__, self);
 
-       IRDA_ASSERT(self != NULL, return;);
-
        /* Unregister with IrLMP */
        irlmp_unregister_client(self->ckey);
        irlmp_unregister_service(self->skey);
@@ -1209,9 +1181,10 @@ static int irda_release(struct socket *sock)
 
        IRDA_DEBUG(2, "%s()\n", __FUNCTION__);
 
-        if (sk == NULL)
+       if (sk == NULL)
                return 0;
 
+       lock_sock(sk);
        sk->sk_state       = TCP_CLOSE;
        sk->sk_shutdown   |= SEND_SHUTDOWN;
        sk->sk_state_change(sk);
@@ -1221,6 +1194,7 @@ static int irda_release(struct socket *sock)
 
        sock_orphan(sk);
        sock->sk   = NULL;
+       release_sock(sk);
 
        /* Purge queues (see sock_init_data()) */
        skb_queue_purge(&sk->sk_receive_queue);
@@ -1255,7 +1229,7 @@ static int irda_release(struct socket *sock)
         * memory leak is now gone... - Jean II
         */
 
-        return 0;
+       return 0;
 }
 
 /*
@@ -1271,7 +1245,6 @@ static int irda_sendmsg(struct kiocb *iocb, struct socket *sock,
        struct sock *sk = sock->sk;
        struct irda_sock *self;
        struct sk_buff *skb;
-       unsigned char *asmptr;
        int err;
 
        IRDA_DEBUG(4, "%s(), len=%zd\n", __FUNCTION__, len);
@@ -1289,7 +1262,6 @@ static int irda_sendmsg(struct kiocb *iocb, struct socket *sock,
                return -ENOTCONN;
 
        self = irda_sk(sk);
-       IRDA_ASSERT(self != NULL, return -1;);
 
        /* Check if IrTTP is wants us to slow down */
 
@@ -1301,22 +1273,22 @@ static int irda_sendmsg(struct kiocb *iocb, struct socket *sock,
        if (sk->sk_state != TCP_ESTABLISHED)
                return -ENOTCONN;
 
-       /* Check that we don't send out to big frames */
+       /* Check that we don't send out too big frames */
        if (len > self->max_data_size) {
                IRDA_DEBUG(2, "%s(), Chopping frame from %zd to %d bytes!\n",
                           __FUNCTION__, len, self->max_data_size);
                len = self->max_data_size;
        }
 
-       skb = sock_alloc_send_skb(sk, len + self->max_header_size + 16, 
+       skb = sock_alloc_send_skb(sk, len + self->max_header_size + 16,
                                  msg->msg_flags & MSG_DONTWAIT, &err);
        if (!skb)
                return -ENOBUFS;
 
        skb_reserve(skb, self->max_header_size + 16);
-
-       asmptr = skb->h.raw = skb_put(skb, len);
-       err = memcpy_fromiovec(asmptr, msg->msg_iov, len);
+       skb_reset_transport_header(skb);
+       skb_put(skb, len);
+       err = memcpy_fromiovec(skb_transport_header(skb), msg->msg_iov, len);
        if (err) {
                kfree_skb(skb);
                return err;
@@ -1352,15 +1324,16 @@ static int irda_recvmsg_dgram(struct kiocb *iocb, struct socket *sock,
 
        IRDA_DEBUG(4, "%s()\n", __FUNCTION__);
 
-       IRDA_ASSERT(self != NULL, return -1;);
+       if ((err = sock_error(sk)) < 0)
+               return err;
 
        skb = skb_recv_datagram(sk, flags & ~MSG_DONTWAIT,
                                flags & MSG_DONTWAIT, &err);
        if (!skb)
                return err;
 
-       skb->h.raw = skb->data;
-       copied     = skb->len;
+       skb_reset_transport_header(skb);
+       copied = skb->len;
 
        if (copied > size) {
                IRDA_DEBUG(2, "%s(), Received truncated frame (%zd < %zd)!\n",
@@ -1399,12 +1372,13 @@ static int irda_recvmsg_stream(struct kiocb *iocb, struct socket *sock,
        struct irda_sock *self = irda_sk(sk);
        int noblock = flags & MSG_DONTWAIT;
        size_t copied = 0;
-       int target = 1;
-       DECLARE_WAITQUEUE(waitq, current);
+       int target, err;
+       long timeo;
 
        IRDA_DEBUG(3, "%s()\n", __FUNCTION__);
 
-       IRDA_ASSERT(self != NULL, return -1;);
+       if ((err = sock_error(sk)) < 0)
+               return err;
 
        if (sock->flags & __SO_ACCEPTCON)
                return(-EINVAL);
@@ -1412,8 +1386,8 @@ static int irda_recvmsg_stream(struct kiocb *iocb, struct socket *sock,
        if (flags & MSG_OOB)
                return -EOPNOTSUPP;
 
-       if (flags & MSG_WAITALL)
-               target = size;
+       target = sock_rcvlowat(sk, flags & MSG_WAITALL, size);
+       timeo = sock_rcvtimeo(sk, noblock);
 
        msg->msg_namelen = 0;
 
@@ -1421,42 +1395,37 @@ static int irda_recvmsg_stream(struct kiocb *iocb, struct socket *sock,
                int chunk;
                struct sk_buff *skb = skb_dequeue(&sk->sk_receive_queue);
 
-               if (skb==NULL) {
+               if (skb == NULL) {
+                       DEFINE_WAIT(wait);
                        int ret = 0;
 
                        if (copied >= target)
                                break;
 
-                       /* The following code is a cut'n'paste of the
-                        * wait_event_interruptible() macro.
-                        * We don't us the macro because the test condition
-                        * is messy. - Jean II */
-                       set_bit(SOCK_ASYNC_WAITDATA, &sk->sk_socket->flags);
-                       add_wait_queue(sk->sk_sleep, &waitq);
-                       set_current_state(TASK_INTERRUPTIBLE);
+                       prepare_to_wait_exclusive(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE);
 
                        /*
                         *      POSIX 1003.1g mandates this order.
                         */
                        ret = sock_error(sk);
                        if (ret)
-                               break;
+                               ;
                        else if (sk->sk_shutdown & RCV_SHUTDOWN)
                                ;
                        else if (noblock)
                                ret = -EAGAIN;
                        else if (signal_pending(current))
-                               ret = -ERESTARTSYS;
+                               ret = sock_intr_errno(timeo);
+                       else if (sk->sk_state != TCP_ESTABLISHED)
+                               ret = -ENOTCONN;
                        else if (skb_peek(&sk->sk_receive_queue) == NULL)
                                /* Wait process until data arrives */
                                schedule();
 
-                       current->state = TASK_RUNNING;
-                       remove_wait_queue(sk->sk_sleep, &waitq);
-                       clear_bit(SOCK_ASYNC_WAITDATA, &sk->sk_socket->flags);
+                       finish_wait(sk->sk_sleep, &wait);
 
-                       if(ret)
-                               return(ret);
+                       if (ret)
+                               return ret;
                        if (sk->sk_shutdown & RCV_SHUTDOWN)
                                break;
 
@@ -1525,7 +1494,6 @@ static int irda_sendmsg_dgram(struct kiocb *iocb, struct socket *sock,
        struct sock *sk = sock->sk;
        struct irda_sock *self;
        struct sk_buff *skb;
-       unsigned char *asmptr;
        int err;
 
        IRDA_DEBUG(4, "%s(), len=%zd\n", __FUNCTION__, len);
@@ -1542,10 +1510,9 @@ static int irda_sendmsg_dgram(struct kiocb *iocb, struct socket *sock,
                return -ENOTCONN;
 
        self = irda_sk(sk);
-       IRDA_ASSERT(self != NULL, return -1;);
 
        /*
-        * Check that we don't send out to big frames. This is an unreliable
+        * Check that we don't send out too big frames. This is an unreliable
         * service, so we have no fragmentation and no coalescence
         */
        if (len > self->max_data_size) {
@@ -1561,10 +1528,11 @@ static int irda_sendmsg_dgram(struct kiocb *iocb, struct socket *sock,
                return -ENOBUFS;
 
        skb_reserve(skb, self->max_header_size);
+       skb_reset_transport_header(skb);
 
        IRDA_DEBUG(4, "%s(), appending user data\n", __FUNCTION__);
-       asmptr = skb->h.raw = skb_put(skb, len);
-       err = memcpy_fromiovec(asmptr, msg->msg_iov, len);
+       skb_put(skb, len);
+       err = memcpy_fromiovec(skb_transport_header(skb), msg->msg_iov, len);
        if (err) {
                kfree_skb(skb);
                return err;
@@ -1597,7 +1565,6 @@ static int irda_sendmsg_ultra(struct kiocb *iocb, struct socket *sock,
        __u8 pid = 0;
        int bound = 0;
        struct sk_buff *skb;
-       unsigned char *asmptr;
        int err;
 
        IRDA_DEBUG(4, "%s(), len=%zd\n", __FUNCTION__, len);
@@ -1611,7 +1578,6 @@ static int irda_sendmsg_ultra(struct kiocb *iocb, struct socket *sock,
        }
 
        self = irda_sk(sk);
-       IRDA_ASSERT(self != NULL, return -1;);
 
        /* Check if an address was specified with sendto. Jean II */
        if (msg->msg_name) {
@@ -1641,7 +1607,7 @@ static int irda_sendmsg_ultra(struct kiocb *iocb, struct socket *sock,
        }
 
        /*
-        * Check that we don't send out to big frames. This is an unreliable
+        * Check that we don't send out too big frames. This is an unreliable
         * service, so we have no fragmentation and no coalescence
         */
        if (len > self->max_data_size) {
@@ -1657,10 +1623,11 @@ static int irda_sendmsg_ultra(struct kiocb *iocb, struct socket *sock,
                return -ENOBUFS;
 
        skb_reserve(skb, self->max_header_size);
+       skb_reset_transport_header(skb);
 
        IRDA_DEBUG(4, "%s(), appending user data\n", __FUNCTION__);
-       asmptr = skb->h.raw = skb_put(skb, len);
-       err = memcpy_fromiovec(asmptr, msg->msg_iov, len);
+       skb_put(skb, len);
+       err = memcpy_fromiovec(skb_transport_header(skb), msg->msg_iov, len);
        if (err) {
                kfree_skb(skb);
                return err;
@@ -1684,8 +1651,6 @@ static int irda_shutdown(struct socket *sock, int how)
        struct sock *sk = sock->sk;
        struct irda_sock *self = irda_sk(sk);
 
-       IRDA_ASSERT(self != NULL, return -1;);
-
        IRDA_DEBUG(1, "%s(%p)\n", __FUNCTION__, self);
 
        sk->sk_state       = TCP_CLOSE;
@@ -1708,7 +1673,7 @@ static int irda_shutdown(struct socket *sock, int how)
        self->daddr = DEV_ADDR_ANY;     /* Until we get re-connected */
        self->saddr = 0x0;              /* so IrLMP assign us any link */
 
-        return 0;
+       return 0;
 }
 
 /*
@@ -1829,6 +1794,19 @@ static int irda_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
        return 0;
 }
 
+#ifdef CONFIG_COMPAT
+/*
+ * Function irda_ioctl (sock, cmd, arg)
+ */
+static int irda_compat_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
+{
+       /*
+        * All IRDA's ioctl are standard ones.
+        */
+       return -ENOIOCTLCMD;
+}
+#endif
+
 /*
  * Function irda_setsockopt (sock, level, optname, optval, optlen)
  *
@@ -1845,8 +1823,6 @@ static int irda_setsockopt(struct socket *sock, int level, int optname,
        struct ias_attrib *     ias_attr;       /* Attribute in IAS object */
        int opt;
 
-       IRDA_ASSERT(self != NULL, return -1;);
-
        IRDA_DEBUG(2, "%s(%p)\n", __FUNCTION__, self);
 
        if (level != SOL_IRLMP)
@@ -2475,6 +2451,9 @@ static const struct proto_ops SOCKOPS_WRAPPED(irda_stream_ops) = {
        .getname =      irda_getname,
        .poll =         irda_poll,
        .ioctl =        irda_ioctl,
+#ifdef CONFIG_COMPAT
+       .compat_ioctl = irda_compat_ioctl,
+#endif
        .listen =       irda_listen,
        .shutdown =     irda_shutdown,
        .setsockopt =   irda_setsockopt,
@@ -2496,6 +2475,9 @@ static const struct proto_ops SOCKOPS_WRAPPED(irda_seqpacket_ops) = {
        .getname =      irda_getname,
        .poll =         datagram_poll,
        .ioctl =        irda_ioctl,
+#ifdef CONFIG_COMPAT
+       .compat_ioctl = irda_compat_ioctl,
+#endif
        .listen =       irda_listen,
        .shutdown =     irda_shutdown,
        .setsockopt =   irda_setsockopt,
@@ -2517,6 +2499,9 @@ static const struct proto_ops SOCKOPS_WRAPPED(irda_dgram_ops) = {
        .getname =      irda_getname,
        .poll =         datagram_poll,
        .ioctl =        irda_ioctl,
+#ifdef CONFIG_COMPAT
+       .compat_ioctl = irda_compat_ioctl,
+#endif
        .listen =       irda_listen,
        .shutdown =     irda_shutdown,
        .setsockopt =   irda_setsockopt,
@@ -2539,6 +2524,9 @@ static const struct proto_ops SOCKOPS_WRAPPED(irda_ultra_ops) = {
        .getname =      irda_getname,
        .poll =         datagram_poll,
        .ioctl =        irda_ioctl,
+#ifdef CONFIG_COMPAT
+       .compat_ioctl = irda_compat_ioctl,
+#endif
        .listen =       sock_no_listen,
        .shutdown =     irda_shutdown,
        .setsockopt =   irda_setsockopt,