···11271127 // INFO_RECEIVED_LOOPBACK_FRAMES11281128 pr_err("%s: An illegal loopback occurred on adapter (%s).\n"11291129 "Check the configuration to verify that all adapters are connected to 802.3ad compliant switch ports\n",11301130- port->slave->dev->master->name, port->slave->dev->name);11301130+ port->slave->bond->dev->name, port->slave->dev->name);11311131 return;11321132 }11331133 __update_selected(lacpdu, port);···13061306 }13071307 if (!curr_port) { // meaning: the port was related to an aggregator but was not on the aggregator port list13081308 pr_warning("%s: Warning: Port %d (on %s) was related to aggregator %d but was not on its port list\n",13091309- port->slave->dev->master->name,13091309+ port->slave->bond->dev->name,13101310 port->actor_port_number,13111311 port->slave->dev->name,13121312 port->aggregator->aggregator_identifier);···13861386 port->aggregator->aggregator_identifier);13871387 } else {13881388 pr_err("%s: Port %d (on %s) did not find a suitable aggregator\n",13891389- port->slave->dev->master->name,13891389+ port->slave->bond->dev->name,13901390 port->actor_port_number, port->slave->dev->name);13911391 }13921392 }···1463146314641464 default:14651465 pr_warning("%s: Impossible agg select mode %d\n",14661466- curr->slave->dev->master->name,14661466+ curr->slave->bond->dev->name,14671467 __get_agg_selection_mode(curr->lag_ports));14681468 break;14691469 }···15711571 // check if any partner replys15721572 if (best->is_individual) {15731573 pr_warning("%s: Warning: No 802.3ad response from the link partner for any adapters in the bond\n",15741574- best->slave ? best->slave->dev->master->name : "NULL");15741574+ best->slave ? best->slave->bond->dev->name : "NULL");15751575 }1576157615771577 best->is_active = 1;···1898189818991899 if (bond == NULL) {19001900 pr_err("%s: The slave %s is not attached to its bond\n",19011901- slave->dev->master->name, slave->dev->name);19011901+ slave->bond->dev->name, slave->dev->name);19021902 return -1;19031903 }19041904···19731973 // if slave is null, the whole port is not initialized19741974 if (!port->slave) {19751975 pr_warning("Warning: %s: Trying to unbind an uninitialized port on %s\n",19761976- slave->dev->master->name, slave->dev->name);19761976+ slave->bond->dev->name, slave->dev->name);19771977 return;19781978 }19791979···2009200920102010 if ((new_aggregator->lag_ports == port) && new_aggregator->is_active) {20112011 pr_info("%s: Removing an active aggregator\n",20122012- aggregator->slave->dev->master->name);20122012+ aggregator->slave->bond->dev->name);20132013 // select new active aggregator20142014 select_new_active_agg = 1;20152015 }···20402040 ad_agg_selection_logic(__get_first_agg(port));20412041 } else {20422042 pr_warning("%s: Warning: unbinding aggregator, and could not find a new aggregator for its ports\n",20432043- slave->dev->master->name);20432043+ slave->bond->dev->name);20442044 }20452045 } else { // in case that the only port related to this aggregator is the one we want to remove20462046 select_new_active_agg = aggregator->is_active;···20482048 ad_clear_agg(aggregator);20492049 if (select_new_active_agg) {20502050 pr_info("%s: Removing an active aggregator\n",20512051- slave->dev->master->name);20512051+ slave->bond->dev->name);20522052 // select new active aggregator20532053 ad_agg_selection_logic(__get_first_agg(port));20542054 }···20762076 ad_clear_agg(temp_aggregator);20772077 if (select_new_active_agg) {20782078 pr_info("%s: Removing an active aggregator\n",20792079- slave->dev->master->name);20792079+ slave->bond->dev->name);20802080 // select new active aggregator20812081 ad_agg_selection_logic(__get_first_agg(port));20822082 }···2184218421852185 if (!port->slave) {21862186 pr_warning("%s: Warning: port of slave %s is uninitialized\n",21872187- slave->dev->name, slave->dev->master->name);21872187+ slave->dev->name, slave->bond->dev->name);21882188 return ret;21892189 }21902190···22402240 // if slave is null, the whole port is not initialized22412241 if (!port->slave) {22422242 pr_warning("Warning: %s: speed changed for uninitialized port on %s\n",22432243- slave->dev->master->name, slave->dev->name);22432243+ slave->bond->dev->name, slave->dev->name);22442244 return;22452245 }22462246···22682268 // if slave is null, the whole port is not initialized22692269 if (!port->slave) {22702270 pr_warning("%s: Warning: duplex changed for uninitialized port on %s\n",22712271- slave->dev->master->name, slave->dev->name);22712271+ slave->bond->dev->name, slave->dev->name);22722272 return;22732273 }22742274···22972297 // if slave is null, the whole port is not initialized22982298 if (!port->slave) {22992299 pr_warning("Warning: %s: link status changed for uninitialized port on %s\n",23002300- slave->dev->master->name, slave->dev->name);23002300+ slave->bond->dev->name, slave->dev->name);23012301 return;23022302 }23032303
+3-3
drivers/net/bonding/bond_alb.c
···507507 client_info->mac_dst);508508 if (!skb) {509509 pr_err("%s: Error: failed to create an ARP packet\n",510510- client_info->slave->dev->master->name);510510+ client_info->slave->bond->dev->name);511511 continue;512512 }513513···517517 skb = vlan_put_tag(skb, client_info->vlan_id);518518 if (!skb) {519519 pr_err("%s: Error: failed to insert VLAN tag\n",520520- client_info->slave->dev->master->name);520520+ client_info->slave->bond->dev->name);521521 continue;522522 }523523 }···10431043 if (dev_set_mac_address(dev, &s_addr)) {10441044 pr_err("%s: Error: dev_set_mac_address of dev %s failed!\n"10451045 "ALB mode requires that the base driver support setting the hw address also when the network device's interface is open\n",10461046- dev->master->name, dev->name);10461046+ slave->bond->dev->name, dev->name);10471047 return -EOPNOTSUPP;10481048 }10491049 return 0;
+55-39
drivers/net/bonding/bond_main.c
···746746{747747 struct in_device *in_dev;748748749749- rcu_read_lock();750749 in_dev = __in_dev_get_rcu(dev);751750 if (in_dev)752751 ip_mc_rejoin_groups(in_dev);753753- rcu_read_unlock();754752}755753756754/*···758760 */759761static void bond_resend_igmp_join_requests(struct bonding *bond)760762{761761- struct net_device *bond_dev, *vlan_dev, *master_dev;763763+ struct net_device *bond_dev, *vlan_dev, *upper_dev;762764 struct vlan_entry *vlan;763765766766+ rcu_read_lock();764767 read_lock(&bond->lock);765768766769 bond_dev = bond->dev;···773774 * if bond is enslaved to a bridge,774775 * then rejoin all groups on its master775776 */776776- master_dev = bond_dev->master;777777- if (master_dev)778778- if ((master_dev->priv_flags & IFF_EBRIDGE)779779- && (bond_dev->priv_flags & IFF_BRIDGE_PORT))780780- __bond_resend_igmp_join_requests(master_dev);777777+ upper_dev = netdev_master_upper_dev_get_rcu(bond_dev);778778+ if (upper_dev && upper_dev->priv_flags & IFF_EBRIDGE)779779+ __bond_resend_igmp_join_requests(upper_dev);781780782781 /* rejoin all groups on vlan devices */783782 list_for_each_entry(vlan, &bond->vlan_list, vlan_list) {784784- rcu_read_lock();785783 vlan_dev = __vlan_find_dev_deep(bond_dev,786784 vlan->vlan_id);787787- rcu_read_unlock();788785 if (vlan_dev)789786 __bond_resend_igmp_join_requests(vlan_dev);790787 }···789794 queue_delayed_work(bond->wq, &bond->mcast_work, HZ/5);790795791796 read_unlock(&bond->lock);797797+ rcu_read_unlock();792798}793799794800static void bond_resend_igmp_join_requests_delayed(struct work_struct *work)795801{796802 struct bonding *bond = container_of(work, struct bonding,797803 mcast_work.work);804804+ rcu_read_lock();798805 bond_resend_igmp_join_requests(bond);806806+ rcu_read_unlock();799807}800808801809/*···14911493 return ret;14921494}1493149514961496+static int bond_master_upper_dev_link(struct net_device *bond_dev,14971497+ struct net_device *slave_dev)14981498+{14991499+ int err;15001500+15011501+ err = netdev_master_upper_dev_link(slave_dev, bond_dev);15021502+ if (err)15031503+ return err;15041504+ slave_dev->flags |= IFF_SLAVE;15051505+ rtmsg_ifinfo(RTM_NEWLINK, slave_dev, IFF_SLAVE);15061506+ return 0;15071507+}15081508+15091509+static void bond_upper_dev_unlink(struct net_device *bond_dev,15101510+ struct net_device *slave_dev)15111511+{15121512+ netdev_upper_dev_unlink(slave_dev, bond_dev);15131513+ slave_dev->flags &= ~IFF_SLAVE;15141514+ rtmsg_ifinfo(RTM_NEWLINK, slave_dev, IFF_SLAVE);15151515+}15161516+14941517/* enslave device <slave> to bond device <master> */14951518int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev)14961519{···16741655 }16751656 }1676165716771677- res = netdev_set_bond_master(slave_dev, bond_dev);16581658+ res = bond_master_upper_dev_link(bond_dev, slave_dev);16781659 if (res) {16791679- pr_debug("Error %d calling netdev_set_bond_master\n", res);16601660+ pr_debug("Error %d calling bond_master_upper_dev_link\n", res);16801661 goto err_restore_mac;16811662 }16821663···19101891 dev_close(slave_dev);1911189219121893err_unset_master:19131913- netdev_set_bond_master(slave_dev, NULL);18941894+ bond_upper_dev_unlink(bond_dev, slave_dev);1914189519151896err_restore_mac:19161897 if (!bond->params.fail_over_mac) {···1955193619561937 /* slave is not a slave or master is not master of this slave */19571938 if (!(slave_dev->flags & IFF_SLAVE) ||19581958- (slave_dev->master != bond_dev)) {19391939+ !netdev_has_upper_dev(slave_dev, bond_dev)) {19591940 pr_err("%s: Error: cannot release %s.\n",19601941 bond_dev->name, slave_dev->name);19611942 return -EINVAL;···20992080 netif_addr_unlock_bh(bond_dev);21002081 }2101208221022102- netdev_set_bond_master(slave_dev, NULL);20832083+ bond_upper_dev_unlink(bond_dev, slave_dev);2103208421042085 slave_disable_netpoll(slave);21052086···22142195 netif_addr_unlock_bh(bond_dev);22152196 }2216219722172217- netdev_set_bond_master(slave_dev, NULL);21982198+ bond_upper_dev_unlink(bond_dev, slave_dev);2218219922192200 slave_disable_netpoll(slave);22202201···22782259 if (!USES_PRIMARY(bond->params.mode))22792260 return -EINVAL;2280226122812281- /* Verify that master_dev is indeed the master of slave_dev */22822282- if (!(slave_dev->flags & IFF_SLAVE) || (slave_dev->master != bond_dev))22622262+ /* Verify that bond_dev is indeed the master of slave_dev */22632263+ if (!(slave_dev->flags & IFF_SLAVE) ||22642264+ !netdev_has_upper_dev(slave_dev, bond_dev))22832265 return -EINVAL;2284226622852267 read_lock(&bond->lock);···32783258static int bond_slave_netdev_event(unsigned long event,32793259 struct net_device *slave_dev)32803260{32813281- struct net_device *bond_dev = slave_dev->master;32823282- struct bonding *bond = netdev_priv(bond_dev);32833283- struct slave *slave = NULL;32613261+ struct slave *slave = bond_slave_get_rtnl(slave_dev);32623262+ struct bonding *bond = slave->bond;32633263+ struct net_device *bond_dev = slave->bond->dev;32643264+ u32 old_speed;32653265+ u8 old_duplex;3284326632853267 switch (event) {32863268 case NETDEV_UNREGISTER:32873287- if (bond_dev) {32883288- if (bond->setup_by_slave)32893289- bond_release_and_destroy(bond_dev, slave_dev);32903290- else32913291- bond_release(bond_dev, slave_dev);32923292- }32693269+ if (bond->setup_by_slave)32703270+ bond_release_and_destroy(bond_dev, slave_dev);32713271+ else32723272+ bond_release(bond_dev, slave_dev);32933273 break;32943274 case NETDEV_UP:32953275 case NETDEV_CHANGE:32963296- slave = bond_get_slave_by_dev(bond, slave_dev);32973297- if (slave) {32983298- u32 old_speed = slave->speed;32993299- u8 old_duplex = slave->duplex;32763276+ old_speed = slave->speed;32773277+ old_duplex = slave->duplex;3300327833013301- bond_update_speed_duplex(slave);32793279+ bond_update_speed_duplex(slave);3302328033033303- if (bond->params.mode == BOND_MODE_8023AD) {33043304- if (old_speed != slave->speed)33053305- bond_3ad_adapter_speed_changed(slave);33063306- if (old_duplex != slave->duplex)33073307- bond_3ad_adapter_duplex_changed(slave);33083308- }32813281+ if (bond->params.mode == BOND_MODE_8023AD) {32823282+ if (old_speed != slave->speed)32833283+ bond_3ad_adapter_speed_changed(slave);32843284+ if (old_duplex != slave->duplex)32853285+ bond_3ad_adapter_duplex_changed(slave);33093286 }33103310-33113287 break;33123288 case NETDEV_DOWN:33133289 /*
+7-7
drivers/net/bonding/bonding.h
···258258#define bond_slave_get_rcu(dev) \259259 ((struct slave *) rcu_dereference(dev->rx_handler_data))260260261261+#define bond_slave_get_rtnl(dev) \262262+ ((struct slave *) rtnl_dereference(dev->rx_handler_data))263263+261264/**262265 * Returns NULL if the net_device does not belong to any of the bond's slaves263266 *···283280284281static inline struct bonding *bond_get_bond_by_slave(struct slave *slave)285282{286286- if (!slave || !slave->dev->master) {283283+ if (!slave || !slave->bond)287284 return NULL;288288- }289289-290290- return netdev_priv(slave->dev->master);285285+ return slave->bond;291286}292287293288static inline bool bond_is_lb(const struct bonding *bond)···361360362361static inline void bond_set_slave_inactive_flags(struct slave *slave)363362{364364- struct bonding *bond = netdev_priv(slave->dev->master);365365- if (!bond_is_lb(bond))363363+ if (!bond_is_lb(slave->bond))366364 bond_set_backup_slave(slave);367367- if (!bond->params.all_slaves_active)365365+ if (!slave->bond->params.all_slaves_active)368366 slave->inactive = 1;369367}370368
+1
net/core/rtnetlink.c
···19871987 if (err < 0)19881988 rtnl_set_sk_err(net, RTNLGRP_LINK, err);19891989}19901990+EXPORT_SYMBOL(rtmsg_ifinfo);1990199119911992static int nlmsg_populate_fdb_fill(struct sk_buff *skb,19921993 struct net_device *dev,