net: only invoke dev->change_rx_flags when device is UP
authorPatrick McHardy <kaber@trash.net>
Tue, 7 Oct 2008 22:26:48 +0000 (15:26 -0700)
committerDavid S. Miller <davem@davemloft.net>
Tue, 7 Oct 2008 22:26:48 +0000 (15:26 -0700)
commitb6c40d68ff6498b7f63ddf97cf0aa818d748dee7
tree456b4b762260901bb0d1d311ff8b01a37f1f55f7
parent859f4c74d8de4dc344b3a115367d5e22a79bddaf
net: only invoke dev->change_rx_flags when device is UP

Jesper Dangaard Brouer <hawk@comx.dk> reported a bug when setting a VLAN
device down that is in promiscous mode:

When the VLAN device is set down, the promiscous count on the real
device is decremented by one by vlan_dev_stop(). When removing the
promiscous flag from the VLAN device afterwards, the promiscous
count on the real device is decremented a second time by the
vlan_change_rx_flags() callback.

The root cause for this is that the ->change_rx_flags() callback is
invoked while the device is down. The synchronization is meant to mirror
the behaviour of the ->set_rx_mode callbacks, meaning the ->open function
is responsible for doing a full sync on open, the ->close() function is
responsible for doing full cleanup on ->stop() and ->change_rx_flags()
is meant to do incremental changes while the device is UP.

Only invoke ->change_rx_flags() while the device is UP to provide the
intended behaviour.

Tested-by: Jesper Dangaard Brouer <jdb@comx.dk>
Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/core/dev.c