RE: [PATCH 2/4] Drivers: scsi: storvsc: Force discovery of LUNs that may have been removed.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




> -----Original Message-----
> From: devel [mailto:driverdev-devel-bounces@xxxxxxxxxxxxxxxxxxxxxx] On
> Behalf Of K. Y. Srinivasan
> Sent: Tuesday, December 16, 2014 1:22 PM
> To: gregkh@xxxxxxxxxxxxxxxxxxx; linux-kernel@xxxxxxxxxxxxxxx;
> devel@xxxxxxxxxxxxxxxxxxxxxx; ohering@xxxxxxxx;
> jbottomley@xxxxxxxxxxxxx; hch@xxxxxxxxxxxxx; linux-scsi@xxxxxxxxxxxxxxx
> Subject: [PATCH 2/4] Drivers: scsi: storvsc: Force discovery of LUNs that may
> have been removed.
> 
> The host asks the guest to scan when a LUN is removed or added.
> The only way a guest can identify the removed LUN is when an I/O is
> attempted on a removed LUN - the SRB status code indicates that the LUN is
> invalid. We currently handle this SRB status and remove the device.
> 
> Rather than waiting for an I/O to remove the device, force the discovery of
> LUNs that may have been removed prior to discovering LUNs that may have
> been added.
> 
> Signed-off-by: K. Y. Srinivasan <kys@xxxxxxxxxxxxx>
Reviewed-by: Long Li <longli@xxxxxxxxxxxxx>
> ---
>  drivers/scsi/storvsc_drv.c |   26 ++++++++++++++++++++++++++
>  1 files changed, 26 insertions(+), 0 deletions(-)
> 
> diff --git a/drivers/scsi/storvsc_drv.c b/drivers/scsi/storvsc_drv.c index
> 0a96fef..a7163c6 100644
> --- a/drivers/scsi/storvsc_drv.c
> +++ b/drivers/scsi/storvsc_drv.c
> @@ -430,10 +430,36 @@ static void storvsc_host_scan(struct work_struct
> *work)  {
>  	struct storvsc_scan_work *wrk;
>  	struct Scsi_Host *host;
> +	struct scsi_device *sdev;
> +	unsigned long flags;
> 
>  	wrk = container_of(work, struct storvsc_scan_work, work);
>  	host = wrk->host;
> 
> +	/*
> +	 * Before scanning the host, first check to see if any of the
> +	 * currrently known devices have been hot removed. We issue a
> +	 * "unit ready" command against all currently known devices.
> +	 * This I/O will result in an error for devices that have been
> +	 * removed. As part of handling the I/O error, we remove the device.
> +	 *
> +	 * When a LUN is added or removed, the host sends us a signal to
> +	 * scan the host. Thus we are forced to discover the LUNs that
> +	 * may have been removed this way.
> +	 */
> +	mutex_lock(&host->scan_mutex);
> +	spin_lock_irqsave(host->host_lock, flags);
> +	list_for_each_entry(sdev, &host->__devices, siblings) {
> +		spin_unlock_irqrestore(host->host_lock, flags);
> +		scsi_test_unit_ready(sdev, 1, 1, NULL);
> +		spin_lock_irqsave(host->host_lock, flags);
> +		continue;
> +	}
> +	spin_unlock_irqrestore(host->host_lock, flags);
> +	mutex_unlock(&host->scan_mutex);
> +	/*
> +	 * Now scan the host to discover LUNs that may have been added.
> +	 */
>  	scsi_scan_host(host);
> 
>  	kfree(wrk);
> --
> 1.7.4.1
> 
> _______________________________________________
> devel mailing list
> devel@xxxxxxxxxxxxxxxxxxxxxx
> http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
_______________________________________________
devel mailing list
devel@xxxxxxxxxxxxxxxxxxxxxx
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel



[Index of Archives]     [Linux Driver Backports]     [DMA Engine]     [Linux GPIO]     [Linux SPI]     [Video for Linux]     [Linux USB Devel]     [Linux Coverity]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux