This was in fact in_ioctl_get(). --- Push kernel lock into nd6_ioctl()
Purely mechanical. Feedback? OK? --- sys/netinet6/in6.c | 2 -- sys/netinet6/nd6.c | 5 +++++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/sys/netinet6/in6.c b/sys/netinet6/in6.c index 65f4b44e700..3c5b47bc1ed 100644 --- a/sys/netinet6/in6.c +++ b/sys/netinet6/in6.c @@ -231,9 +231,7 @@ in6_ioctl(u_long cmd, caddr_t data, struct ifnet *ifp, int privileged) switch (cmd) { case SIOCGIFINFO_IN6: case SIOCGNBRINFO_IN6: - KERNEL_LOCK(); error = nd6_ioctl(cmd, data, ifp); - KERNEL_UNLOCK(); return (error); case SIOCGIFDSTADDR_IN6: case SIOCGIFNETMASK_IN6: diff --git a/sys/netinet6/nd6.c b/sys/netinet6/nd6.c index d88969be617..716946ab831 100644 --- a/sys/netinet6/nd6.c +++ b/sys/netinet6/nd6.c @@ -1018,9 +1018,11 @@ nd6_ioctl(u_long cmd, caddr_t data, struct ifnet *ifp) switch (cmd) { case SIOCGIFINFO_IN6: + KERNEL_LOCK(); NET_LOCK_SHARED(); ndi->ndi = *ND_IFINFO(ifp); NET_UNLOCK_SHARED(); + KERNEL_UNLOCK(); return (0); case SIOCGNBRINFO_IN6: { @@ -1028,6 +1030,7 @@ nd6_ioctl(u_long cmd, caddr_t data, struct ifnet *ifp) struct in6_addr nb_addr = nbi->addr; /* make local for safety */ time_t expire; + KERNEL_LOCK(); NET_LOCK_SHARED(); /* * XXX: KAME specific hack for scoped addresses @@ -1046,6 +1049,7 @@ nd6_ioctl(u_long cmd, caddr_t data, struct ifnet *ifp) (ln = (struct llinfo_nd6 *)rt->rt_llinfo) == NULL) { rtfree(rt); NET_UNLOCK_SHARED(); + KERNEL_UNLOCK(); return (EINVAL); } expire = ln->ln_rt->rt_expire; @@ -1061,6 +1065,7 @@ nd6_ioctl(u_long cmd, caddr_t data, struct ifnet *ifp) rtfree(rt); NET_UNLOCK_SHARED(); + KERNEL_UNLOCK(); return (0); } } -- 2.38.1