diff options
| author | nagalakshmi.nandigama@lsi.com <nagalakshmi.nandigama@lsi.com> | 2011-12-01 07:43:50 +0530 | 
|---|---|---|
| committer | James Bottomley <JBottomley@Parallels.com> | 2011-12-15 10:57:32 +0400 | 
| commit | 23edb6e71696a5da9c5f3987d22221e12370dbce (patch) | |
| tree | 3197b8876e9d747307dd0ef60a468eca70d7a41d | |
| parent | c1bc0704e52f200bc747c6bddb970a3686e230ab (diff) | |
| download | olio-linux-3.10-23edb6e71696a5da9c5f3987d22221e12370dbce.tar.xz olio-linux-3.10-23edb6e71696a5da9c5f3987d22221e12370dbce.zip  | |
[SCSI] mpt2sas: Do not set sas_device->starget to NULL from the slave_destroy callback when all the LUNS have been deleted
If the sas_device->starget to NULL from slave_destroy callback for LUN=1
even though LUN=0 exist, results in entire target getting deleted.
To resolve the issue, the driver should only set sas_device->starget to
NULL when all the LUNS have been deleted from the slave_destroy.
Signed-off-by: Nagalakshmi Nandigama <nagalakshmi.nandigama@lsi.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
| -rw-r--r-- | drivers/scsi/mpt2sas/mpt2sas_scsih.c | 20 | 
1 files changed, 12 insertions, 8 deletions
diff --git a/drivers/scsi/mpt2sas/mpt2sas_scsih.c b/drivers/scsi/mpt2sas/mpt2sas_scsih.c index 5060634f765..a9efc455108 100644 --- a/drivers/scsi/mpt2sas/mpt2sas_scsih.c +++ b/drivers/scsi/mpt2sas/mpt2sas_scsih.c @@ -612,13 +612,17 @@ _scsih_sas_device_add(struct MPT2SAS_ADAPTER *ioc,  	if (!mpt2sas_transport_port_add(ioc, sas_device->handle,  	     sas_device->sas_address_parent)) {  		_scsih_sas_device_remove(ioc, sas_device); -		} else if (!sas_device->starget) { -			if (!ioc->is_driver_loading) -				mpt2sas_transport_port_remove(ioc, -				sas_device->sas_address, -			    sas_device->sas_address_parent); -			_scsih_sas_device_remove(ioc, sas_device); -		} +	} else if (!sas_device->starget) { +		/* When asyn scanning is enabled, its not possible to remove +		 * devices while scanning is turned on due to an oops in +		 * scsi_sysfs_add_sdev()->add_device()->sysfs_addrm_start() +		 */ +		if (!ioc->is_driver_loading) +			mpt2sas_transport_port_remove(ioc, +			sas_device->sas_address, +			sas_device->sas_address_parent); +		_scsih_sas_device_remove(ioc, sas_device); +	}  }  /** @@ -1449,7 +1453,7 @@ _scsih_slave_destroy(struct scsi_device *sdev)  		spin_lock_irqsave(&ioc->sas_device_lock, flags);  		sas_device = mpt2sas_scsih_sas_device_find_by_sas_address(ioc,  		   sas_target_priv_data->sas_address); -		if (sas_device) +		if (sas_device && !sas_target_priv_data->num_luns)  			sas_device->starget = NULL;  		spin_unlock_irqrestore(&ioc->sas_device_lock, flags);  	}  |