Merge branch 'pandora-27-omap1' into rev2
[pandora-kernel.git] / net / decnet / af_decnet.c
index fc2efe8..3c23ab3 100644 (file)
@@ -451,7 +451,7 @@ static void dn_destruct(struct sock *sk)
 
 static int dn_memory_pressure;
 
-static void dn_enter_memory_pressure(void)
+static void dn_enter_memory_pressure(struct sock *sk)
 {
        if (!dn_memory_pressure) {
                dn_memory_pressure = 1;
@@ -1719,6 +1719,8 @@ static int dn_recvmsg(struct kiocb *iocb, struct socket *sock,
         * See if there is data ready to read, sleep if there isn't
         */
        for(;;) {
+               DEFINE_WAIT(wait);
+
                if (sk->sk_err)
                        goto out;
 
@@ -1748,14 +1750,11 @@ static int dn_recvmsg(struct kiocb *iocb, struct socket *sock,
                        goto out;
                }
 
-               set_bit(SOCK_ASYNC_WAITDATA, &sock->flags);
-               SOCK_SLEEP_PRE(sk)
-
-               if (!dn_data_ready(sk, queue, flags, target))
-                       schedule();
-
-               SOCK_SLEEP_POST(sk)
-               clear_bit(SOCK_ASYNC_WAITDATA, &sock->flags);
+               prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE);
+               set_bit(SOCK_ASYNC_WAITDATA, &sk->sk_socket->flags);
+               sk_wait_event(sk, &timeo, dn_data_ready(sk, queue, flags, target));
+               clear_bit(SOCK_ASYNC_WAITDATA, &sk->sk_socket->flags);
+               finish_wait(sk->sk_sleep, &wait);
        }
 
        for(skb = queue->next; skb != (struct sk_buff *)queue; skb = nskb) {
@@ -2002,18 +2001,19 @@ static int dn_sendmsg(struct kiocb *iocb, struct socket *sock,
                 * size.
                 */
                if (dn_queue_too_long(scp, queue, flags)) {
+                       DEFINE_WAIT(wait);
+
                        if (flags & MSG_DONTWAIT) {
                                err = -EWOULDBLOCK;
                                goto out;
                        }
 
-                       SOCK_SLEEP_PRE(sk)
-
-                       if (dn_queue_too_long(scp, queue, flags))
-                               schedule();
-
-                       SOCK_SLEEP_POST(sk)
-
+                       prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE);
+                       set_bit(SOCK_ASYNC_WAITDATA, &sk->sk_socket->flags);
+                       sk_wait_event(sk, &timeo,
+                                     !dn_queue_too_long(scp, queue, flags));
+                       clear_bit(SOCK_ASYNC_WAITDATA, &sk->sk_socket->flags);
+                       finish_wait(sk->sk_sleep, &wait);
                        continue;
                }
 
@@ -2089,7 +2089,7 @@ static int dn_device_event(struct notifier_block *this, unsigned long event,
 {
        struct net_device *dev = (struct net_device *)ptr;
 
-       if (dev_net(dev) != &init_net)
+       if (!net_eq(dev_net(dev), &init_net))
                return NOTIFY_DONE;
 
        switch(event) {