aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/fcoe
diff options
context:
space:
mode:
authorYi Zou <yi.zou@intel.com>2011-04-01 19:06:19 -0400
committerJames Bottomley <James.Bottomley@suse.de>2011-05-01 11:20:42 -0400
commit69922fcd534cfc82e2d44374fa219e7c3b27c492 (patch)
treeac85a2b360a140d32f5c6f4d94c2f6cc5e9d2c07 /drivers/scsi/fcoe
parent9c8cce8e416b3286720379b5efa1c7fa81b2ec36 (diff)
[SCSI] libfcoe: clean up netdev mapping properly when the transport goes away
When rmmoving the underlying fcoe transport driver module by force when it's attached and in use, the correspoding netdev mapping should be cleaned up properly as well, otherwise the lookup for a given netdev for the transport would still return non NULL pointer, causing "unable to handle paging request" bug. Signed-off-by: Yi Zou <yi.zou@intel.com> Tested-by: Ross Brattain <ross.b.brattain@intel.com> Signed-off-by: Robert Love <robert.w.love@intel.com> Signed-off-by: James Bottomley <James.Bottomley@suse.de>
Diffstat (limited to 'drivers/scsi/fcoe')
-rw-r--r--drivers/scsi/fcoe/fcoe_transport.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/drivers/scsi/fcoe/fcoe_transport.c b/drivers/scsi/fcoe/fcoe_transport.c
index 7b61d00f5c43..ec0f395263c5 100644
--- a/drivers/scsi/fcoe/fcoe_transport.c
+++ b/drivers/scsi/fcoe/fcoe_transport.c
@@ -343,6 +343,7 @@ EXPORT_SYMBOL(fcoe_transport_attach);
343int fcoe_transport_detach(struct fcoe_transport *ft) 343int fcoe_transport_detach(struct fcoe_transport *ft)
344{ 344{
345 int rc = 0; 345 int rc = 0;
346 struct fcoe_netdev_mapping *nm = NULL, *tmp;
346 347
347 mutex_lock(&ft_mutex); 348 mutex_lock(&ft_mutex);
348 if (!ft->attached) { 349 if (!ft->attached) {
@@ -352,6 +353,19 @@ int fcoe_transport_detach(struct fcoe_transport *ft)
352 goto out_attach; 353 goto out_attach;
353 } 354 }
354 355
356 /* remove netdev mapping for this transport as it is going away */
357 mutex_lock(&fn_mutex);
358 list_for_each_entry_safe(nm, tmp, &fcoe_netdevs, list) {
359 if (nm->ft == ft) {
360 LIBFCOE_TRANSPORT_DBG("transport %s going away, "
361 "remove its netdev mapping for %s\n",
362 ft->name, nm->netdev->name);
363 list_del(&nm->list);
364 kfree(nm);
365 }
366 }
367 mutex_unlock(&fn_mutex);
368
355 list_del(&ft->list); 369 list_del(&ft->list);
356 ft->attached = false; 370 ft->attached = false;
357 LIBFCOE_TRANSPORT_DBG("detaching transport %s\n", ft->name); 371 LIBFCOE_TRANSPORT_DBG("detaching transport %s\n", ft->name);