diff --git a/sys/net/if_vlan.c b/sys/net/if_vlan.c index f5b401c446ed..6aa872a19364 100644 --- a/sys/net/if_vlan.c +++ b/sys/net/if_vlan.c @@ -2304,10 +2304,10 @@ vlan_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) * We should propagate selected flags to the parent, * e.g., promiscuous mode. */ - VLAN_XLOCK(); + VLAN_SLOCK(); if (TRUNK(ifv) != NULL) error = vlan_setflags(ifp, 1); - VLAN_XUNLOCK(); + VLAN_SUNLOCK(); break; case SIOCADDMULTI: diff --git a/tests/sys/net/if_vlan.sh b/tests/sys/net/if_vlan.sh index 96426254bb6d..e4c737121bdb 100755 --- a/tests/sys/net/if_vlan.sh +++ b/tests/sys/net/if_vlan.sh @@ -221,6 +221,34 @@ qinq_dot_cleanup() vnet_cleanup } +atf_test_case "qinq_setflags" "cleanup" +qinq_setflags_head() +{ + atf_set descr 'Test setting flags on a QinQ device' + atf_set require.user root +} + +qinq_setflags_body() +{ + vnet_init + + epair=$(vnet_mkepair) + + ifconfig ${epair}a up + vlan1=$(ifconfig vlan create) + ifconfig $vlan1 vlan 1 vlandev ${epair}a + vlan2=$(ifconfig vlan create) + ifconfig $vlan2 vlan 2 vlandev $vlan1 + + # This panics, incorrect locking + ifconfig $vlan2 promisc +} + +qinq_setflags_cleanup() +{ + vnet_cleanup +} + atf_test_case "bpf_pcp" "cleanup" bpf_pcp_head() { @@ -273,5 +301,6 @@ atf_init_test_cases() atf_add_test_case "qinq_deep" atf_add_test_case "qinq_legacy" atf_add_test_case "qinq_dot" + atf_add_test_case "qinq_setflags" atf_add_test_case "bpf_pcp" }