diff options
| author | Matt Macy <mmacy@FreeBSD.org> | 2018-05-05 22:40:40 +0000 |
|---|---|---|
| committer | Matt Macy <mmacy@FreeBSD.org> | 2018-05-05 22:40:40 +0000 |
| commit | 28c001002a3e0c772c47c00742e414677c5f8c8e (patch) | |
| tree | e1bafd963f12fd686fd05672c034bd85ee9406d1 /sys/netinet6 | |
| parent | b6f2c452cb879f88f392e0d48582e2239c6e51bb (diff) | |
Notes
Diffstat (limited to 'sys/netinet6')
| -rw-r--r-- | sys/netinet6/in6_mcast.c | 13 | ||||
| -rw-r--r-- | sys/netinet6/in6_var.h | 3 |
2 files changed, 14 insertions, 2 deletions
diff --git a/sys/netinet6/in6_mcast.c b/sys/netinet6/in6_mcast.c index fe8da6685770..023e3a751327 100644 --- a/sys/netinet6/in6_mcast.c +++ b/sys/netinet6/in6_mcast.c @@ -1585,13 +1585,20 @@ in6p_findmoptions(struct inpcb *inp) * SMPng: NOTE: assumes INP write lock is held. */ void -ip6_freemoptions(struct ip6_moptions *imo) +ip6_freemoptions(struct ip6_moptions *imo, struct inpcbinfo *pcbinfo) { struct in6_mfilter *imf; size_t idx, nmships; + int wlock; if (imo == NULL) return; + INP_INFO_LOCK_ASSERT(pcbinfo); + wlock = INP_INFO_WLOCKED(pcbinfo); + if (wlock) + INP_INFO_WUNLOCK(pcbinfo); + else + INP_INFO_RUNLOCK(pcbinfo); nmships = imo->im6o_num_memberships; for (idx = 0; idx < nmships; ++idx) { @@ -1608,6 +1615,10 @@ ip6_freemoptions(struct ip6_moptions *imo) free(imo->im6o_mfilters, M_IN6MFILTER); free(imo->im6o_membership, M_IP6MOPTS); free(imo, M_IP6MOPTS); + if (wlock) + INP_INFO_WLOCK(pcbinfo); + else + INP_INFO_RLOCK(pcbinfo); } /* diff --git a/sys/netinet6/in6_var.h b/sys/netinet6/in6_var.h index 6f1c6dbcdd02..7a98fc7c0c7c 100644 --- a/sys/netinet6/in6_var.h +++ b/sys/netinet6/in6_var.h @@ -807,6 +807,7 @@ in6m_rele_locked(struct in6_multi_head *inmh, struct in6_multi *inm) struct ip6_moptions; struct sockopt; +struct inpcbinfo; /* Multicast KPIs. */ int im6o_mc_filter(const struct ip6_moptions *, const struct ifnet *, @@ -823,7 +824,7 @@ void in6m_print(const struct in6_multi *); int in6m_record_source(struct in6_multi *, const struct in6_addr *); void in6m_release_deferred(struct in6_multi *); void in6m_release_list_deferred(struct in6_multi_head *); -void ip6_freemoptions(struct ip6_moptions *); +void ip6_freemoptions(struct ip6_moptions *, struct inpcbinfo *); int ip6_getmoptions(struct inpcb *, struct sockopt *); int ip6_setmoptions(struct inpcb *, struct sockopt *); |
