In article <[email protected]>,
Tom Ivar Helbekkmo  <[email protected]> wrote:
>Tom Ivar Helbekkmo <[email protected]> writes:
>
>> Masanobu SAITOH <[email protected]> writes:
>>
>>>  Please test the latest -current. knakahara found a problem:
>>
>> That worked fine!  No longer any need for the tcpdump hack.  :)
>>
>> (I didn't get the latest -current; I just added those patches to 7.99.39.)
>
>Correction: it works *almost* fine.  Turns out that those patches alone
>let my main amd64 system boot without the tcpdump hack, and work well
>as, among other things, an NFS server.  However, another amd64 system
>that doesn't use VLANs, and is an NFS client, is unable to write to NFS
>file systems if it runs a kernel with the patch applied.
>
>Patch on NFS server, not on client: no problem.
>Patch on NFS server and client: writing to NFS hangs.
>Patch on NFS client, not on server: writing to NFS hangs.
>
>I guess the patch depends on other changes after 7.99.39...
>
>Just to be sure we agree what we're discussing, this is the patch:

Perhaps we want a lock?

Index: if_vlan.c
===================================================================
RCS file: /cvsroot/src/sys/net/if_vlan.c,v
retrieving revision 1.94
diff -u -u -r1.94 if_vlan.c
--- if_vlan.c   13 Jan 2017 06:11:56 -0000      1.94
+++ if_vlan.c   20 Jan 2017 22:05:49 -0000
@@ -313,10 +313,11 @@
                ifv->ifv_encaplen = ETHER_VLAN_ENCAP_LEN;
                ifv->ifv_mintu = ETHERMIN;
 
-               if (ec->ec_nvlans++ == 0) {
+               mutex_enter(ec->ec_lock);
+               if (ec->ec_nvlans == 0) {
                        if ((error = ether_enable_vlan_mtu(p)) >= 0) {
                                if (error) {
-                                       ec->ec_nvlans--;
+                                       mutex_exit(ec->ec_lock);
                                        return error;
                                }
                                ifv->ifv_mtufudge = 0;
@@ -348,6 +349,8 @@
                             IFCAP_CSUM_TCPv6_Tx|IFCAP_CSUM_TCPv6_Rx|
                             IFCAP_CSUM_UDPv6_Tx|IFCAP_CSUM_UDPv6_Rx);
                 }
+               ec->ec_nvlans++;
+               mutex_exit(ec->ec_lock);
                /*
                 * We inherit the parent's Ethernet address.
                 */
@@ -403,8 +406,10 @@
        case IFT_ETHER:
            {
                struct ethercom *ec = (void *)p;
+               mutex_enter(ec->ec_lock);
                if (--ec->ec_nvlans == 0)
                        (void)ether_disable_vlan_mtu(p);
+               mutex_exit(ec->ec_lock);
 
                ether_ifdetach(ifp);
                /* Restore vlan_ioctl overwritten by ether_ifdetach */

Reply via email to