aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/bnx2fc/bnx2fc_fcoe.c
diff options
context:
space:
mode:
authorJiri Pirko <jpirko@redhat.com>2011-09-02 23:34:30 -0400
committerDavid S. Miller <davem@davemloft.net>2011-09-15 17:32:26 -0400
commit4bc71cb983fd2844e603bf633df2bb53385182d2 (patch)
tree067b6df32fda6c554b2b9263a94a585c2e5a832d /drivers/scsi/bnx2fc/bnx2fc_fcoe.c
parentc5dac7c9984d8a034eb7ae149cedf23ec9259f98 (diff)
net: consolidate and fix ethtool_ops->get_settings calling
This patch does several things: - introduces __ethtool_get_settings which is called from ethtool code and from drivers as well. Put ASSERT_RTNL there. - dev_ethtool_get_settings() is replaced by __ethtool_get_settings() - changes calling in drivers so rtnl locking is respected. In iboe_get_rate was previously ->get_settings() called unlocked. This fixes it. Also prb_calc_retire_blk_tmo() in af_packet.c had the same problem. Also fixed by calling __dev_get_by_index() instead of dev_get_by_index() and holding rtnl_lock for both calls. - introduces rtnl_lock in bnx2fc_vport_create() and fcoe_vport_create() so bnx2fc_if_create() and fcoe_if_create() are called locked as they are from other places. - use __ethtool_get_settings() in bonding code Signed-off-by: Jiri Pirko <jpirko@redhat.com> v2->v3: -removed dev_ethtool_get_settings() -added ASSERT_RTNL into __ethtool_get_settings() -prb_calc_retire_blk_tmo - use __dev_get_by_index() and lock around it and __ethtool_get_settings() call v1->v2: add missing export_symbol Reviewed-by: Ben Hutchings <bhutchings@solarflare.com> [except FCoE bits] Acked-by: Ralf Baechle <ralf@linux-mips.org> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/scsi/bnx2fc/bnx2fc_fcoe.c')
-rw-r--r--drivers/scsi/bnx2fc/bnx2fc_fcoe.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/drivers/scsi/bnx2fc/bnx2fc_fcoe.c b/drivers/scsi/bnx2fc/bnx2fc_fcoe.c
index 2c780a78fcbd..820a1840c3f7 100644
--- a/drivers/scsi/bnx2fc/bnx2fc_fcoe.c
+++ b/drivers/scsi/bnx2fc/bnx2fc_fcoe.c
@@ -673,7 +673,7 @@ static void bnx2fc_link_speed_update(struct fc_lport *lport)
673 struct net_device *netdev = interface->netdev; 673 struct net_device *netdev = interface->netdev;
674 struct ethtool_cmd ecmd; 674 struct ethtool_cmd ecmd;
675 675
676 if (!dev_ethtool_get_settings(netdev, &ecmd)) { 676 if (!__ethtool_get_settings(netdev, &ecmd)) {
677 lport->link_supported_speeds &= 677 lport->link_supported_speeds &=
678 ~(FC_PORTSPEED_1GBIT | FC_PORTSPEED_10GBIT); 678 ~(FC_PORTSPEED_1GBIT | FC_PORTSPEED_10GBIT);
679 if (ecmd.supported & (SUPPORTED_1000baseT_Half | 679 if (ecmd.supported & (SUPPORTED_1000baseT_Half |
@@ -1001,9 +1001,11 @@ static int bnx2fc_vport_create(struct fc_vport *vport, bool disabled)
1001 "this interface\n"); 1001 "this interface\n");
1002 return -EIO; 1002 return -EIO;
1003 } 1003 }
1004 rtnl_lock();
1004 mutex_lock(&bnx2fc_dev_lock); 1005 mutex_lock(&bnx2fc_dev_lock);
1005 vn_port = bnx2fc_if_create(interface, &vport->dev, 1); 1006 vn_port = bnx2fc_if_create(interface, &vport->dev, 1);
1006 mutex_unlock(&bnx2fc_dev_lock); 1007 mutex_unlock(&bnx2fc_dev_lock);
1008 rtnl_unlock();
1007 1009
1008 if (IS_ERR(vn_port)) { 1010 if (IS_ERR(vn_port)) {
1009 printk(KERN_ERR PFX "bnx2fc_vport_create (%s) failed\n", 1011 printk(KERN_ERR PFX "bnx2fc_vport_create (%s) failed\n",