nfsd: simplify fh_verify access checks
[safe/jmp/linux-2.6] / net / irda / af_irda.c
index bf994c8..dd35641 100644 (file)
@@ -45,6 +45,7 @@
 #include <linux/capability.h>
 #include <linux/module.h>
 #include <linux/types.h>
+#include <linux/smp_lock.h>
 #include <linux/socket.h>
 #include <linux/sockios.h>
 #include <linux/init.h>
@@ -60,7 +61,7 @@
 
 #include <net/irda/af_irda.h>
 
-static int irda_create(struct socket *sock, int protocol);
+static int irda_create(struct net *net, struct socket *sock, int protocol);
 
 static const struct proto_ops irda_stream_ops;
 static const struct proto_ops irda_seqpacket_ops;
@@ -85,15 +86,14 @@ static int irda_data_indication(void *instance, void *sap, struct sk_buff *skb)
        struct sock *sk;
        int err;
 
-       IRDA_DEBUG(3, "%s()\n", __FUNCTION__);
+       IRDA_DEBUG(3, "%s()\n", __func__);
 
        self = instance;
        sk = instance;
-       IRDA_ASSERT(sk != NULL, return -1;);
 
        err = sock_queue_rcv_skb(sk, skb);
        if (err) {
-               IRDA_DEBUG(1, "%s(), error: no more mem!\n", __FUNCTION__);
+               IRDA_DEBUG(1, "%s(), error: no more mem!\n", __func__);
                self->rx_flow = FLOW_STOP;
 
                /* When we return error, TTP will need to requeue the skb */
@@ -117,7 +117,7 @@ static void irda_disconnect_indication(void *instance, void *sap,
 
        self = instance;
 
-       IRDA_DEBUG(2, "%s(%p)\n", __FUNCTION__, self);
+       IRDA_DEBUG(2, "%s(%p)\n", __func__, self);
 
        /* Don't care about it, but let's not leak it */
        if(skb)
@@ -126,19 +126,17 @@ static void irda_disconnect_indication(void *instance, void *sap,
        sk = instance;
        if (sk == NULL) {
                IRDA_DEBUG(0, "%s(%p) : BUG : sk is NULL\n",
-                          __FUNCTION__, self);
+                          __func__, self);
                return;
        }
 
        /* Prevent race conditions with irda_release() and irda_shutdown() */
+       bh_lock_sock(sk);
        if (!sock_flag(sk, SOCK_DEAD) && sk->sk_state != TCP_CLOSE) {
-               lock_sock(sk);
                sk->sk_state     = TCP_CLOSE;
-               sk->sk_err       = ECONNRESET;
                sk->sk_shutdown |= SEND_SHUTDOWN;
 
                sk->sk_state_change(sk);
-               release_sock(sk);
 
                /* Close our TSAP.
                 * If we leave it open, IrLMP put it back into the list of
@@ -158,6 +156,7 @@ static void irda_disconnect_indication(void *instance, void *sap,
                        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.
@@ -183,7 +182,7 @@ static void irda_connect_confirm(void *instance, void *sap,
 
        self = instance;
 
-       IRDA_DEBUG(2, "%s(%p)\n", __FUNCTION__, self);
+       IRDA_DEBUG(2, "%s(%p)\n", __func__, self);
 
        sk = instance;
        if (sk == NULL) {
@@ -205,7 +204,7 @@ static void irda_connect_confirm(void *instance, void *sap,
        case SOCK_STREAM:
                if (max_sdu_size != 0) {
                        IRDA_ERROR("%s: max_sdu_size must be 0\n",
-                                  __FUNCTION__);
+                                  __func__);
                        return;
                }
                self->max_data_size = irttp_get_max_seg_size(self->tsap);
@@ -213,16 +212,16 @@ static void irda_connect_confirm(void *instance, void *sap,
        case SOCK_SEQPACKET:
                if (max_sdu_size == 0) {
                        IRDA_ERROR("%s: max_sdu_size cannot be 0\n",
-                                  __FUNCTION__);
+                                  __func__);
                        return;
                }
                self->max_data_size = max_sdu_size;
                break;
        default:
                self->max_data_size = irttp_get_max_seg_size(self->tsap);
-       };
+       }
 
-       IRDA_DEBUG(2, "%s(), max_data_size=%d\n", __FUNCTION__,
+       IRDA_DEBUG(2, "%s(), max_data_size=%d\n", __func__,
                   self->max_data_size);
 
        memcpy(&self->qos_tx, qos, sizeof(struct qos_info));
@@ -247,7 +246,7 @@ static void irda_connect_indication(void *instance, void *sap,
 
        self = instance;
 
-       IRDA_DEBUG(2, "%s(%p)\n", __FUNCTION__, self);
+       IRDA_DEBUG(2, "%s(%p)\n", __func__, self);
 
        sk = instance;
        if (sk == NULL) {
@@ -266,7 +265,7 @@ static void irda_connect_indication(void *instance, void *sap,
        case SOCK_STREAM:
                if (max_sdu_size != 0) {
                        IRDA_ERROR("%s: max_sdu_size must be 0\n",
-                                  __FUNCTION__);
+                                  __func__);
                        kfree_skb(skb);
                        return;
                }
@@ -275,7 +274,7 @@ static void irda_connect_indication(void *instance, void *sap,
        case SOCK_SEQPACKET:
                if (max_sdu_size == 0) {
                        IRDA_ERROR("%s: max_sdu_size cannot be 0\n",
-                                  __FUNCTION__);
+                                  __func__);
                        kfree_skb(skb);
                        return;
                }
@@ -283,9 +282,9 @@ 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__,
+       IRDA_DEBUG(2, "%s(), max_data_size=%d\n", __func__,
                   self->max_data_size);
 
        memcpy(&self->qos_tx, qos, sizeof(struct qos_info));
@@ -304,15 +303,13 @@ static void irda_connect_response(struct irda_sock *self)
 {
        struct sk_buff *skb;
 
-       IRDA_DEBUG(2, "%s()\n", __FUNCTION__);
-
-       IRDA_ASSERT(self != NULL, return;);
+       IRDA_DEBUG(2, "%s()\n", __func__);
 
        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__);
+                          __func__);
                return;
        }
 
@@ -333,26 +330,26 @@ static void irda_flow_indication(void *instance, void *sap, LOCAL_FLOW flow)
        struct irda_sock *self;
        struct sock *sk;
 
-       IRDA_DEBUG(2, "%s()\n", __FUNCTION__);
+       IRDA_DEBUG(2, "%s()\n", __func__);
 
        self = instance;
        sk = instance;
-       IRDA_ASSERT(sk != NULL, return;);
+       BUG_ON(sk == NULL);
 
        switch (flow) {
        case FLOW_STOP:
                IRDA_DEBUG(1, "%s(), IrTTP wants us to slow down\n",
-                          __FUNCTION__);
+                          __func__);
                self->tx_flow = flow;
                break;
        case FLOW_START:
                self->tx_flow = flow;
                IRDA_DEBUG(1, "%s(), IrTTP wants us to start again\n",
-                          __FUNCTION__);
+                          __func__);
                wake_up_interruptible(sk->sk_sleep);
                break;
        default:
-               IRDA_DEBUG(0, "%s(), Unknown flow command!\n", __FUNCTION__);
+               IRDA_DEBUG(0, "%s(), Unknown flow command!\n", __func__);
                /* Unknown flow command, better stop */
                self->tx_flow = flow;
                break;
@@ -374,11 +371,11 @@ static void irda_getvalue_confirm(int result, __u16 obj_id,
 
        self = (struct irda_sock *) priv;
        if (!self) {
-               IRDA_WARNING("%s: lost myself!\n", __FUNCTION__);
+               IRDA_WARNING("%s: lost myself!\n", __func__);
                return;
        }
 
-       IRDA_DEBUG(2, "%s(%p)\n", __FUNCTION__, self);
+       IRDA_DEBUG(2, "%s(%p)\n", __func__, self);
 
        /* We probably don't need to make any more queries */
        iriap_close(self->iriap);
@@ -386,7 +383,7 @@ static void irda_getvalue_confirm(int result, __u16 obj_id,
 
        /* Check if request succeeded */
        if (result != IAS_SUCCESS) {
-               IRDA_DEBUG(1, "%s(), IAS query failed! (%d)\n", __FUNCTION__,
+               IRDA_DEBUG(1, "%s(), IAS query failed! (%d)\n", __func__,
                           result);
 
                self->errno = result;   /* We really need it later */
@@ -419,11 +416,11 @@ static void irda_selective_discovery_indication(discinfo_t *discovery,
 {
        struct irda_sock *self;
 
-       IRDA_DEBUG(2, "%s()\n", __FUNCTION__);
+       IRDA_DEBUG(2, "%s()\n", __func__);
 
        self = (struct irda_sock *) priv;
        if (!self) {
-               IRDA_WARNING("%s: lost myself!\n", __FUNCTION__);
+               IRDA_WARNING("%s: lost myself!\n", __func__);
                return;
        }
 
@@ -446,10 +443,10 @@ static void irda_discovery_timeout(u_long priv)
 {
        struct irda_sock *self;
 
-       IRDA_DEBUG(2, "%s()\n", __FUNCTION__);
+       IRDA_DEBUG(2, "%s()\n", __func__);
 
        self = (struct irda_sock *) priv;
-       IRDA_ASSERT(self != NULL, return;);
+       BUG_ON(self == NULL);
 
        /* Nothing for the caller */
        self->cachelog = NULL;
@@ -471,7 +468,7 @@ static int irda_open_tsap(struct irda_sock *self, __u8 tsap_sel, char *name)
        notify_t notify;
 
        if (self->tsap) {
-               IRDA_WARNING("%s: busy!\n", __FUNCTION__);
+               IRDA_WARNING("%s: busy!\n", __func__);
                return -EBUSY;
        }
 
@@ -490,7 +487,7 @@ static int irda_open_tsap(struct irda_sock *self, __u8 tsap_sel, char *name)
                                     &notify);
        if (self->tsap == NULL) {
                IRDA_DEBUG(0, "%s(), Unable to allocate TSAP!\n",
-                          __FUNCTION__);
+                          __func__);
                return -ENOMEM;
        }
        /* Remember which TSAP selector we actually got */
@@ -511,7 +508,7 @@ static int irda_open_lsap(struct irda_sock *self, int pid)
        notify_t notify;
 
        if (self->lsap) {
-               IRDA_WARNING("%s(), busy!\n", __FUNCTION__);
+               IRDA_WARNING("%s(), busy!\n", __func__);
                return -EBUSY;
        }
 
@@ -523,7 +520,7 @@ static int irda_open_lsap(struct irda_sock *self, int pid)
 
        self->lsap = irlmp_open_lsap(LSAP_CONNLESS, &notify, pid);
        if (self->lsap == NULL) {
-               IRDA_DEBUG( 0, "%s(), Unable to allocate LSAP!\n", __FUNCTION__);
+               IRDA_DEBUG( 0, "%s(), Unable to allocate LSAP!\n", __func__);
                return -ENOMEM;
        }
 
@@ -544,13 +541,11 @@ static int irda_open_lsap(struct irda_sock *self, int pid)
  */
 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;);
+       IRDA_DEBUG(2, "%s(%p, %s)\n", __func__, self, name);
 
        if (self->iriap) {
                IRDA_WARNING("%s(): busy with a previous query\n",
-                            __FUNCTION__);
+                            __func__);
                return -EBUSY;
        }
 
@@ -586,7 +581,7 @@ static int irda_find_lsap_sel(struct irda_sock *self, char *name)
        switch (self->ias_result->type) {
        case IAS_INTEGER:
                IRDA_DEBUG(4, "%s() int=%d\n",
-                          __FUNCTION__, self->ias_result->t.integer);
+                          __func__, self->ias_result->t.integer);
 
                if (self->ias_result->t.integer != -1)
                        self->dtsap_sel = self->ias_result->t.integer;
@@ -595,7 +590,7 @@ static int irda_find_lsap_sel(struct irda_sock *self, char *name)
                break;
        default:
                self->dtsap_sel = 0;
-               IRDA_DEBUG(0, "%s(), bad type!\n", __FUNCTION__);
+               IRDA_DEBUG(0, "%s(), bad type!\n", __func__);
                break;
        }
        if (self->ias_result)
@@ -633,9 +628,7 @@ static int irda_discover_daddr_and_lsap_sel(struct irda_sock *self, char *name)
        __u32   daddr = DEV_ADDR_ANY;   /* Address we found the service on */
        __u8    dtsap_sel = 0x0;        /* TSAP associated with it */
 
-       IRDA_DEBUG(2, "%s(), name=%s\n", __FUNCTION__, name);
-
-       IRDA_ASSERT(self != NULL, return -1;);
+       IRDA_DEBUG(2, "%s(), name=%s\n", __func__, name);
 
        /* Ask lmp for the current discovery log
         * Note : we have to use irlmp_get_discoveries(), as opposed
@@ -657,7 +650,7 @@ static int irda_discover_daddr_and_lsap_sel(struct irda_sock *self, char *name)
                self->daddr = discoveries[i].daddr;
                self->saddr = 0x0;
                IRDA_DEBUG(1, "%s(), trying daddr = %08x\n",
-                          __FUNCTION__, self->daddr);
+                          __func__, self->daddr);
 
                /* Query remote LM-IAS for this service */
                err = irda_find_lsap_sel(self, name);
@@ -666,7 +659,7 @@ static int irda_discover_daddr_and_lsap_sel(struct irda_sock *self, char *name)
                        /* We found the requested service */
                        if(daddr != DEV_ADDR_ANY) {
                                IRDA_DEBUG(1, "%s(), discovered service ''%s'' in two different devices !!!\n",
-                                          __FUNCTION__, name);
+                                          __func__, name);
                                self->daddr = DEV_ADDR_ANY;
                                kfree(discoveries);
                                return(-ENOTUNIQ);
@@ -680,7 +673,7 @@ static int irda_discover_daddr_and_lsap_sel(struct irda_sock *self, char *name)
                        break;
                default:
                        /* Something bad did happen :-( */
-                       IRDA_DEBUG(0, "%s(), unexpected IAS query failure\n", __FUNCTION__);
+                       IRDA_DEBUG(0, "%s(), unexpected IAS query failure\n", __func__);
                        self->daddr = DEV_ADDR_ANY;
                        kfree(discoveries);
                        return(-EHOSTUNREACH);
@@ -693,7 +686,7 @@ static int irda_discover_daddr_and_lsap_sel(struct irda_sock *self, char *name)
        /* Check out what we found */
        if(daddr == DEV_ADDR_ANY) {
                IRDA_DEBUG(1, "%s(), cannot discover service ''%s'' in any device !!!\n",
-                          __FUNCTION__, name);
+                          __func__, name);
                self->daddr = DEV_ADDR_ANY;
                return(-EADDRNOTAVAIL);
        }
@@ -704,7 +697,7 @@ static int irda_discover_daddr_and_lsap_sel(struct irda_sock *self, char *name)
        self->dtsap_sel = dtsap_sel;
 
        IRDA_DEBUG(1, "%s(), discovered requested service ''%s'' at address %08x\n",
-                  __FUNCTION__, name, self->daddr);
+                  __func__, name, self->daddr);
 
        return 0;
 }
@@ -722,6 +715,7 @@ static int irda_getname(struct socket *sock, struct sockaddr *uaddr,
        struct sock *sk = sock->sk;
        struct irda_sock *self = irda_sk(sk);
 
+       memset(&saddr, 0, sizeof(saddr));
        if (peer) {
                if (sk->sk_state != TCP_ESTABLISHED)
                        return -ENOTCONN;
@@ -735,8 +729,8 @@ static int irda_getname(struct socket *sock, struct sockaddr *uaddr,
                saddr.sir_addr = self->saddr;
        }
 
-       IRDA_DEBUG(1, "%s(), tsap_sel = %#x\n", __FUNCTION__, saddr.sir_lsap_sel);
-       IRDA_DEBUG(1, "%s(), addr = %08x\n", __FUNCTION__, saddr.sir_addr);
+       IRDA_DEBUG(1, "%s(), tsap_sel = %#x\n", __func__, saddr.sir_lsap_sel);
+       IRDA_DEBUG(1, "%s(), addr = %08x\n", __func__, saddr.sir_addr);
 
        /* uaddr_len come to us uninitialised */
        *uaddr_len = sizeof (struct sockaddr_irda);
@@ -755,7 +749,7 @@ static int irda_listen(struct socket *sock, int backlog)
 {
        struct sock *sk = sock->sk;
 
-       IRDA_DEBUG(2, "%s()\n", __FUNCTION__);
+       IRDA_DEBUG(2, "%s()\n", __func__);
 
        if ((sk->sk_type != SOCK_STREAM) && (sk->sk_type != SOCK_SEQPACKET) &&
            (sk->sk_type != SOCK_DGRAM))
@@ -784,9 +778,7 @@ 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);
+       IRDA_DEBUG(2, "%s(%p)\n", __func__, self);
 
        if (addr_len != sizeof(struct sockaddr_irda))
                return -EINVAL;
@@ -797,7 +789,7 @@ static int irda_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
            (sk->sk_protocol == IRDAPROTO_ULTRA)) {
                self->pid = addr->sir_lsap_sel;
                if (self->pid & 0x80) {
-                       IRDA_DEBUG(0, "%s(), extension in PID not supp!\n", __FUNCTION__);
+                       IRDA_DEBUG(0, "%s(), extension in PID not supp!\n", __func__);
                        return -EOPNOTSUPP;
                }
                err = irda_open_lsap(self, self->pid);
@@ -812,12 +804,18 @@ static int irda_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
        }
 #endif /* CONFIG_IRDA_ULTRA */
 
+       self->ias_obj = irias_new_object(addr->sir_name, jiffies);
+       if (self->ias_obj == NULL)
+               return -ENOMEM;
+
        err = irda_open_tsap(self, addr->sir_lsap_sel, addr->sir_name);
-       if (err < 0)
+       if (err < 0) {
+               kfree(self->ias_obj->name);
+               kfree(self->ias_obj);
                return err;
+       }
 
        /*  Register with LM-IAS */
-       self->ias_obj = irias_new_object(addr->sir_name, jiffies);
        irias_add_integer_attrib(self->ias_obj, "IrDA:TinyTP:LsapSel",
                                 self->stsap_sel, IAS_KERNEL_ATTR);
        irias_insert_object(self->ias_obj);
@@ -839,11 +837,9 @@ static int irda_accept(struct socket *sock, struct socket *newsock, int flags)
        struct sk_buff *skb;
        int err;
 
-       IRDA_DEBUG(2, "%s()\n", __FUNCTION__);
+       IRDA_DEBUG(2, "%s()\n", __func__);
 
-       IRDA_ASSERT(self != NULL, return -1;);
-
-       err = irda_create(newsock, sk->sk_protocol);
+       err = irda_create(sock_net(sk), newsock, sk->sk_protocol);
        if (err)
                return err;
 
@@ -873,49 +869,33 @@ 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);
        if (!new->tsap) {
-               IRDA_DEBUG(0, "%s(), dup failed!\n", __FUNCTION__);
+               IRDA_DEBUG(0, "%s(), dup failed!\n", __func__);
                kfree_skb(skb);
                return -1;
        }
@@ -935,9 +915,6 @@ static int irda_accept(struct socket *sock, struct socket *newsock, int flags)
        /* Clean up the original one to keep it in listen state */
        irttp_listen(self->tsap);
 
-       /* Wow ! What is that ? Jean II */
-       skb->sk = NULL;
-       skb->destructor = NULL;
        kfree_skb(skb);
        sk->sk_ack_backlog--;
 
@@ -976,7 +953,7 @@ static int irda_connect(struct socket *sock, struct sockaddr *uaddr,
        struct irda_sock *self = irda_sk(sk);
        int err;
 
-       IRDA_DEBUG(2, "%s(%p)\n", __FUNCTION__, self);
+       IRDA_DEBUG(2, "%s(%p)\n", __func__, self);
 
        /* Don't allow connect for Ultra sockets */
        if ((sk->sk_type == SOCK_DGRAM) && (sk->sk_protocol == IRDAPROTO_ULTRA))
@@ -1006,13 +983,13 @@ static int irda_connect(struct socket *sock, struct sockaddr *uaddr,
                /* Try to find one suitable */
                err = irda_discover_daddr_and_lsap_sel(self, addr->sir_name);
                if (err) {
-                       IRDA_DEBUG(0, "%s(), auto-connect failed!\n", __FUNCTION__);
+                       IRDA_DEBUG(0, "%s(), auto-connect failed!\n", __func__);
                        return err;
                }
        } else {
                /* Use the one provided by the user */
                self->daddr = addr->sir_addr;
-               IRDA_DEBUG(1, "%s(), daddr = %08x\n", __FUNCTION__, self->daddr);
+               IRDA_DEBUG(1, "%s(), daddr = %08x\n", __func__, self->daddr);
 
                /* If we don't have a valid service name, we assume the
                 * user want to connect on a specific LSAP. Prevent
@@ -1022,7 +999,7 @@ static int irda_connect(struct socket *sock, struct sockaddr *uaddr,
                        /* Query remote LM-IAS using service name */
                        err = irda_find_lsap_sel(self, addr->sir_name);
                        if (err) {
-                               IRDA_DEBUG(0, "%s(), connect failed!\n", __FUNCTION__);
+                               IRDA_DEBUG(0, "%s(), connect failed!\n", __func__);
                                return err;
                        }
                } else {
@@ -1047,7 +1024,7 @@ static int irda_connect(struct socket *sock, struct sockaddr *uaddr,
                                    self->saddr, self->daddr, NULL,
                                    self->max_sdu_size_rx, NULL);
        if (err) {
-               IRDA_DEBUG(0, "%s(), connect failed!\n", __FUNCTION__);
+               IRDA_DEBUG(0, "%s(), connect failed!\n", __func__);
                return err;
        }
 
@@ -1061,7 +1038,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;
@@ -1084,12 +1062,15 @@ static struct proto irda_proto = {
  *    Create IrDA socket
  *
  */
-static int irda_create(struct socket *sock, int protocol)
+static int irda_create(struct net *net, struct socket *sock, int protocol)
 {
        struct sock *sk;
        struct irda_sock *self;
 
-       IRDA_DEBUG(2, "%s()\n", __FUNCTION__);
+       IRDA_DEBUG(2, "%s()\n", __func__);
+
+       if (net != &init_net)
+               return -EAFNOSUPPORT;
 
        /* Check for valid socket type */
        switch (sock->type) {
@@ -1102,20 +1083,15 @@ static int irda_create(struct socket *sock, int protocol)
        }
 
        /* Allocate networking socket */
-       sk = sk_alloc(PF_IRDA, GFP_ATOMIC, &irda_proto, 1);
+       sk = sk_alloc(net, PF_IRDA, GFP_ATOMIC, &irda_proto);
        if (sk == NULL)
                return -ENOMEM;
 
        self = irda_sk(sk);
-       IRDA_DEBUG(2, "%s() : self is %p\n", __FUNCTION__, self);
+       IRDA_DEBUG(2, "%s() : self is %p\n", __func__, self);
 
        init_waitqueue_head(&self->query_wait);
 
-       /* Initialise networking socket struct */
-       sock_init_data(sock, sk);       /* Note : set sk->sk_refcnt to 1 */
-       sk->sk_family = PF_IRDA;
-       sk->sk_protocol = protocol;
-
        switch (sock->type) {
        case SOCK_STREAM:
                sock->ops = &irda_stream_ops;
@@ -1142,15 +1118,20 @@ static int irda_create(struct socket *sock, int protocol)
                        self->max_sdu_size_rx = TTP_SAR_UNBOUND;
                        break;
                default:
-                       IRDA_ERROR("%s: protocol not supported!\n",
-                                  __FUNCTION__);
+                       sk_free(sk);
                        return -ESOCKTNOSUPPORT;
                }
                break;
        default:
+               sk_free(sk);
                return -ESOCKTNOSUPPORT;
        }
 
+       /* Initialise networking socket struct */
+       sock_init_data(sock, sk);       /* Note : set sk->sk_refcnt to 1 */
+       sk->sk_family = PF_IRDA;
+       sk->sk_protocol = protocol;
+
        /* Register as a client with IrLMP */
        self->ckey = irlmp_register_client(0, NULL, NULL, NULL);
        self->mask.word = 0xffff;
@@ -1169,9 +1150,7 @@ static int irda_create(struct socket *sock, int protocol)
  */
 static void irda_destroy_socket(struct irda_sock *self)
 {
-       IRDA_DEBUG(2, "%s(%p)\n", __FUNCTION__, self);
-
-       IRDA_ASSERT(self != NULL, return;);
+       IRDA_DEBUG(2, "%s(%p)\n", __func__, self);
 
        /* Unregister with IrLMP */
        irlmp_unregister_client(self->ckey);
@@ -1208,7 +1187,7 @@ static int irda_release(struct socket *sock)
 {
        struct sock *sk = sock->sk;
 
-       IRDA_DEBUG(2, "%s()\n", __FUNCTION__);
+       IRDA_DEBUG(2, "%s()\n", __func__);
 
        if (sk == NULL)
                return 0;
@@ -1274,24 +1253,22 @@ static int irda_sendmsg(struct kiocb *iocb, struct socket *sock,
        struct sock *sk = sock->sk;
        struct irda_sock *self;
        struct sk_buff *skb;
-       int err;
+       int err = -EPIPE;
 
-       IRDA_DEBUG(4, "%s(), len=%zd\n", __FUNCTION__, len);
+       IRDA_DEBUG(4, "%s(), len=%zd\n", __func__, len);
 
        /* Note : socket.c set MSG_EOR on SEQPACKET sockets */
-       if (msg->msg_flags & ~(MSG_DONTWAIT|MSG_EOR|MSG_CMSG_COMPAT))
+       if (msg->msg_flags & ~(MSG_DONTWAIT | MSG_EOR | MSG_CMSG_COMPAT |
+                              MSG_NOSIGNAL))
                return -EINVAL;
 
-       if (sk->sk_shutdown & SEND_SHUTDOWN) {
-               send_sig(SIGPIPE, current, 0);
-               return -EPIPE;
-       }
+       if (sk->sk_shutdown & SEND_SHUTDOWN)
+               goto out_err;
 
        if (sk->sk_state != TCP_ESTABLISHED)
                return -ENOTCONN;
 
        self = irda_sk(sk);
-       IRDA_ASSERT(self != NULL, return -1;);
 
        /* Check if IrTTP is wants us to slow down */
 
@@ -1306,14 +1283,14 @@ static int irda_sendmsg(struct kiocb *iocb, struct socket *sock,
        /* 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);
+                          __func__, len, self->max_data_size);
                len = self->max_data_size;
        }
 
        skb = sock_alloc_send_skb(sk, len + self->max_header_size + 16,
                                  msg->msg_flags & MSG_DONTWAIT, &err);
        if (!skb)
-               return -ENOBUFS;
+               goto out_err;
 
        skb_reserve(skb, self->max_header_size + 16);
        skb_reset_transport_header(skb);
@@ -1321,7 +1298,7 @@ static int irda_sendmsg(struct kiocb *iocb, struct socket *sock,
        err = memcpy_fromiovec(skb_transport_header(skb), msg->msg_iov, len);
        if (err) {
                kfree_skb(skb);
-               return err;
+               goto out_err;
        }
 
        /*
@@ -1330,11 +1307,15 @@ static int irda_sendmsg(struct kiocb *iocb, struct socket *sock,
         */
        err = irttp_data_request(self->tsap, skb);
        if (err) {
-               IRDA_DEBUG(0, "%s(), err=%d\n", __FUNCTION__, err);
-               return err;
+               IRDA_DEBUG(0, "%s(), err=%d\n", __func__, err);
+               goto out_err;
        }
        /* Tell client how much data we actually sent */
        return len;
+
+ out_err:
+       return sk_stream_error(sk, msg->msg_flags, err);
+
 }
 
 /*
@@ -1352,10 +1333,10 @@ static int irda_recvmsg_dgram(struct kiocb *iocb, struct socket *sock,
        size_t copied;
        int err;
 
-       IRDA_DEBUG(4, "%s()\n", __FUNCTION__);
+       IRDA_DEBUG(4, "%s()\n", __func__);
 
-       IRDA_ASSERT(self != NULL, return -1;);
-       IRDA_ASSERT(!sock_error(sk), return -1;);
+       if ((err = sock_error(sk)) < 0)
+               return err;
 
        skb = skb_recv_datagram(sk, flags & ~MSG_DONTWAIT,
                                flags & MSG_DONTWAIT, &err);
@@ -1367,7 +1348,7 @@ static int irda_recvmsg_dgram(struct kiocb *iocb, struct socket *sock,
 
        if (copied > size) {
                IRDA_DEBUG(2, "%s(), Received truncated frame (%zd < %zd)!\n",
-                          __FUNCTION__, copied, size);
+                          __func__, copied, size);
                copied = size;
                msg->msg_flags |= MSG_TRUNC;
        }
@@ -1383,7 +1364,7 @@ static int irda_recvmsg_dgram(struct kiocb *iocb, struct socket *sock,
         */
        if (self->rx_flow == FLOW_STOP) {
                if ((atomic_read(&sk->sk_rmem_alloc) << 2) <= sk->sk_rcvbuf) {
-                       IRDA_DEBUG(2, "%s(), Starting IrTTP\n", __FUNCTION__);
+                       IRDA_DEBUG(2, "%s(), Starting IrTTP\n", __func__);
                        self->rx_flow = FLOW_START;
                        irttp_flow_request(self->tsap, FLOW_START);
                }
@@ -1402,13 +1383,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_DEBUG(3, "%s()\n", __func__);
 
-       IRDA_ASSERT(self != NULL, return -1;);
-       IRDA_ASSERT(!sock_error(sk), return -1;);
+       if ((err = sock_error(sk)) < 0)
+               return err;
 
        if (sock->flags & __SO_ACCEPTCON)
                return(-EINVAL);
@@ -1416,8 +1397,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;
 
@@ -1425,19 +1406,14 @@ 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.
@@ -1450,17 +1426,17 @@ static int irda_recvmsg_stream(struct kiocb *iocb, struct socket *sock,
                        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;
 
@@ -1484,14 +1460,14 @@ static int irda_recvmsg_stream(struct kiocb *iocb, struct socket *sock,
                        /* put the skb back if we didn't use it up.. */
                        if (skb->len) {
                                IRDA_DEBUG(1, "%s(), back on q!\n",
-                                          __FUNCTION__);
+                                          __func__);
                                skb_queue_head(&sk->sk_receive_queue, skb);
                                break;
                        }
 
                        kfree_skb(skb);
                } else {
-                       IRDA_DEBUG(0, "%s() questionable!?\n", __FUNCTION__);
+                       IRDA_DEBUG(0, "%s() questionable!?\n", __func__);
 
                        /* put message back and return */
                        skb_queue_head(&sk->sk_receive_queue, skb);
@@ -1507,7 +1483,7 @@ static int irda_recvmsg_stream(struct kiocb *iocb, struct socket *sock,
         */
        if (self->rx_flow == FLOW_STOP) {
                if ((atomic_read(&sk->sk_rmem_alloc) << 2) <= sk->sk_rcvbuf) {
-                       IRDA_DEBUG(2, "%s(), Starting IrTTP\n", __FUNCTION__);
+                       IRDA_DEBUG(2, "%s(), Starting IrTTP\n", __func__);
                        self->rx_flow = FLOW_START;
                        irttp_flow_request(self->tsap, FLOW_START);
                }
@@ -1531,7 +1507,7 @@ static int irda_sendmsg_dgram(struct kiocb *iocb, struct socket *sock,
        struct sk_buff *skb;
        int err;
 
-       IRDA_DEBUG(4, "%s(), len=%zd\n", __FUNCTION__, len);
+       IRDA_DEBUG(4, "%s(), len=%zd\n", __func__, len);
 
        if (msg->msg_flags & ~(MSG_DONTWAIT|MSG_CMSG_COMPAT))
                return -EINVAL;
@@ -1545,7 +1521,6 @@ 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 too big frames. This is an unreliable
@@ -1554,7 +1529,7 @@ static int irda_sendmsg_dgram(struct kiocb *iocb, struct socket *sock,
        if (len > self->max_data_size) {
                IRDA_DEBUG(0, "%s(), Warning to much data! "
                           "Chopping frame from %zd to %d bytes!\n",
-                          __FUNCTION__, len, self->max_data_size);
+                          __func__, len, self->max_data_size);
                len = self->max_data_size;
        }
 
@@ -1566,7 +1541,7 @@ static int irda_sendmsg_dgram(struct kiocb *iocb, struct socket *sock,
        skb_reserve(skb, self->max_header_size);
        skb_reset_transport_header(skb);
 
-       IRDA_DEBUG(4, "%s(), appending user data\n", __FUNCTION__);
+       IRDA_DEBUG(4, "%s(), appending user data\n", __func__);
        skb_put(skb, len);
        err = memcpy_fromiovec(skb_transport_header(skb), msg->msg_iov, len);
        if (err) {
@@ -1580,7 +1555,7 @@ static int irda_sendmsg_dgram(struct kiocb *iocb, struct socket *sock,
         */
        err = irttp_udata_request(self->tsap, skb);
        if (err) {
-               IRDA_DEBUG(0, "%s(), err=%d\n", __FUNCTION__, err);
+               IRDA_DEBUG(0, "%s(), err=%d\n", __func__, err);
                return err;
        }
        return len;
@@ -1603,7 +1578,7 @@ static int irda_sendmsg_ultra(struct kiocb *iocb, struct socket *sock,
        struct sk_buff *skb;
        int err;
 
-       IRDA_DEBUG(4, "%s(), len=%zd\n", __FUNCTION__, len);
+       IRDA_DEBUG(4, "%s(), len=%zd\n", __func__, len);
 
        if (msg->msg_flags & ~(MSG_DONTWAIT|MSG_CMSG_COMPAT))
                return -EINVAL;
@@ -1614,7 +1589,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) {
@@ -1627,7 +1601,7 @@ static int irda_sendmsg_ultra(struct kiocb *iocb, struct socket *sock,
 
                pid = addr->sir_lsap_sel;
                if (pid & 0x80) {
-                       IRDA_DEBUG(0, "%s(), extension in PID not supp!\n", __FUNCTION__);
+                       IRDA_DEBUG(0, "%s(), extension in PID not supp!\n", __func__);
                        return -EOPNOTSUPP;
                }
        } else {
@@ -1636,7 +1610,7 @@ static int irda_sendmsg_ultra(struct kiocb *iocb, struct socket *sock,
                if ((self->lsap == NULL) ||
                    (sk->sk_state != TCP_ESTABLISHED)) {
                        IRDA_DEBUG(0, "%s(), socket not bound to Ultra PID.\n",
-                                  __FUNCTION__);
+                                  __func__);
                        return -ENOTCONN;
                }
                /* Use PID from socket */
@@ -1650,7 +1624,7 @@ static int irda_sendmsg_ultra(struct kiocb *iocb, struct socket *sock,
        if (len > self->max_data_size) {
                IRDA_DEBUG(0, "%s(), Warning to much data! "
                           "Chopping frame from %zd to %d bytes!\n",
-                          __FUNCTION__, len, self->max_data_size);
+                          __func__, len, self->max_data_size);
                len = self->max_data_size;
        }
 
@@ -1662,7 +1636,7 @@ static int irda_sendmsg_ultra(struct kiocb *iocb, struct socket *sock,
        skb_reserve(skb, self->max_header_size);
        skb_reset_transport_header(skb);
 
-       IRDA_DEBUG(4, "%s(), appending user data\n", __FUNCTION__);
+       IRDA_DEBUG(4, "%s(), appending user data\n", __func__);
        skb_put(skb, len);
        err = memcpy_fromiovec(skb_transport_header(skb), msg->msg_iov, len);
        if (err) {
@@ -1673,7 +1647,7 @@ static int irda_sendmsg_ultra(struct kiocb *iocb, struct socket *sock,
        err = irlmp_connless_data_request((bound ? self->lsap : NULL),
                                          skb, pid);
        if (err) {
-               IRDA_DEBUG(0, "%s(), err=%d\n", __FUNCTION__, err);
+               IRDA_DEBUG(0, "%s(), err=%d\n", __func__, err);
                return err;
        }
        return len;
@@ -1688,9 +1662,7 @@ 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);
+       IRDA_DEBUG(1, "%s(%p)\n", __func__, self);
 
        sk->sk_state       = TCP_CLOSE;
        sk->sk_shutdown   |= SEND_SHUTDOWN;
@@ -1725,7 +1697,7 @@ static unsigned int irda_poll(struct file * file, struct socket *sock,
        struct irda_sock *self = irda_sk(sk);
        unsigned int mask;
 
-       IRDA_DEBUG(4, "%s()\n", __FUNCTION__);
+       IRDA_DEBUG(4, "%s()\n", __func__);
 
        poll_wait(file, sk->sk_sleep, wait);
        mask = 0;
@@ -1734,7 +1706,7 @@ static unsigned int irda_poll(struct file * file, struct socket *sock,
        if (sk->sk_err)
                mask |= POLLERR;
        if (sk->sk_shutdown & RCV_SHUTDOWN) {
-               IRDA_DEBUG(0, "%s(), POLLHUP\n", __FUNCTION__);
+               IRDA_DEBUG(0, "%s(), POLLHUP\n", __func__);
                mask |= POLLHUP;
        }
 
@@ -1748,7 +1720,7 @@ static unsigned int irda_poll(struct file * file, struct socket *sock,
        switch (sk->sk_type) {
        case SOCK_STREAM:
                if (sk->sk_state == TCP_CLOSE) {
-                       IRDA_DEBUG(0, "%s(), POLLHUP\n", __FUNCTION__);
+                       IRDA_DEBUG(0, "%s(), POLLHUP\n", __func__);
                        mask |= POLLHUP;
                }
 
@@ -1784,12 +1756,13 @@ static int irda_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
 {
        struct sock *sk = sock->sk;
 
-       IRDA_DEBUG(4, "%s(), cmd=%#x\n", __FUNCTION__, cmd);
+       IRDA_DEBUG(4, "%s(), cmd=%#x\n", __func__, cmd);
 
        switch (cmd) {
        case TIOCOUTQ: {
                long amount;
-               amount = sk->sk_sndbuf - atomic_read(&sk->sk_wmem_alloc);
+
+               amount = sk->sk_sndbuf - sk_wmem_alloc_get(sk);
                if (amount < 0)
                        amount = 0;
                if (put_user(amount, (unsigned int __user *)arg))
@@ -1825,7 +1798,7 @@ static int irda_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
        case SIOCSIFMETRIC:
                return -EINVAL;
        default:
-               IRDA_DEBUG(1, "%s(), doing device ioctl!\n", __FUNCTION__);
+               IRDA_DEBUG(1, "%s(), doing device ioctl!\n", __func__);
                return -ENOIOCTLCMD;
        }
 
@@ -1853,18 +1826,16 @@ static int irda_compat_ioctl(struct socket *sock, unsigned int cmd, unsigned lon
  *
  */
 static int irda_setsockopt(struct socket *sock, int level, int optname,
-                          char __user *optval, int optlen)
+                          char __user *optval, unsigned int optlen)
 {
        struct sock *sk = sock->sk;
        struct irda_sock *self = irda_sk(sk);
        struct irda_ias_set    *ias_opt;
        struct ias_object      *ias_obj;
        struct ias_attrib *     ias_attr;       /* Attribute in IAS object */
-       int opt;
+       int opt, free_ias = 0;
 
-       IRDA_ASSERT(self != NULL, return -1;);
-
-       IRDA_DEBUG(2, "%s(%p)\n", __FUNCTION__, self);
+       IRDA_DEBUG(2, "%s(%p)\n", __func__, self);
 
        if (level != SOL_IRLMP)
                return -ENOPROTOOPT;
@@ -1918,11 +1889,20 @@ static int irda_setsockopt(struct socket *sock, int level, int optname,
                        /* Create a new object */
                        ias_obj = irias_new_object(ias_opt->irda_class_name,
                                                   jiffies);
+                       if (ias_obj == NULL) {
+                               kfree(ias_opt);
+                               return -ENOMEM;
+                       }
+                       free_ias = 1;
                }
 
                /* Do we have the attribute already ? */
                if(irias_find_attrib(ias_obj, ias_opt->irda_attrib_name)) {
                        kfree(ias_opt);
+                       if (free_ias) {
+                               kfree(ias_obj->name);
+                               kfree(ias_obj);
+                       }
                        return -EINVAL;
                }
 
@@ -1941,6 +1921,11 @@ static int irda_setsockopt(struct socket *sock, int level, int optname,
                        if(ias_opt->attribute.irda_attrib_octet_seq.len >
                           IAS_MAX_OCTET_STRING) {
                                kfree(ias_opt);
+                               if (free_ias) {
+                                       kfree(ias_obj->name);
+                                       kfree(ias_obj);
+                               }
+
                                return -EINVAL;
                        }
                        /* Add an octet sequence attribute */
@@ -1969,6 +1954,10 @@ static int irda_setsockopt(struct socket *sock, int level, int optname,
                        break;
                default :
                        kfree(ias_opt);
+                       if (free_ias) {
+                               kfree(ias_obj->name);
+                               kfree(ias_obj);
+                       }
                        return -EINVAL;
                }
                irias_insert_object(ias_obj);
@@ -2025,7 +2014,7 @@ static int irda_setsockopt(struct socket *sock, int level, int optname,
 
                /* Check is the user space own the object */
                if(ias_attr->value->owner != IAS_USER_ATTR) {
-                       IRDA_DEBUG(1, "%s(), attempting to delete a kernel attribute\n", __FUNCTION__);
+                       IRDA_DEBUG(1, "%s(), attempting to delete a kernel attribute\n", __func__);
                        kfree(ias_opt);
                        return -EPERM;
                }
@@ -2044,11 +2033,11 @@ static int irda_setsockopt(struct socket *sock, int level, int optname,
                /* Only possible for a seqpacket service (TTP with SAR) */
                if (sk->sk_type != SOCK_SEQPACKET) {
                        IRDA_DEBUG(2, "%s(), setting max_sdu_size = %d\n",
-                                  __FUNCTION__, opt);
+                                  __func__, opt);
                        self->max_sdu_size_rx = opt;
                } else {
                        IRDA_WARNING("%s: not allowed to set MAXSDUSIZE for this socket type!\n",
-                                    __FUNCTION__);
+                                    __func__);
                        return -ENOPROTOOPT;
                }
                break;
@@ -2162,7 +2151,7 @@ static int irda_getsockopt(struct socket *sock, int level, int optname,
        int err;
        int offset, total;
 
-       IRDA_DEBUG(2, "%s(%p)\n", __FUNCTION__, self);
+       IRDA_DEBUG(2, "%s(%p)\n", __func__, self);
 
        if (level != SOL_IRLMP)
                return -ENOPROTOOPT;
@@ -2323,7 +2312,7 @@ bed:
                /* Check that we can proceed with IAP */
                if (self->iriap) {
                        IRDA_WARNING("%s: busy with a previous query\n",
-                                    __FUNCTION__);
+                                    __func__);
                        kfree(ias_opt);
                        return -EBUSY;
                }
@@ -2419,13 +2408,12 @@ bed:
                if (!self->cachedaddr) {
                        int ret = 0;
 
-                       IRDA_DEBUG(1, "%s(), nothing discovered yet, going to sleep...\n", __FUNCTION__);
+                       IRDA_DEBUG(1, "%s(), nothing discovered yet, going to sleep...\n", __func__);
 
                        /* Set watchdog timer to expire in <val> ms. */
                        self->errno = 0;
-                       init_timer(&self->watchdog);
-                       self->watchdog.function = irda_discovery_timeout;
-                       self->watchdog.data = (unsigned long) self;
+                       setup_timer(&self->watchdog, irda_discovery_timeout,
+                                       (unsigned long)self);
                        self->watchdog.expires = jiffies + (val * HZ/1000);
                        add_timer(&(self->watchdog));
 
@@ -2438,14 +2426,14 @@ bed:
                        if(timer_pending(&(self->watchdog)))
                                del_timer(&(self->watchdog));
 
-                       IRDA_DEBUG(1, "%s(), ...waking up !\n", __FUNCTION__);
+                       IRDA_DEBUG(1, "%s(), ...waking up !\n", __func__);
 
                        if (ret != 0)
                                return ret;
                }
                else
                        IRDA_DEBUG(1, "%s(), found immediately !\n",
-                                  __FUNCTION__);
+                                  __func__);
 
                /* Tell IrLMP that we have been notified */
                irlmp_update_client(self->ckey, self->mask.word,
@@ -2579,7 +2567,6 @@ static const struct proto_ops SOCKOPS_WRAPPED(irda_ultra_ops) = {
 };
 #endif /* CONFIG_IRDA_ULTRA */
 
-#include <linux/smp_lock.h>
 SOCKOPS_WRAP(irda_stream, PF_IRDA);
 SOCKOPS_WRAP(irda_seqpacket, PF_IRDA);
 SOCKOPS_WRAP(irda_dgram, PF_IRDA);
@@ -2609,7 +2596,7 @@ int __init irsock_init(void)
  *    Remove IrDA protocol
  *
  */
-void __exit irsock_cleanup(void)
+void irsock_cleanup(void)
 {
        sock_unregister(PF_IRDA);
        proto_unregister(&irda_proto);