]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - net/unix/af_unix.c
[AF_UNIX]: Remove superfluous reference counting in unix_stream_sendmsg
[mv-sheeva.git] / net / unix / af_unix.c
index acc73ba8bade52770d1babc0bbf19e8abfe1cbef..1dc3685048f3077877f267d294bae67aca658fb2 100644 (file)
@@ -1063,10 +1063,12 @@ restart:
        /* Set credentials */
        sk->sk_peercred = other->sk_peercred;
 
-       sock_hold(newsk);
-       unix_peer(sk)   = newsk;
        sock->state     = SS_CONNECTED;
        sk->sk_state    = TCP_ESTABLISHED;
+       sock_hold(newsk);
+
+       smp_mb__after_atomic_inc();     /* sock_hold() does an atomic_inc() */
+       unix_peer(sk)   = newsk;
 
        unix_state_wunlock(sk);
 
@@ -1414,7 +1416,7 @@ static int unix_stream_sendmsg(struct kiocb *kiocb, struct socket *sock,
        } else {
                sunaddr = NULL;
                err = -ENOTCONN;
-               other = unix_peer_get(sk);
+               other = unix_peer(sk);
                if (!other)
                        goto out_err;
        }
@@ -1476,7 +1478,6 @@ static int unix_stream_sendmsg(struct kiocb *kiocb, struct socket *sock,
                other->sk_data_ready(other, size);
                sent+=size;
        }
-       sock_put(other);
 
        scm_destroy(siocb->scm);
        siocb->scm = NULL;
@@ -1491,8 +1492,6 @@ pipe_err:
                send_sig(SIGPIPE,current,0);
        err = -EPIPE;
 out_err:
-        if (other)
-               sock_put(other);
        scm_destroy(siocb->scm);
        siocb->scm = NULL;
        return sent ? : err;