bridge: Fix potential deadlock on br->multicast_lock
multicast_lock is taken in softirq context, so we should use spin_lock_bh() in userspace. call-chain in softirq context: run_timer_softirq() br_multicast_query_expired() call-chain in userspace: sysfs_write_file() store_multicast_snooping() br_multicast_toggle() Signed-off-by: Andrew Vagin <avagin@openvz.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
731abb9cb2
commit
ef5e0d8237
@@ -1770,7 +1770,7 @@ int br_multicast_toggle(struct net_bridge *br, unsigned long val)
|
|||||||
int err = 0;
|
int err = 0;
|
||||||
struct net_bridge_mdb_htable *mdb;
|
struct net_bridge_mdb_htable *mdb;
|
||||||
|
|
||||||
spin_lock(&br->multicast_lock);
|
spin_lock_bh(&br->multicast_lock);
|
||||||
if (br->multicast_disabled == !val)
|
if (br->multicast_disabled == !val)
|
||||||
goto unlock;
|
goto unlock;
|
||||||
|
|
||||||
@@ -1806,7 +1806,7 @@ rollback:
|
|||||||
}
|
}
|
||||||
|
|
||||||
unlock:
|
unlock:
|
||||||
spin_unlock(&br->multicast_lock);
|
spin_unlock_bh(&br->multicast_lock);
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user