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

From: Long Li
Date: Tue Dec 30 2014 - 14:23:00 EST




> -----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
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/