diff options
Diffstat (limited to 'drivers/scsi/fcoe/fcoe_transport.c')
| -rw-r--r-- | drivers/scsi/fcoe/fcoe_transport.c | 56 | 
1 files changed, 28 insertions, 28 deletions
diff --git a/drivers/scsi/fcoe/fcoe_transport.c b/drivers/scsi/fcoe/fcoe_transport.c index 258684101bf..f81f77c8569 100644 --- a/drivers/scsi/fcoe/fcoe_transport.c +++ b/drivers/scsi/fcoe/fcoe_transport.c @@ -335,7 +335,7 @@ out_attach:  EXPORT_SYMBOL(fcoe_transport_attach);  /** - * fcoe_transport_attach - Detaches an FCoE transport + * fcoe_transport_detach - Detaches an FCoE transport   * @ft: The fcoe transport to be attached   *   * Returns : 0 for success @@ -343,6 +343,7 @@ EXPORT_SYMBOL(fcoe_transport_attach);  int fcoe_transport_detach(struct fcoe_transport *ft)  {  	int rc = 0; +	struct fcoe_netdev_mapping *nm = NULL, *tmp;  	mutex_lock(&ft_mutex);  	if (!ft->attached) { @@ -352,6 +353,19 @@ int fcoe_transport_detach(struct fcoe_transport *ft)  		goto out_attach;  	} +	/* remove netdev mapping for this transport as it is going away */ +	mutex_lock(&fn_mutex); +	list_for_each_entry_safe(nm, tmp, &fcoe_netdevs, list) { +		if (nm->ft == ft) { +			LIBFCOE_TRANSPORT_DBG("transport %s going away, " +				"remove its netdev mapping for %s\n", +				ft->name, nm->netdev->name); +			list_del(&nm->list); +			kfree(nm); +		} +	} +	mutex_unlock(&fn_mutex); +  	list_del(&ft->list);  	ft->attached = false;  	LIBFCOE_TRANSPORT_DBG("detaching transport %s\n", ft->name); @@ -371,9 +385,9 @@ static int fcoe_transport_show(char *buffer, const struct kernel_param *kp)  	i = j = sprintf(buffer, "Attached FCoE transports:");  	mutex_lock(&ft_mutex);  	list_for_each_entry(ft, &fcoe_transports, list) { -		i += snprintf(&buffer[i], IFNAMSIZ, "%s ", ft->name); -		if (i >= PAGE_SIZE) +		if (i >= PAGE_SIZE - IFNAMSIZ)  			break; +		i += snprintf(&buffer[i], IFNAMSIZ, "%s ", ft->name);  	}  	mutex_unlock(&ft_mutex);  	if (i == j) @@ -530,9 +544,6 @@ static int fcoe_transport_create(const char *buffer, struct kernel_param *kp)  	struct fcoe_transport *ft = NULL;  	enum fip_state fip_mode = (enum fip_state)(long)kp->arg; -	if (!mutex_trylock(&ft_mutex)) -		return restart_syscall(); -  #ifdef CONFIG_LIBFCOE_MODULE  	/*  	 * Make sure the module has been initialized, and is not about to be @@ -543,6 +554,8 @@ static int fcoe_transport_create(const char *buffer, struct kernel_param *kp)  		goto out_nodev;  #endif +	mutex_lock(&ft_mutex); +  	netdev = fcoe_if_to_netdev(buffer);  	if (!netdev) {  		LIBFCOE_TRANSPORT_DBG("Invalid device %s.\n", buffer); @@ -586,10 +599,7 @@ out_putdev:  	dev_put(netdev);  out_nodev:  	mutex_unlock(&ft_mutex); -	if (rc == -ERESTARTSYS) -		return restart_syscall(); -	else -		return rc; +	return rc;  }  /** @@ -608,9 +618,6 @@ static int fcoe_transport_destroy(const char *buffer, struct kernel_param *kp)  	struct net_device *netdev = NULL;  	struct fcoe_transport *ft = NULL; -	if (!mutex_trylock(&ft_mutex)) -		return restart_syscall(); -  #ifdef CONFIG_LIBFCOE_MODULE  	/*  	 * Make sure the module has been initialized, and is not about to be @@ -621,6 +628,8 @@ static int fcoe_transport_destroy(const char *buffer, struct kernel_param *kp)  		goto out_nodev;  #endif +	mutex_lock(&ft_mutex); +  	netdev = fcoe_if_to_netdev(buffer);  	if (!netdev) {  		LIBFCOE_TRANSPORT_DBG("invalid device %s.\n", buffer); @@ -645,11 +654,7 @@ out_putdev:  	dev_put(netdev);  out_nodev:  	mutex_unlock(&ft_mutex); - -	if (rc == -ERESTARTSYS) -		return restart_syscall(); -	else -		return rc; +	return rc;  }  /** @@ -667,9 +672,6 @@ static int fcoe_transport_disable(const char *buffer, struct kernel_param *kp)  	struct net_device *netdev = NULL;  	struct fcoe_transport *ft = NULL; -	if (!mutex_trylock(&ft_mutex)) -		return restart_syscall(); -  #ifdef CONFIG_LIBFCOE_MODULE  	/*  	 * Make sure the module has been initialized, and is not about to be @@ -680,6 +682,8 @@ static int fcoe_transport_disable(const char *buffer, struct kernel_param *kp)  		goto out_nodev;  #endif +	mutex_lock(&ft_mutex); +  	netdev = fcoe_if_to_netdev(buffer);  	if (!netdev)  		goto out_nodev; @@ -716,9 +720,6 @@ static int fcoe_transport_enable(const char *buffer, struct kernel_param *kp)  	struct net_device *netdev = NULL;  	struct fcoe_transport *ft = NULL; -	if (!mutex_trylock(&ft_mutex)) -		return restart_syscall(); -  #ifdef CONFIG_LIBFCOE_MODULE  	/*  	 * Make sure the module has been initialized, and is not about to be @@ -729,6 +730,8 @@ static int fcoe_transport_enable(const char *buffer, struct kernel_param *kp)  		goto out_nodev;  #endif +	mutex_lock(&ft_mutex); +  	netdev = fcoe_if_to_netdev(buffer);  	if (!netdev)  		goto out_nodev; @@ -743,10 +746,7 @@ out_putdev:  	dev_put(netdev);  out_nodev:  	mutex_unlock(&ft_mutex); -	if (rc == -ERESTARTSYS) -		return restart_syscall(); -	else -		return rc; +	return rc;  }  /**  |