> -----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-scsi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html