IB/qib: Fix QP locate/remove race
[linux.git] / drivers / infiniband / hw / qib / qib_qp.c
index 35275099cafd660cd2fc20ab865d08c417f51735..a6a2cc2ba260ddd80ca6e23982864ec8e969e9b4 100644 (file)
@@ -268,8 +268,9 @@ static void remove_qp(struct qib_ibdev *dev, struct qib_qp *qp)
                                qpp = &q->next)
                        if (q == qp) {
                                atomic_dec(&qp->refcount);
-                               *qpp = qp->next;
-                               rcu_assign_pointer(qp->next, NULL);
+                               rcu_assign_pointer(*qpp,
+                                       rcu_dereference_protected(qp->next,
+                                        lockdep_is_held(&dev->qpt_lock)));
                                break;
                        }
        }