IPoIB: Fix multicast race between canceling and completing
authorMichael S. Tsirkin <mst@mellanox.co.il>
Thu, 2 Mar 2006 19:07:47 +0000 (11:07 -0800)
committerRoland Dreier <rolandd@cisco.com>
Mon, 20 Mar 2006 18:08:20 +0000 (10:08 -0800)
commit9acf6a8570dcfc9f55724b8b71099fc8768e8c26
tree5b265bf0474f321722d2690b5b5dc57cde80690e
parent54d07e2a1ead2f093ce054cda2e0f5ec163c650c
IPoIB: Fix multicast race between canceling and completing

ipoib_mcast_stop_thread currently tests mcast->query and if it is
NULL, does not perform wait_for_completion on the mcast and frees the
mcast object directly.

However, since both operations are done without locking, it is
possible that ipoib_mcast_join_complete is in progress on this mcast
object and has set mcast->query to NULL already.

Solve this by:
- taking priv->lock before we change mcast->query in ipoib_mcast_join_complete,
  and keeping it until we no longer need the mcast object
- taking priv->lock around mcast->query test in ipoib_mcast_stop_thread

Signed-off-by: Michael S. Tsirkin <mst@mellanox.co.il>
Signed-off-by: Roland Dreier <rolandd@cisco.com>
drivers/infiniband/ulp/ipoib/ipoib_multicast.c