|
@@ -42,6 +42,7 @@
|
|
|
#include <scsi/scsi_devinfo.h>
|
|
|
#include <scsi/scsi_dbg.h>
|
|
|
#include <scsi/scsi_transport_fc.h>
|
|
|
+#include <scsi/scsi_transport.h>
|
|
|
|
|
|
/*
|
|
|
* All wire protocol details (storage protocol between the guest and the host)
|
|
@@ -477,19 +478,18 @@ struct hv_host_device {
|
|
|
struct storvsc_scan_work {
|
|
|
struct work_struct work;
|
|
|
struct Scsi_Host *host;
|
|
|
- uint lun;
|
|
|
+ u8 lun;
|
|
|
+ u8 tgt_id;
|
|
|
};
|
|
|
|
|
|
static void storvsc_device_scan(struct work_struct *work)
|
|
|
{
|
|
|
struct storvsc_scan_work *wrk;
|
|
|
- uint lun;
|
|
|
struct scsi_device *sdev;
|
|
|
|
|
|
wrk = container_of(work, struct storvsc_scan_work, work);
|
|
|
- lun = wrk->lun;
|
|
|
|
|
|
- sdev = scsi_device_lookup(wrk->host, 0, 0, lun);
|
|
|
+ sdev = scsi_device_lookup(wrk->host, 0, wrk->tgt_id, wrk->lun);
|
|
|
if (!sdev)
|
|
|
goto done;
|
|
|
scsi_rescan_device(&sdev->sdev_gendev);
|
|
@@ -540,7 +540,7 @@ static void storvsc_remove_lun(struct work_struct *work)
|
|
|
if (!scsi_host_get(wrk->host))
|
|
|
goto done;
|
|
|
|
|
|
- sdev = scsi_device_lookup(wrk->host, 0, 0, wrk->lun);
|
|
|
+ sdev = scsi_device_lookup(wrk->host, 0, wrk->tgt_id, wrk->lun);
|
|
|
|
|
|
if (sdev) {
|
|
|
scsi_remove_device(sdev);
|
|
@@ -940,6 +940,7 @@ static void storvsc_handle_error(struct vmscsi_request *vm_srb,
|
|
|
|
|
|
wrk->host = host;
|
|
|
wrk->lun = vm_srb->lun;
|
|
|
+ wrk->tgt_id = vm_srb->target_id;
|
|
|
INIT_WORK(&wrk->work, process_err_fn);
|
|
|
schedule_work(&wrk->work);
|
|
|
}
|
|
@@ -1770,6 +1771,11 @@ static int __init storvsc_drv_init(void)
|
|
|
fc_transport_template = fc_attach_transport(&fc_transport_functions);
|
|
|
if (!fc_transport_template)
|
|
|
return -ENODEV;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Install Hyper-V specific timeout handler.
|
|
|
+ */
|
|
|
+ fc_transport_template->eh_timed_out = storvsc_eh_timed_out;
|
|
|
#endif
|
|
|
|
|
|
ret = vmbus_driver_register(&storvsc_drv);
|