diff options
-rw-r--r-- | drivers/net/bonding/bond_main.c | 57 |
1 files changed, 30 insertions, 27 deletions
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index 81b45740ed77..8a8d5c3de9e3 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c | |||
@@ -3775,41 +3775,44 @@ static struct net_device_stats *bond_get_stats(struct net_device *bond_dev) | |||
3775 | { | 3775 | { |
3776 | struct bonding *bond = bond_dev->priv; | 3776 | struct bonding *bond = bond_dev->priv; |
3777 | struct net_device_stats *stats = &(bond->stats), *sstats; | 3777 | struct net_device_stats *stats = &(bond->stats), *sstats; |
3778 | struct net_device_stats local_stats; | ||
3778 | struct slave *slave; | 3779 | struct slave *slave; |
3779 | int i; | 3780 | int i; |
3780 | 3781 | ||
3781 | memset(stats, 0, sizeof(struct net_device_stats)); | 3782 | memset(&local_stats, 0, sizeof(struct net_device_stats)); |
3782 | 3783 | ||
3783 | read_lock_bh(&bond->lock); | 3784 | read_lock_bh(&bond->lock); |
3784 | 3785 | ||
3785 | bond_for_each_slave(bond, slave, i) { | 3786 | bond_for_each_slave(bond, slave, i) { |
3786 | sstats = slave->dev->get_stats(slave->dev); | 3787 | sstats = slave->dev->get_stats(slave->dev); |
3787 | stats->rx_packets += sstats->rx_packets; | 3788 | local_stats.rx_packets += sstats->rx_packets; |
3788 | stats->rx_bytes += sstats->rx_bytes; | 3789 | local_stats.rx_bytes += sstats->rx_bytes; |
3789 | stats->rx_errors += sstats->rx_errors; | 3790 | local_stats.rx_errors += sstats->rx_errors; |
3790 | stats->rx_dropped += sstats->rx_dropped; | 3791 | local_stats.rx_dropped += sstats->rx_dropped; |
3791 | 3792 | ||
3792 | stats->tx_packets += sstats->tx_packets; | 3793 | local_stats.tx_packets += sstats->tx_packets; |
3793 | stats->tx_bytes += sstats->tx_bytes; | 3794 | local_stats.tx_bytes += sstats->tx_bytes; |
3794 | stats->tx_errors += sstats->tx_errors; | 3795 | local_stats.tx_errors += sstats->tx_errors; |
3795 | stats->tx_dropped += sstats->tx_dropped; | 3796 | local_stats.tx_dropped += sstats->tx_dropped; |
3796 | 3797 | ||
3797 | stats->multicast += sstats->multicast; | 3798 | local_stats.multicast += sstats->multicast; |
3798 | stats->collisions += sstats->collisions; | 3799 | local_stats.collisions += sstats->collisions; |
3799 | 3800 | ||
3800 | stats->rx_length_errors += sstats->rx_length_errors; | 3801 | local_stats.rx_length_errors += sstats->rx_length_errors; |
3801 | stats->rx_over_errors += sstats->rx_over_errors; | 3802 | local_stats.rx_over_errors += sstats->rx_over_errors; |
3802 | stats->rx_crc_errors += sstats->rx_crc_errors; | 3803 | local_stats.rx_crc_errors += sstats->rx_crc_errors; |
3803 | stats->rx_frame_errors += sstats->rx_frame_errors; | 3804 | local_stats.rx_frame_errors += sstats->rx_frame_errors; |
3804 | stats->rx_fifo_errors += sstats->rx_fifo_errors; | 3805 | local_stats.rx_fifo_errors += sstats->rx_fifo_errors; |
3805 | stats->rx_missed_errors += sstats->rx_missed_errors; | 3806 | local_stats.rx_missed_errors += sstats->rx_missed_errors; |
3806 | 3807 | ||
3807 | stats->tx_aborted_errors += sstats->tx_aborted_errors; | 3808 | local_stats.tx_aborted_errors += sstats->tx_aborted_errors; |
3808 | stats->tx_carrier_errors += sstats->tx_carrier_errors; | 3809 | local_stats.tx_carrier_errors += sstats->tx_carrier_errors; |
3809 | stats->tx_fifo_errors += sstats->tx_fifo_errors; | 3810 | local_stats.tx_fifo_errors += sstats->tx_fifo_errors; |
3810 | stats->tx_heartbeat_errors += sstats->tx_heartbeat_errors; | 3811 | local_stats.tx_heartbeat_errors += sstats->tx_heartbeat_errors; |
3811 | stats->tx_window_errors += sstats->tx_window_errors; | 3812 | local_stats.tx_window_errors += sstats->tx_window_errors; |
3812 | } | 3813 | } |
3814 | |||
3815 | memcpy(stats, &local_stats, sizeof(struct net_device_stats)); | ||
3813 | 3816 | ||
3814 | read_unlock_bh(&bond->lock); | 3817 | read_unlock_bh(&bond->lock); |
3815 | 3818 | ||