diff options
Diffstat (limited to 'net/8021q/vlan.c')
-rw-r--r-- | net/8021q/vlan.c | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/net/8021q/vlan.c b/net/8021q/vlan.c index addc578d5443..a18714469bf7 100644 --- a/net/8021q/vlan.c +++ b/net/8021q/vlan.c | |||
@@ -95,6 +95,8 @@ void unregister_vlan_dev(struct net_device *dev, struct list_head *head) | |||
95 | 95 | ||
96 | grp->nr_vlan_devs--; | 96 | grp->nr_vlan_devs--; |
97 | 97 | ||
98 | if (vlan->flags & VLAN_FLAG_MVRP) | ||
99 | vlan_mvrp_request_leave(dev); | ||
98 | if (vlan->flags & VLAN_FLAG_GVRP) | 100 | if (vlan->flags & VLAN_FLAG_GVRP) |
99 | vlan_gvrp_request_leave(dev); | 101 | vlan_gvrp_request_leave(dev); |
100 | 102 | ||
@@ -107,8 +109,10 @@ void unregister_vlan_dev(struct net_device *dev, struct list_head *head) | |||
107 | 109 | ||
108 | netdev_upper_dev_unlink(real_dev, dev); | 110 | netdev_upper_dev_unlink(real_dev, dev); |
109 | 111 | ||
110 | if (grp->nr_vlan_devs == 0) | 112 | if (grp->nr_vlan_devs == 0) { |
113 | vlan_mvrp_uninit_applicant(real_dev); | ||
111 | vlan_gvrp_uninit_applicant(real_dev); | 114 | vlan_gvrp_uninit_applicant(real_dev); |
115 | } | ||
112 | 116 | ||
113 | /* Get rid of the vlan's reference to real_dev */ | 117 | /* Get rid of the vlan's reference to real_dev */ |
114 | dev_put(real_dev); | 118 | dev_put(real_dev); |
@@ -151,15 +155,18 @@ int register_vlan_dev(struct net_device *dev) | |||
151 | err = vlan_gvrp_init_applicant(real_dev); | 155 | err = vlan_gvrp_init_applicant(real_dev); |
152 | if (err < 0) | 156 | if (err < 0) |
153 | goto out_vid_del; | 157 | goto out_vid_del; |
158 | err = vlan_mvrp_init_applicant(real_dev); | ||
159 | if (err < 0) | ||
160 | goto out_uninit_gvrp; | ||
154 | } | 161 | } |
155 | 162 | ||
156 | err = vlan_group_prealloc_vid(grp, vlan_id); | 163 | err = vlan_group_prealloc_vid(grp, vlan_id); |
157 | if (err < 0) | 164 | if (err < 0) |
158 | goto out_uninit_applicant; | 165 | goto out_uninit_mvrp; |
159 | 166 | ||
160 | err = netdev_upper_dev_link(real_dev, dev); | 167 | err = netdev_upper_dev_link(real_dev, dev); |
161 | if (err) | 168 | if (err) |
162 | goto out_uninit_applicant; | 169 | goto out_uninit_mvrp; |
163 | 170 | ||
164 | err = register_netdevice(dev); | 171 | err = register_netdevice(dev); |
165 | if (err < 0) | 172 | if (err < 0) |
@@ -181,7 +188,10 @@ int register_vlan_dev(struct net_device *dev) | |||
181 | 188 | ||
182 | out_upper_dev_unlink: | 189 | out_upper_dev_unlink: |
183 | netdev_upper_dev_unlink(real_dev, dev); | 190 | netdev_upper_dev_unlink(real_dev, dev); |
184 | out_uninit_applicant: | 191 | out_uninit_mvrp: |
192 | if (grp->nr_vlan_devs == 0) | ||
193 | vlan_mvrp_uninit_applicant(real_dev); | ||
194 | out_uninit_gvrp: | ||
185 | if (grp->nr_vlan_devs == 0) | 195 | if (grp->nr_vlan_devs == 0) |
186 | vlan_gvrp_uninit_applicant(real_dev); | 196 | vlan_gvrp_uninit_applicant(real_dev); |
187 | out_vid_del: | 197 | out_vid_del: |
@@ -655,13 +665,19 @@ static int __init vlan_proto_init(void) | |||
655 | if (err < 0) | 665 | if (err < 0) |
656 | goto err3; | 666 | goto err3; |
657 | 667 | ||
658 | err = vlan_netlink_init(); | 668 | err = vlan_mvrp_init(); |
659 | if (err < 0) | 669 | if (err < 0) |
660 | goto err4; | 670 | goto err4; |
661 | 671 | ||
672 | err = vlan_netlink_init(); | ||
673 | if (err < 0) | ||
674 | goto err5; | ||
675 | |||
662 | vlan_ioctl_set(vlan_ioctl_handler); | 676 | vlan_ioctl_set(vlan_ioctl_handler); |
663 | return 0; | 677 | return 0; |
664 | 678 | ||
679 | err5: | ||
680 | vlan_mvrp_uninit(); | ||
665 | err4: | 681 | err4: |
666 | vlan_gvrp_uninit(); | 682 | vlan_gvrp_uninit(); |
667 | err3: | 683 | err3: |
@@ -682,6 +698,7 @@ static void __exit vlan_cleanup_module(void) | |||
682 | unregister_pernet_subsys(&vlan_net_ops); | 698 | unregister_pernet_subsys(&vlan_net_ops); |
683 | rcu_barrier(); /* Wait for completion of call_rcu()'s */ | 699 | rcu_barrier(); /* Wait for completion of call_rcu()'s */ |
684 | 700 | ||
701 | vlan_mvrp_uninit(); | ||
685 | vlan_gvrp_uninit(); | 702 | vlan_gvrp_uninit(); |
686 | } | 703 | } |
687 | 704 | ||