Page MenuHomeFreeBSD

D57154.diff
No OneTemporary

D57154.diff

diff --git a/sys/net/if.c b/sys/net/if.c
--- a/sys/net/if.c
+++ b/sys/net/if.c
@@ -107,6 +107,8 @@
#include <security/mac/mac_framework.h>
+#include <vm/vm_extern.h>
+
/*
* Consumers of struct ifreq such as tcpdump assume no pad between ifr_name
* and ifr_ifru when it is used in SIOCGIFCONF.
@@ -1375,11 +1377,8 @@
ifgl->ifgl_group = ifg;
ifgm->ifgm_ifp = ifp;
- IF_ADDR_WLOCK(ifp);
CK_STAILQ_INSERT_TAIL(&ifg->ifg_members, ifgm, ifgm_next);
CK_STAILQ_INSERT_TAIL(&ifp->if_groups, ifgl, ifgl_next);
- IF_ADDR_WUNLOCK(ifp);
-
IFNET_WUNLOCK();
if (new)
@@ -1402,9 +1401,7 @@
IFNET_WLOCK_ASSERT();
- IF_ADDR_WLOCK(ifp);
CK_STAILQ_REMOVE(&ifp->if_groups, ifgl, ifg_list, ifgl_next);
- IF_ADDR_WUNLOCK(ifp);
CK_STAILQ_FOREACH(ifgm, &ifgl->ifgl_group->ifg_members, ifgm_next) {
if (ifgm->ifgm_ifp == ifp) {
@@ -1479,34 +1476,35 @@
static int
if_getgroup(struct ifgroupreq *ifgr, struct ifnet *ifp)
{
- int len, error;
- struct ifg_list *ifgl;
- struct ifg_req ifgrq, *ifgp;
-
- NET_EPOCH_ASSERT();
+ struct ifg_list *ifgl;
+ struct ifg_req ifgrq, *ifgp;
+ int len, error;
+ IFNET_RLOCK();
if (ifgr->ifgr_len == 0) {
CK_STAILQ_FOREACH(ifgl, &ifp->if_groups, ifgl_next)
ifgr->ifgr_len += sizeof(struct ifg_req);
- return (0);
- }
-
- len = ifgr->ifgr_len;
- ifgp = ifgr->ifgr_groups;
- /* XXX: wire */
- CK_STAILQ_FOREACH(ifgl, &ifp->if_groups, ifgl_next) {
- if (len < sizeof(ifgrq))
- return (EINVAL);
- bzero(&ifgrq, sizeof ifgrq);
- strlcpy(ifgrq.ifgrq_group, ifgl->ifgl_group->ifg_group,
- sizeof(ifgrq.ifgrq_group));
- if ((error = copyout(&ifgrq, ifgp, sizeof(struct ifg_req))))
- return (error);
- len -= sizeof(ifgrq);
- ifgp++;
+ error = 0;
+ } else {
+ len = ifgr->ifgr_len;
+ ifgp = ifgr->ifgr_groups;
+ CK_STAILQ_FOREACH(ifgl, &ifp->if_groups, ifgl_next) {
+ if (len < sizeof(ifgrq)) {
+ error = EINVAL;
+ break;
+ }
+ bzero(&ifgrq, sizeof ifgrq);
+ strlcpy(ifgrq.ifgrq_group, ifgl->ifgl_group->ifg_group,
+ sizeof(ifgrq.ifgrq_group));
+ if ((error = copyout(&ifgrq, ifgp, sizeof(struct ifg_req))))
+ break;
+ len -= sizeof(ifgrq);
+ ifgp++;
+ }
}
+ IFNET_RUNLOCK();
- return (0);
+ return (error);
}
/*
@@ -2756,14 +2754,8 @@
break;
}
case SIOCGIFGROUP:
- {
- struct epoch_tracker et;
-
- NET_EPOCH_ENTER(et);
error = if_getgroup((struct ifgroupreq *)data, ifp);
- NET_EPOCH_EXIT(et);
break;
- }
case SIOCDIFGROUP:
{
diff --git a/sys/net/if_private.h b/sys/net/if_private.h
--- a/sys/net/if_private.h
+++ b/sys/net/if_private.h
@@ -41,7 +41,7 @@
CK_STAILQ_ENTRY(ifnet) if_link; /* all struct ifnets are chained (CK_) */
LIST_ENTRY(ifnet) if_clones; /* interfaces of a cloner */
CK_STAILQ_HEAD(, ifg_list) if_groups; /* linked list of groups per if (CK_) */
- /* protected by if_addr_lock */
+ /* protected by ifnet_sxlock */
u_char if_alloctype; /* if_type at time of allocation */
uint8_t if_numa_domain; /* NUMA domain of device */
/* Driver and protocol specific information that remains stable. */

File Metadata

Mime Type
text/plain
Expires
Mon, May 25, 9:04 AM (22 h, 20 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
33489063
Default Alt Text
D57154.diff (3 KB)

Event Timeline