aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorStephen Cameron <stephenmcameron@gmail.com>2015-01-23 17:43:14 -0500
committerJames Bottomley <JBottomley@Parallels.com>2015-02-02 12:57:40 -0500
commit7acf570ce51a5ebee55ef72e77916afdb4a351a7 (patch)
treebc787b4b0390c5369bc95718165df8b8b8233a17 /drivers
parentf2405db8b4605732c8f0224c33b9d206e37b68c5 (diff)
hpsa: do not request device rescan on every ioaccel path error
The original reasoning behind doing this was faulty. An error of some sort would be encountered, accelerated i/o would be disabled for that logical drive, the command would be kicked back out to the SCSI midlayer for a retry, and since i/o accelerator mode was disabled, it would get retried down the RAID path. However, something needs to turn ioaccellerator mode back on, and this rescan request was what did that. However, it was racy, and extremely bad for performance to rescan all devices, so, don't do that. Reviewed-by: Scott Teel <scott.teel@pmcs.com> Signed-off-by: Don Brace <don.brace@pmcs.com> Signed-off-by: Christoph Hellwig <hch@lst.de>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/scsi/hpsa.c14
-rw-r--r--drivers/scsi/hpsa.h1
2 files changed, 2 insertions, 13 deletions
diff --git a/drivers/scsi/hpsa.c b/drivers/scsi/hpsa.c
index 70f07af6119b..94a82e367bf1 100644
--- a/drivers/scsi/hpsa.c
+++ b/drivers/scsi/hpsa.c
@@ -1637,21 +1637,19 @@ static void process_ioaccel2_completion(struct ctlr_info *h,
1637 c2->error_data.serv_response == 1637 c2->error_data.serv_response ==
1638 IOACCEL2_SERV_RESPONSE_FAILURE) { 1638 IOACCEL2_SERV_RESPONSE_FAILURE) {
1639 dev->offload_enabled = 0; 1639 dev->offload_enabled = 0;
1640 h->drv_req_rescan = 1; /* schedule controller for a rescan */
1641 cmd->result = DID_SOFT_ERROR << 16; 1640 cmd->result = DID_SOFT_ERROR << 16;
1642 cmd_free(h, c); 1641 cmd_free(h, c);
1643 cmd->scsi_done(cmd); 1642 cmd->scsi_done(cmd);
1644 return; 1643 return;
1645 } 1644 }
1646 raid_retry = handle_ioaccel_mode2_error(h, c, cmd, c2); 1645 raid_retry = handle_ioaccel_mode2_error(h, c, cmd, c2);
1647 /* If error found, disable Smart Path, schedule a rescan, 1646 /* If error found, disable Smart Path,
1648 * and force a retry on the standard path. 1647 * force a retry on the standard path.
1649 */ 1648 */
1650 if (raid_retry) { 1649 if (raid_retry) {
1651 dev_warn(&h->pdev->dev, "%s: Retrying on standard path.\n", 1650 dev_warn(&h->pdev->dev, "%s: Retrying on standard path.\n",
1652 "HP SSD Smart Path"); 1651 "HP SSD Smart Path");
1653 dev->offload_enabled = 0; /* Disable Smart Path */ 1652 dev->offload_enabled = 0; /* Disable Smart Path */
1654 h->drv_req_rescan = 1; /* schedule controller rescan */
1655 cmd->result = DID_SOFT_ERROR << 16; 1653 cmd->result = DID_SOFT_ERROR << 16;
1656 } 1654 }
1657 cmd_free(h, c); 1655 cmd_free(h, c);
@@ -6478,9 +6476,6 @@ static void hpsa_ack_ctlr_events(struct ctlr_info *h)
6478 int i; 6476 int i;
6479 char *event_type; 6477 char *event_type;
6480 6478
6481 /* Clear the driver-requested rescan flag */
6482 h->drv_req_rescan = 0;
6483
6484 /* Ask the controller to clear the events we're handling. */ 6479 /* Ask the controller to clear the events we're handling. */
6485 if ((h->transMethod & (CFGTBL_Trans_io_accel1 6480 if ((h->transMethod & (CFGTBL_Trans_io_accel1
6486 | CFGTBL_Trans_io_accel2)) && 6481 | CFGTBL_Trans_io_accel2)) &&
@@ -6526,9 +6521,6 @@ static void hpsa_ack_ctlr_events(struct ctlr_info *h)
6526 */ 6521 */
6527static int hpsa_ctlr_needs_rescan(struct ctlr_info *h) 6522static int hpsa_ctlr_needs_rescan(struct ctlr_info *h)
6528{ 6523{
6529 if (h->drv_req_rescan)
6530 return 1;
6531
6532 if (!(h->fw_support & MISC_FW_EVENT_NOTIFY)) 6524 if (!(h->fw_support & MISC_FW_EVENT_NOTIFY))
6533 return 0; 6525 return 0;
6534 6526
@@ -6574,7 +6566,6 @@ static void hpsa_monitor_ctlr_worker(struct work_struct *work)
6574 6566
6575 if (hpsa_ctlr_needs_rescan(h) || hpsa_offline_devices_ready(h)) { 6567 if (hpsa_ctlr_needs_rescan(h) || hpsa_offline_devices_ready(h)) {
6576 scsi_host_get(h->scsi_host); 6568 scsi_host_get(h->scsi_host);
6577 h->drv_req_rescan = 0;
6578 hpsa_ack_ctlr_events(h); 6569 hpsa_ack_ctlr_events(h);
6579 hpsa_scan_start(h->scsi_host); 6570 hpsa_scan_start(h->scsi_host);
6580 scsi_host_put(h->scsi_host); 6571 scsi_host_put(h->scsi_host);
@@ -6743,7 +6734,6 @@ reinit_after_soft_reset:
6743 /* Enable Accelerated IO path at driver layer */ 6734 /* Enable Accelerated IO path at driver layer */
6744 h->acciopath_status = 1; 6735 h->acciopath_status = 1;
6745 6736
6746 h->drv_req_rescan = 0;
6747 6737
6748 /* Turn the interrupts on so we can service requests */ 6738 /* Turn the interrupts on so we can service requests */
6749 h->access.set_intr_mask(h, HPSA_INTR_ON); 6739 h->access.set_intr_mask(h, HPSA_INTR_ON);
diff --git a/drivers/scsi/hpsa.h b/drivers/scsi/hpsa.h
index e7d7eaa864d1..06a3e812ec38 100644
--- a/drivers/scsi/hpsa.h
+++ b/drivers/scsi/hpsa.h
@@ -235,7 +235,6 @@ struct ctlr_info {
235 spinlock_t offline_device_lock; 235 spinlock_t offline_device_lock;
236 struct list_head offline_device_list; 236 struct list_head offline_device_list;
237 int acciopath_status; 237 int acciopath_status;
238 int drv_req_rescan; /* flag for driver to request rescan event */
239 int raid_offload_debug; 238 int raid_offload_debug;
240}; 239};
241 240