diff options
-rw-r--r-- | drivers/scsi/fcoe/fcoe.c | 37 |
1 files changed, 11 insertions, 26 deletions
diff --git a/drivers/scsi/fcoe/fcoe.c b/drivers/scsi/fcoe/fcoe.c index c0264a984394..ac481ad112ad 100644 --- a/drivers/scsi/fcoe/fcoe.c +++ b/drivers/scsi/fcoe/fcoe.c | |||
@@ -58,8 +58,8 @@ MODULE_PARM_DESC(ddp_min, "Minimum I/O size in bytes for " \ | |||
58 | DEFINE_MUTEX(fcoe_config_mutex); | 58 | DEFINE_MUTEX(fcoe_config_mutex); |
59 | 59 | ||
60 | /* fcoe host list */ | 60 | /* fcoe host list */ |
61 | /* must only by accessed under the RTNL mutex */ | ||
61 | LIST_HEAD(fcoe_hostlist); | 62 | LIST_HEAD(fcoe_hostlist); |
62 | DEFINE_RWLOCK(fcoe_hostlist_lock); | ||
63 | DEFINE_PER_CPU(struct fcoe_percpu_s, fcoe_percpu); | 63 | DEFINE_PER_CPU(struct fcoe_percpu_s, fcoe_percpu); |
64 | 64 | ||
65 | /* Function Prototypes */ | 65 | /* Function Prototypes */ |
@@ -527,8 +527,6 @@ bool fcoe_oem_match(struct fc_frame *fp) | |||
527 | * fcoe_em_config() - allocates em for this lport | 527 | * fcoe_em_config() - allocates em for this lport |
528 | * @lp: the fcoe that em is to allocated for | 528 | * @lp: the fcoe that em is to allocated for |
529 | * | 529 | * |
530 | * Called with write fcoe_hostlist_lock held. | ||
531 | * | ||
532 | * Returns : 0 on success | 530 | * Returns : 0 on success |
533 | */ | 531 | */ |
534 | static inline int fcoe_em_config(struct fc_lport *lp) | 532 | static inline int fcoe_em_config(struct fc_lport *lp) |
@@ -1539,7 +1537,6 @@ static int fcoe_device_notification(struct notifier_block *notifier, | |||
1539 | u32 mfs; | 1537 | u32 mfs; |
1540 | int rc = NOTIFY_OK; | 1538 | int rc = NOTIFY_OK; |
1541 | 1539 | ||
1542 | write_lock(&fcoe_hostlist_lock); | ||
1543 | list_for_each_entry(fcoe, &fcoe_hostlist, list) { | 1540 | list_for_each_entry(fcoe, &fcoe_hostlist, list) { |
1544 | if (fcoe->netdev == netdev) { | 1541 | if (fcoe->netdev == netdev) { |
1545 | lp = fcoe->ctlr.lp; | 1542 | lp = fcoe->ctlr.lp; |
@@ -1586,7 +1583,6 @@ static int fcoe_device_notification(struct notifier_block *notifier, | |||
1586 | fcoe_clean_pending_queue(lp); | 1583 | fcoe_clean_pending_queue(lp); |
1587 | } | 1584 | } |
1588 | out: | 1585 | out: |
1589 | write_unlock(&fcoe_hostlist_lock); | ||
1590 | return rc; | 1586 | return rc; |
1591 | } | 1587 | } |
1592 | 1588 | ||
@@ -1643,16 +1639,14 @@ static int fcoe_destroy(const char *buffer, struct kernel_param *kp) | |||
1643 | goto out_nodev; | 1639 | goto out_nodev; |
1644 | } | 1640 | } |
1645 | 1641 | ||
1646 | write_lock(&fcoe_hostlist_lock); | 1642 | rtnl_lock(); |
1647 | fcoe = fcoe_hostlist_lookup_port(netdev); | 1643 | fcoe = fcoe_hostlist_lookup_port(netdev); |
1648 | if (!fcoe) { | 1644 | if (!fcoe) { |
1649 | write_unlock(&fcoe_hostlist_lock); | 1645 | rtnl_unlock(); |
1650 | rc = -ENODEV; | 1646 | rc = -ENODEV; |
1651 | goto out_putdev; | 1647 | goto out_putdev; |
1652 | } | 1648 | } |
1653 | list_del(&fcoe->list); | 1649 | list_del(&fcoe->list); |
1654 | write_unlock(&fcoe_hostlist_lock); | ||
1655 | rtnl_lock(); | ||
1656 | fcoe_interface_cleanup(fcoe); | 1650 | fcoe_interface_cleanup(fcoe); |
1657 | rtnl_unlock(); | 1651 | rtnl_unlock(); |
1658 | fcoe_if_destroy(fcoe->ctlr.lp); | 1652 | fcoe_if_destroy(fcoe->ctlr.lp); |
@@ -1870,9 +1864,8 @@ int fcoe_reset(struct Scsi_Host *shost) | |||
1870 | * fcoe_hostlist_lookup_port() - find the corresponding lport by a given device | 1864 | * fcoe_hostlist_lookup_port() - find the corresponding lport by a given device |
1871 | * @dev: this is currently ptr to net_device | 1865 | * @dev: this is currently ptr to net_device |
1872 | * | 1866 | * |
1873 | * Called with fcoe_hostlist_lock held. | ||
1874 | * | ||
1875 | * Returns: NULL or the located fcoe_port | 1867 | * Returns: NULL or the located fcoe_port |
1868 | * Locking: must be called with the RNL mutex held | ||
1876 | */ | 1869 | */ |
1877 | static struct fcoe_interface * | 1870 | static struct fcoe_interface * |
1878 | fcoe_hostlist_lookup_port(const struct net_device *dev) | 1871 | fcoe_hostlist_lookup_port(const struct net_device *dev) |
@@ -1891,15 +1884,13 @@ fcoe_hostlist_lookup_port(const struct net_device *dev) | |||
1891 | * @netdev: ptr to net_device | 1884 | * @netdev: ptr to net_device |
1892 | * | 1885 | * |
1893 | * Returns: 0 for success | 1886 | * Returns: 0 for success |
1887 | * Locking: must be called with the RTNL mutex held | ||
1894 | */ | 1888 | */ |
1895 | struct fc_lport *fcoe_hostlist_lookup(const struct net_device *netdev) | 1889 | static struct fc_lport *fcoe_hostlist_lookup(const struct net_device *netdev) |
1896 | { | 1890 | { |
1897 | struct fcoe_interface *fcoe; | 1891 | struct fcoe_interface *fcoe; |
1898 | 1892 | ||
1899 | read_lock(&fcoe_hostlist_lock); | ||
1900 | fcoe = fcoe_hostlist_lookup_port(netdev); | 1893 | fcoe = fcoe_hostlist_lookup_port(netdev); |
1901 | read_unlock(&fcoe_hostlist_lock); | ||
1902 | |||
1903 | return (fcoe) ? fcoe->ctlr.lp : NULL; | 1894 | return (fcoe) ? fcoe->ctlr.lp : NULL; |
1904 | } | 1895 | } |
1905 | 1896 | ||
@@ -1908,20 +1899,19 @@ struct fc_lport *fcoe_hostlist_lookup(const struct net_device *netdev) | |||
1908 | * @lp: ptr to the fc_lport to be added | 1899 | * @lp: ptr to the fc_lport to be added |
1909 | * | 1900 | * |
1910 | * Returns: 0 for success | 1901 | * Returns: 0 for success |
1902 | * Locking: must be called with the RTNL mutex held | ||
1911 | */ | 1903 | */ |
1912 | int fcoe_hostlist_add(const struct fc_lport *lport) | 1904 | static int fcoe_hostlist_add(const struct fc_lport *lport) |
1913 | { | 1905 | { |
1914 | struct fcoe_interface *fcoe; | 1906 | struct fcoe_interface *fcoe; |
1915 | struct fcoe_port *port; | 1907 | struct fcoe_port *port; |
1916 | 1908 | ||
1917 | write_lock_bh(&fcoe_hostlist_lock); | ||
1918 | fcoe = fcoe_hostlist_lookup_port(fcoe_netdev(lport)); | 1909 | fcoe = fcoe_hostlist_lookup_port(fcoe_netdev(lport)); |
1919 | if (!fcoe) { | 1910 | if (!fcoe) { |
1920 | port = lport_priv(lport); | 1911 | port = lport_priv(lport); |
1921 | fcoe = port->fcoe; | 1912 | fcoe = port->fcoe; |
1922 | list_add_tail(&fcoe->list, &fcoe_hostlist); | 1913 | list_add_tail(&fcoe->list, &fcoe_hostlist); |
1923 | } | 1914 | } |
1924 | write_unlock_bh(&fcoe_hostlist_lock); | ||
1925 | return 0; | 1915 | return 0; |
1926 | } | 1916 | } |
1927 | 1917 | ||
@@ -1979,7 +1969,6 @@ static void __exit fcoe_exit(void) | |||
1979 | { | 1969 | { |
1980 | unsigned int cpu; | 1970 | unsigned int cpu; |
1981 | struct fcoe_interface *fcoe, *tmp; | 1971 | struct fcoe_interface *fcoe, *tmp; |
1982 | LIST_HEAD(local_list); | ||
1983 | struct fcoe_port *port; | 1972 | struct fcoe_port *port; |
1984 | 1973 | ||
1985 | mutex_lock(&fcoe_config_mutex); | 1974 | mutex_lock(&fcoe_config_mutex); |
@@ -1987,18 +1976,14 @@ static void __exit fcoe_exit(void) | |||
1987 | fcoe_dev_cleanup(); | 1976 | fcoe_dev_cleanup(); |
1988 | 1977 | ||
1989 | /* releases the associated fcoe hosts */ | 1978 | /* releases the associated fcoe hosts */ |
1990 | write_lock_bh(&fcoe_hostlist_lock); | 1979 | rtnl_lock(); |
1991 | list_splice_init(&fcoe_hostlist, &local_list); | 1980 | list_for_each_entry_safe(fcoe, tmp, &fcoe_hostlist, list) { |
1992 | write_unlock_bh(&fcoe_hostlist_lock); | ||
1993 | |||
1994 | list_for_each_entry_safe(fcoe, tmp, &local_list, list) { | ||
1995 | list_del(&fcoe->list); | 1981 | list_del(&fcoe->list); |
1996 | port = lport_priv(fcoe->ctlr.lp); | 1982 | port = lport_priv(fcoe->ctlr.lp); |
1997 | rtnl_lock(); | ||
1998 | fcoe_interface_cleanup(fcoe); | 1983 | fcoe_interface_cleanup(fcoe); |
1999 | rtnl_unlock(); | ||
2000 | schedule_work(&port->destroy_work); | 1984 | schedule_work(&port->destroy_work); |
2001 | } | 1985 | } |
1986 | rtnl_unlock(); | ||
2002 | 1987 | ||
2003 | unregister_hotcpu_notifier(&fcoe_cpu_notifier); | 1988 | unregister_hotcpu_notifier(&fcoe_cpu_notifier); |
2004 | 1989 | ||