aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorK. Y. Srinivasan <kys@microsoft.com>2016-01-27 21:22:45 -0500
committerMartin K. Petersen <martin.petersen@oracle.com>2016-01-28 22:25:48 -0500
commit98441221708a092eb6d3d05142cf842a95aba152 (patch)
tree617306a30b925348806b31fcec96bd7d1b6a213a
parentd791a8c60e9cbd1c4fecbc5c86ff59c7ffe137e8 (diff)
storvsc: Use the specified target ID in device lookup
The current code assumes that there is only one target in device lookup. Fix this bug. This will alow us to correctly handle hot reomoval of LUNs. Signed-off-by: K. Y. Srinivasan <kys@microsoft.com> Reviewed-by: Alex Ng <alexng@microsoft.com> Tested-by: Vivek Yadav <vyadav@microsoft.com> Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
-rw-r--r--drivers/scsi/storvsc_drv.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/drivers/scsi/storvsc_drv.c b/drivers/scsi/storvsc_drv.c
index 622f64a98a9e..132b16861954 100644
--- a/drivers/scsi/storvsc_drv.c
+++ b/drivers/scsi/storvsc_drv.c
@@ -478,19 +478,18 @@ struct hv_host_device {
478struct storvsc_scan_work { 478struct storvsc_scan_work {
479 struct work_struct work; 479 struct work_struct work;
480 struct Scsi_Host *host; 480 struct Scsi_Host *host;
481 uint lun; 481 u8 lun;
482 u8 tgt_id;
482}; 483};
483 484
484static void storvsc_device_scan(struct work_struct *work) 485static void storvsc_device_scan(struct work_struct *work)
485{ 486{
486 struct storvsc_scan_work *wrk; 487 struct storvsc_scan_work *wrk;
487 uint lun;
488 struct scsi_device *sdev; 488 struct scsi_device *sdev;
489 489
490 wrk = container_of(work, struct storvsc_scan_work, work); 490 wrk = container_of(work, struct storvsc_scan_work, work);
491 lun = wrk->lun;
492 491
493 sdev = scsi_device_lookup(wrk->host, 0, 0, lun); 492 sdev = scsi_device_lookup(wrk->host, 0, wrk->tgt_id, wrk->lun);
494 if (!sdev) 493 if (!sdev)
495 goto done; 494 goto done;
496 scsi_rescan_device(&sdev->sdev_gendev); 495 scsi_rescan_device(&sdev->sdev_gendev);
@@ -541,7 +540,7 @@ static void storvsc_remove_lun(struct work_struct *work)
541 if (!scsi_host_get(wrk->host)) 540 if (!scsi_host_get(wrk->host))
542 goto done; 541 goto done;
543 542
544 sdev = scsi_device_lookup(wrk->host, 0, 0, wrk->lun); 543 sdev = scsi_device_lookup(wrk->host, 0, wrk->tgt_id, wrk->lun);
545 544
546 if (sdev) { 545 if (sdev) {
547 scsi_remove_device(sdev); 546 scsi_remove_device(sdev);
@@ -941,6 +940,7 @@ static void storvsc_handle_error(struct vmscsi_request *vm_srb,
941 940
942 wrk->host = host; 941 wrk->host = host;
943 wrk->lun = vm_srb->lun; 942 wrk->lun = vm_srb->lun;
943 wrk->tgt_id = vm_srb->target_id;
944 INIT_WORK(&wrk->work, process_err_fn); 944 INIT_WORK(&wrk->work, process_err_fn);
945 schedule_work(&wrk->work); 945 schedule_work(&wrk->work);
946} 946}