Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6
[pandora-kernel.git] / net / ipv4 / raw.c
index 3dc9171..ebb1e58 100644 (file)
@@ -375,7 +375,7 @@ static int raw_send_hdrinc(struct sock *sk, void *from, size_t length,
        err = NF_HOOK(PF_INET, NF_INET_LOCAL_OUT, skb, NULL, rt->u.dst.dev,
                      dst_output);
        if (err > 0)
-               err = inet->recverr ? net_xmit_errno(err) : 0;
+               err = net_xmit_errno(err);
        if (err)
                goto error;
 out:
@@ -386,6 +386,8 @@ error_fault:
        kfree_skb(skb);
 error:
        IP_INC_STATS(net, IPSTATS_MIB_OUTDISCARDS);
+       if (err == -ENOBUFS && !inet->recverr)
+               err = 0;
        return err;
 }
 
@@ -576,8 +578,11 @@ back_from_confirm:
                                        &ipc, &rt, msg->msg_flags);
                if (err)
                        ip_flush_pending_frames(sk);
-               else if (!(msg->msg_flags & MSG_MORE))
+               else if (!(msg->msg_flags & MSG_MORE)) {
                        err = ip_push_pending_frames(sk);
+                       if (err == -ENOBUFS && !inet->recverr)
+                               err = 0;
+               }
                release_sock(sk);
        }
 done:
@@ -799,7 +804,8 @@ static int raw_ioctl(struct sock *sk, int cmd, unsigned long arg)
 {
        switch (cmd) {
                case SIOCOUTQ: {
-                       int amount = atomic_read(&sk->sk_wmem_alloc);
+                       int amount = sk_wmem_alloc_get(sk);
+
                        return put_user(amount, (int __user *)arg);
                }
                case SIOCINQ: {
@@ -935,8 +941,8 @@ static void raw_sock_seq_show(struct seq_file *seq, struct sock *sp, int i)
        seq_printf(seq, "%4d: %08X:%04X %08X:%04X"
                " %02X %08X:%08X %02X:%08lX %08X %5d %8d %lu %d %p %d\n",
                i, src, srcp, dest, destp, sp->sk_state,
-               atomic_read(&sp->sk_wmem_alloc),
-               atomic_read(&sp->sk_rmem_alloc),
+               sk_wmem_alloc_get(sp),
+               sk_rmem_alloc_get(sp),
                0, 0L, 0, sock_i_uid(sp), 0, sock_i_ino(sp),
                atomic_read(&sp->sk_refcnt), sp, atomic_read(&sp->sk_drops));
 }