The global group list keeps being protected by the net lock, but calling
into netinet/ip_carp.c:carp_ifgattr_ioctl() still needs the big lock.
Only carp(4) uses group attributes, so this unlocks just a small part of
if_setgroupattribs(), but it also clarifies what is locked and why.
Feedback? OK?
diff --git a/sys/net/if.c b/sys/net/if.c
index 6b13c2800fb..7b5b27b776c 100644
--- a/sys/net/if.c
+++ b/sys/net/if.c
@@ -1910,11 +1910,9 @@ ifioctl(struct socket *so, u_long cmd, caddr_t data,
struct proc *p)
case SIOCSIFGATTR:
if ((error = suser(p)) != 0)
return (error);
- KERNEL_LOCK();
NET_LOCK();
error = if_setgroupattribs(data);
NET_UNLOCK();
- KERNEL_UNLOCK();
return (error);
case SIOCGIFCONF:
case SIOCIFGCLONERS:
@@ -2964,8 +2962,10 @@ if_setgroupattribs(caddr_t data)
ifg->ifg_carp_demoted += demote;
+ KERNEL_LOCK(); /* for carp_ifgattr_ioctl() only */
TAILQ_FOREACH(ifgm, &ifg->ifg_members, ifgm_next)
ifgm->ifgm_ifp->if_ioctl(ifgm->ifgm_ifp, SIOCSIFGATTR, data);
+ KERNEL_UNLOCK();
return (0);
}