]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
sdp: do not reenter sdp_abort_rx_srcavail
authorAmir Vadai <amirv@mellanox.co.il>
Tue, 18 Jan 2011 17:03:32 +0000 (19:03 +0200)
committerMukesh Kacker <mukesh.kacker@oracle.com>
Tue, 6 Oct 2015 12:05:41 +0000 (05:05 -0700)
SrcAvailCancel could be handled from within sdp_abort_rx_srcavail. This
shouldn't happen. To prevent it, ssk->rx_sa is set to NULL at the begining.

Signed-off-by: Amir Vadai <amirv@mellanox.co.il>
drivers/infiniband/ulp/sdp/sdp_main.c

index 44f1f160105796574748bb915cefeb5ea3df4f3d..abf394ea4e3478baf0101d8c4afee44f0369412c 100644 (file)
@@ -2297,21 +2297,30 @@ fin:
 int sdp_abort_rx_srcavail(struct sock *sk, int post_sendsm)
 {
        struct sdp_sock *ssk = sdp_sk(sk);
+       struct rx_srcavail_state *rx_sa = ssk->rx_sa;
+       struct sk_buff *skb = rx_sa->skb;
        struct sdp_bsdh *h =
-               (struct sdp_bsdh *)skb_transport_header(ssk->rx_sa->skb);
+               (struct sdp_bsdh *)skb_transport_header(skb);
 
        sdp_dbg_data(sk, "SrcAvail aborted\n");
 
+       ssk->rx_sa = NULL;
+
        h->mid = SDP_MID_DATA;
 
-       sdp_post_rdma_rd_compl(sk, ssk->rx_sa);
+       sdp_post_rdma_rd_compl(sk, rx_sa);
        if (post_sendsm)
                sdp_post_sendsm(sk);
+
+       /* arriving SrcAvailCancel might be handled by sdp_do_posts(). Must set
+        * ssk->rx_sa to NULL before, to prevent it from reentering this
+        * function.
+        * XXX: Coming to think of that, Why to call sdp_do_posts() and not
+        *      sdp_post_sends()? */
        sdp_do_posts(ssk);
 
-       RX_SRCAVAIL_STATE(ssk->rx_sa->skb) = NULL;
-       kfree(ssk->rx_sa);
-       ssk->rx_sa = NULL;
+       RX_SRCAVAIL_STATE(skb) = NULL;
+       kfree(rx_sa);
 
        return 0;
 }