__sctp_lookup_association() is only invoked by sctp_v4_err() and
sctp_rcv(), both which run on the rx BH, and it has been protected
by rcu_read_lock [see ip_local_deliver_finish() / ipv6_rcv()].
So we can move it to sctp_lookup_association, only let
sctp_lookup_association use rcu_read_lock.
Signed-off-by: Xin Long <lucien.xin@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
        struct sctp_transport *t;
        struct sctp_association *asoc = NULL;
 
-       rcu_read_lock();
        t = sctp_addrs_lookup_transport(net, local, peer);
        if (!t || !sctp_transport_hold(t))
                goto out;
        sctp_transport_put(t);
 
 out:
-       rcu_read_unlock();
        return asoc;
 }
 
 {
        struct sctp_association *asoc;
 
+       rcu_read_lock();
        asoc = __sctp_lookup_association(net, laddr, paddr, transportp);
+       rcu_read_unlock();
 
        return asoc;
 }