@@ -431,17 +431,13 @@ int bond_dev_queue_xmit(struct bonding *bond, struct sk_buff *skb,
431431static int bond_vlan_rx_add_vid (struct net_device * bond_dev , uint16_t vid )
432432{
433433 struct bonding * bond = netdev_priv (bond_dev );
434- struct slave * slave ;
434+ struct slave * slave , * stop_at ;
435435 int i , res ;
436436
437437 bond_for_each_slave (bond , slave , i ) {
438- struct net_device * slave_dev = slave -> dev ;
439- const struct net_device_ops * slave_ops = slave_dev -> netdev_ops ;
440-
441- if ((slave_dev -> features & NETIF_F_HW_VLAN_FILTER ) &&
442- slave_ops -> ndo_vlan_rx_add_vid ) {
443- slave_ops -> ndo_vlan_rx_add_vid (slave_dev , vid );
444- }
438+ res = vlan_vid_add (slave -> dev , vid );
439+ if (res )
440+ goto unwind ;
445441 }
446442
447443 res = bond_add_vlan (bond , vid );
@@ -452,6 +448,14 @@ static int bond_vlan_rx_add_vid(struct net_device *bond_dev, uint16_t vid)
452448 }
453449
454450 return 0 ;
451+
452+ unwind :
453+ /* unwind from head to the slave that failed */
454+ stop_at = slave ;
455+ bond_for_each_slave_from_to (bond , slave , i , bond -> first_slave , stop_at )
456+ vlan_vid_del (slave -> dev , vid );
457+
458+ return res ;
455459}
456460
457461/**
@@ -465,15 +469,8 @@ static int bond_vlan_rx_kill_vid(struct net_device *bond_dev, uint16_t vid)
465469 struct slave * slave ;
466470 int i , res ;
467471
468- bond_for_each_slave (bond , slave , i ) {
469- struct net_device * slave_dev = slave -> dev ;
470- const struct net_device_ops * slave_ops = slave_dev -> netdev_ops ;
471-
472- if ((slave_dev -> features & NETIF_F_HW_VLAN_FILTER ) &&
473- slave_ops -> ndo_vlan_rx_kill_vid ) {
474- slave_ops -> ndo_vlan_rx_kill_vid (slave_dev , vid );
475- }
476- }
472+ bond_for_each_slave (bond , slave , i )
473+ vlan_vid_del (slave -> dev , vid );
477474
478475 res = bond_del_vlan (bond , vid );
479476 if (res ) {
@@ -488,30 +485,26 @@ static int bond_vlan_rx_kill_vid(struct net_device *bond_dev, uint16_t vid)
488485static void bond_add_vlans_on_slave (struct bonding * bond , struct net_device * slave_dev )
489486{
490487 struct vlan_entry * vlan ;
491- const struct net_device_ops * slave_ops = slave_dev -> netdev_ops ;
492-
493- if (!(slave_dev -> features & NETIF_F_HW_VLAN_FILTER ) ||
494- !(slave_ops -> ndo_vlan_rx_add_vid ))
495- return ;
488+ int res ;
496489
497- list_for_each_entry (vlan , & bond -> vlan_list , vlan_list )
498- slave_ops -> ndo_vlan_rx_add_vid (slave_dev , vlan -> vlan_id );
490+ list_for_each_entry (vlan , & bond -> vlan_list , vlan_list ) {
491+ res = vlan_vid_add (slave_dev , vlan -> vlan_id );
492+ if (res )
493+ pr_warning ("%s: Failed to add vlan id %d to device %s\n" ,
494+ bond -> dev -> name , vlan -> vlan_id ,
495+ slave_dev -> name );
496+ }
499497}
500498
501499static void bond_del_vlans_from_slave (struct bonding * bond ,
502500 struct net_device * slave_dev )
503501{
504- const struct net_device_ops * slave_ops = slave_dev -> netdev_ops ;
505502 struct vlan_entry * vlan ;
506503
507- if (!(slave_dev -> features & NETIF_F_HW_VLAN_FILTER ) ||
508- !(slave_ops -> ndo_vlan_rx_kill_vid ))
509- return ;
510-
511504 list_for_each_entry (vlan , & bond -> vlan_list , vlan_list ) {
512505 if (!vlan -> vlan_id )
513506 continue ;
514- slave_ops -> ndo_vlan_rx_kill_vid (slave_dev , vlan -> vlan_id );
507+ vlan_vid_del (slave_dev , vlan -> vlan_id );
515508 }
516509}
517510
0 commit comments