net/ipv6: Correct PIM6 mrt_lock handling
authorRichard Laing <richard.laing@alliedtelesis.co.nz>
Thu, 3 Sep 2015 01:52:31 +0000 (13:52 +1200)
committerDavid S. Miller <davem@davemloft.net>
Sun, 6 Sep 2015 00:31:30 +0000 (17:31 -0700)
In the IPv6 multicast routing code the mrt_lock was not being released
correctly in the MFC iterator, as a result adding or deleting a MIF would
cause a hang because the mrt_lock could not be acquired.

This fix is a copy of the code for the IPv4 case and ensures that the lock
is released correctly.

Signed-off-by: Richard Laing <richard.laing@alliedtelesis.co.nz>
Acked-by: Cong Wang <cwang@twopensource.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv6/ip6mr.c

index 74ceb73c1c9a042b0f8f9f65c264e8426d65f7f3..5f36266b1f5ef94fbb849cccf3babf46404cc97c 100644 (file)
@@ -550,7 +550,7 @@ static void ipmr_mfc_seq_stop(struct seq_file *seq, void *v)
 
        if (it->cache == &mrt->mfc6_unres_queue)
                spin_unlock_bh(&mfc_unres_lock);
-       else if (it->cache == mrt->mfc6_cache_array)
+       else if (it->cache == &mrt->mfc6_cache_array[it->ct])
                read_unlock(&mrt_lock);
 }