diff options
| -rw-r--r-- | sys/dev/pci/if_iwm.c | 10 | ||||
| -rw-r--r-- | sys/net/if.c | 5 | ||||
| -rw-r--r-- | sys/netinet/in.c | 8 | ||||
| -rw-r--r-- | sys/netinet6/in6.c | 11 |
4 files changed, 20 insertions, 14 deletions
diff --git a/sys/dev/pci/if_iwm.c b/sys/dev/pci/if_iwm.c index 21ace7310a4..38ee48b35a9 100644 --- a/sys/dev/pci/if_iwm.c +++ b/sys/dev/pci/if_iwm.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if_iwm.c,v 1.162 2017/02/04 19:20:59 guenther Exp $ */ +/* $OpenBSD: if_iwm.c,v 1.163 2017/02/07 10:08:21 mpi Exp $ */ /* * Copyright (c) 2014, 2016 genua gmbh <info@genua.de> @@ -6133,18 +6133,13 @@ iwm_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) struct ifreq *ifr; int s, err = 0; - /* XXXSMP breaks atomicity */ - rw_exit_write(&netlock); - /* * Prevent processes from entering this function while another * process is tsleep'ing in it. */ err = rw_enter(&sc->ioctl_rwl, RW_WRITE | RW_INTR); - if (err) { - rw_enter_write(&netlock); + if (err) return err; - } s = splnet(); @@ -6190,7 +6185,6 @@ iwm_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) splx(s); rw_exit(&sc->ioctl_rwl); - rw_enter_write(&netlock); return err; } diff --git a/sys/net/if.c b/sys/net/if.c index e5c25eb6416..4983649356c 100644 --- a/sys/net/if.c +++ b/sys/net/if.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if.c,v 1.485 2017/02/01 02:02:01 jsg Exp $ */ +/* $OpenBSD: if.c,v 1.486 2017/02/07 10:08:21 mpi Exp $ */ /* $NetBSD: if.c,v 1.35 1996/05/07 05:26:04 thorpej Exp $ */ /* @@ -2029,7 +2029,10 @@ ifioctl(struct socket *so, u_long cmd, caddr_t data, struct proc *p) case SIOCGIFPARENT: if (ifp->if_ioctl == 0) return (EOPNOTSUPP); + /* XXXSMP breaks atomicity */ + rw_exit_write(&netlock); error = (*ifp->if_ioctl)(ifp, cmd, data); + rw_enter_write(&netlock); break; case SIOCGIFDESCR: diff --git a/sys/netinet/in.c b/sys/netinet/in.c index 2513b310d56..2cd1f56a524 100644 --- a/sys/netinet/in.c +++ b/sys/netinet/in.c @@ -1,4 +1,4 @@ -/* $OpenBSD: in.c,v 1.133 2016/12/20 12:35:38 bluhm Exp $ */ +/* $OpenBSD: in.c,v 1.134 2017/02/07 10:08:21 mpi Exp $ */ /* $NetBSD: in.c,v 1.26 1996/02/13 23:41:39 christos Exp $ */ /* @@ -390,7 +390,11 @@ in_ioctl(u_long cmd, caddr_t data, struct ifnet *ifp, int privileged) default: if (ifp->if_ioctl == NULL) return (EOPNOTSUPP); - return ((*ifp->if_ioctl)(ifp, cmd, data)); + /* XXXSMP breaks atomicity */ + rw_exit_write(&netlock); + error = ((*ifp->if_ioctl)(ifp, cmd, data)); + rw_enter_write(&netlock); + return (error); } return (0); } diff --git a/sys/netinet6/in6.c b/sys/netinet6/in6.c index d67a1844d84..9f854c7c85b 100644 --- a/sys/netinet6/in6.c +++ b/sys/netinet6/in6.c @@ -1,4 +1,4 @@ -/* $OpenBSD: in6.c,v 1.197 2017/02/05 16:04:14 jca Exp $ */ +/* $OpenBSD: in6.c,v 1.198 2017/02/07 10:08:21 mpi Exp $ */ /* $KAME: in6.c,v 1.372 2004/06/14 08:14:21 itojun Exp $ */ /* @@ -190,6 +190,7 @@ in6_ioctl(u_long cmd, caddr_t data, struct ifnet *ifp, int privileged) struct in6_ifaddr *ia6 = NULL; struct in6_aliasreq *ifra = (struct in6_aliasreq *)data; struct sockaddr_in6 *sa6; + int error; if (ifp == NULL) return (EOPNOTSUPP); @@ -469,9 +470,13 @@ in6_ioctl(u_long cmd, caddr_t data, struct ifnet *ifp, int privileged) break; default: - if (ifp == NULL || ifp->if_ioctl == 0) + if (ifp->if_ioctl == NULL) return (EOPNOTSUPP); - return ((*ifp->if_ioctl)(ifp, cmd, data)); + /* XXXSMP breaks atomicity */ + rw_exit_write(&netlock); + error = ((*ifp->if_ioctl)(ifp, cmd, data)); + rw_enter_write(&netlock); + return (error); } return (0); |
