Ensure that we are holding the lock when initialising the bridge interface. We

could initialise while unlocked if the bridge is not up when setting the inet
address, ether_ioctl() would call bridge_init.

Change it so bridge_init is always called unlocked and then locks before
calling bstp_initialization().

Reported by:	Michal Mertl
Approved by:	mlaier (mentor)
MFC after:	3 days
This commit is contained in:
Andrew Thompson 2005-08-15 02:50:13 +00:00
parent d41a7ed490
commit a1c0fd4dee
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=149064

View File

@ -597,6 +597,7 @@ bridge_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
* If interface is marked up and it is stopped, then
* start it.
*/
BRIDGE_UNLOCK(sc);
(*ifp->if_init)(sc);
}
break;
@ -1214,8 +1215,10 @@ bridge_init(void *xsc)
callout_reset(&sc->sc_brcallout, bridge_rtable_prune_period * hz,
bridge_timer, sc);
BRIDGE_LOCK(sc);
ifp->if_drv_flags |= IFF_DRV_RUNNING;
bstp_initialization(sc);
BRIDGE_UNLOCK(sc);
return;
}
@ -1229,6 +1232,8 @@ bridge_stop(struct ifnet *ifp, int disable)
{
struct bridge_softc *sc = ifp->if_softc;
BRIDGE_LOCK_ASSERT(sc);
if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0)
return;