diff options
author | yongari <yongari@FreeBSD.org> | 2011-12-07 21:54:44 +0000 |
---|---|---|
committer | yongari <yongari@FreeBSD.org> | 2011-12-07 21:54:44 +0000 |
commit | be6c75b27877d84363fbd24bd805ecb00d1253fe (patch) | |
tree | 9beb638e302ed21ee5a1ba193488748ea02975dd /sys/dev | |
parent | c557fccc885517cacf953a1d5df3392a97b66285 (diff) | |
download | FreeBSD-src-be6c75b27877d84363fbd24bd805ecb00d1253fe.zip FreeBSD-src-be6c75b27877d84363fbd24bd805ecb00d1253fe.tar.gz |
Protect SIOCSIFMTU ioctl handler with driver lock.
Don't blindly re-initialize controller whenever MTU is changed.
Now, reinitializing is done only when driver is running.
While here, remove unnecessary assignment of error value since it
was already initialized to 0.
Diffstat (limited to 'sys/dev')
-rw-r--r-- | sys/dev/et/if_et.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/sys/dev/et/if_et.c b/sys/dev/et/if_et.c index 176d858..9d2848c 100644 --- a/sys/dev/et/if_et.c +++ b/sys/dev/et/if_et.c @@ -1287,11 +1287,11 @@ et_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) ET_LOCK(sc); et_setmulti(sc); ET_UNLOCK(sc); - error = 0; } break; case SIOCSIFMTU: + ET_LOCK(sc); #if 0 if (sc->sc_flags & ET_FLAG_JUMBO) max_framelen = ET_JUMBO_FRAMELEN; @@ -1301,14 +1301,18 @@ et_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) if (ET_FRAMELEN(ifr->ifr_mtu) > max_framelen) { error = EOPNOTSUPP; + ET_UNLOCK(sc); break; } if (ifp->if_mtu != ifr->ifr_mtu) { ifp->if_mtu = ifr->ifr_mtu; - ifp->if_drv_flags &= ~IFF_DRV_RUNNING; - et_init(sc); + if (ifp->if_drv_flags & IFF_DRV_RUNNING) { + ifp->if_drv_flags &= ~IFF_DRV_RUNNING; + et_init_locked(sc); + } } + ET_UNLOCK(sc); break; case SIOCSIFCAP: |