From 0b15a28b357250a0952109edd76c51fd7b628e0a Mon Sep 17 00:00:00 2001 From: Tina Yang Date: Thu, 1 Apr 2010 14:09:00 -0700 Subject: [PATCH] --- yaml --- r: 214369 b: refs/heads/master c: 35b52c70534cb7193b218ec12efe6bc595312097 h: refs/heads/master i: 214367: 8bd82dc0ee7c80da0cb853cde9c2ec381cf88159 v: v3 --- [refs] | 2 +- trunk/net/rds/rdma.c | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 7eb6057979a6..feca2dcb2595 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 9e2effba2c16fc3bd47da605116485afe01e0be0 +refs/heads/master: 35b52c70534cb7193b218ec12efe6bc595312097 diff --git a/trunk/net/rds/rdma.c b/trunk/net/rds/rdma.c index 3b442d4d64cf..463b458ff27e 100644 --- a/trunk/net/rds/rdma.c +++ b/trunk/net/rds/rdma.c @@ -130,14 +130,22 @@ void rds_rdma_drop_keys(struct rds_sock *rs) { struct rds_mr *mr; struct rb_node *node; + unsigned long flags; /* Release any MRs associated with this socket */ + spin_lock_irqsave(&rs->rs_rdma_lock, flags); while ((node = rb_first(&rs->rs_rdma_keys))) { mr = container_of(node, struct rds_mr, r_rb_node); if (mr->r_trans == rs->rs_transport) mr->r_invalidate = 0; + rb_erase(&mr->r_rb_node, &rs->rs_rdma_keys); + RB_CLEAR_NODE(&mr->r_rb_node); + spin_unlock_irqrestore(&rs->rs_rdma_lock, flags); + rds_destroy_mr(mr); rds_mr_put(mr); + spin_lock_irqsave(&rs->rs_rdma_lock, flags); } + spin_unlock_irqrestore(&rs->rs_rdma_lock, flags); if (rs->rs_transport && rs->rs_transport->flush_mrs) rs->rs_transport->flush_mrs();