aboutsummaryrefslogtreecommitdiffstats
path: root/net/8021q/vlan.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/8021q/vlan.c')
-rw-r--r--net/8021q/vlan.c27
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
182out_upper_dev_unlink: 189out_upper_dev_unlink:
183 netdev_upper_dev_unlink(real_dev, dev); 190 netdev_upper_dev_unlink(real_dev, dev);
184out_uninit_applicant: 191out_uninit_mvrp:
192 if (grp->nr_vlan_devs == 0)
193 vlan_mvrp_uninit_applicant(real_dev);
194out_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);
187out_vid_del: 197out_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
679err5:
680 vlan_mvrp_uninit();
665err4: 681err4:
666 vlan_gvrp_uninit(); 682 vlan_gvrp_uninit();
667err3: 683err3:
@@ -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