Commit 7acf570c authored by Stephen Cameron's avatar Stephen Cameron Committed by James Bottomley

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: default avatarScott Teel <scott.teel@pmcs.com>
Signed-off-by: default avatarDon Brace <don.brace@pmcs.com>
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
parent f2405db8
...@@ -1637,21 +1637,19 @@ static void process_ioaccel2_completion(struct ctlr_info *h, ...@@ -1637,21 +1637,19 @@ static void process_ioaccel2_completion(struct ctlr_info *h,
c2->error_data.serv_response == c2->error_data.serv_response ==
IOACCEL2_SERV_RESPONSE_FAILURE) { IOACCEL2_SERV_RESPONSE_FAILURE) {
dev->offload_enabled = 0; dev->offload_enabled = 0;
h->drv_req_rescan = 1; /* schedule controller for a rescan */
cmd->result = DID_SOFT_ERROR << 16; cmd->result = DID_SOFT_ERROR << 16;
cmd_free(h, c); cmd_free(h, c);
cmd->scsi_done(cmd); cmd->scsi_done(cmd);
return; return;
} }
raid_retry = handle_ioaccel_mode2_error(h, c, cmd, c2); raid_retry = handle_ioaccel_mode2_error(h, c, cmd, c2);
/* If error found, disable Smart Path, schedule a rescan, /* If error found, disable Smart Path,
* and force a retry on the standard path. * force a retry on the standard path.
*/ */
if (raid_retry) { if (raid_retry) {
dev_warn(&h->pdev->dev, "%s: Retrying on standard path.\n", dev_warn(&h->pdev->dev, "%s: Retrying on standard path.\n",
"HP SSD Smart Path"); "HP SSD Smart Path");
dev->offload_enabled = 0; /* Disable Smart Path */ dev->offload_enabled = 0; /* Disable Smart Path */
h->drv_req_rescan = 1; /* schedule controller rescan */
cmd->result = DID_SOFT_ERROR << 16; cmd->result = DID_SOFT_ERROR << 16;
} }
cmd_free(h, c); cmd_free(h, c);
...@@ -6478,9 +6476,6 @@ static void hpsa_ack_ctlr_events(struct ctlr_info *h) ...@@ -6478,9 +6476,6 @@ static void hpsa_ack_ctlr_events(struct ctlr_info *h)
int i; int i;
char *event_type; char *event_type;
/* Clear the driver-requested rescan flag */
h->drv_req_rescan = 0;
/* Ask the controller to clear the events we're handling. */ /* Ask the controller to clear the events we're handling. */
if ((h->transMethod & (CFGTBL_Trans_io_accel1 if ((h->transMethod & (CFGTBL_Trans_io_accel1
| CFGTBL_Trans_io_accel2)) && | CFGTBL_Trans_io_accel2)) &&
...@@ -6526,9 +6521,6 @@ static void hpsa_ack_ctlr_events(struct ctlr_info *h) ...@@ -6526,9 +6521,6 @@ static void hpsa_ack_ctlr_events(struct ctlr_info *h)
*/ */
static int hpsa_ctlr_needs_rescan(struct ctlr_info *h) static int hpsa_ctlr_needs_rescan(struct ctlr_info *h)
{ {
if (h->drv_req_rescan)
return 1;
if (!(h->fw_support & MISC_FW_EVENT_NOTIFY)) if (!(h->fw_support & MISC_FW_EVENT_NOTIFY))
return 0; return 0;
...@@ -6574,7 +6566,6 @@ static void hpsa_monitor_ctlr_worker(struct work_struct *work) ...@@ -6574,7 +6566,6 @@ static void hpsa_monitor_ctlr_worker(struct work_struct *work)
if (hpsa_ctlr_needs_rescan(h) || hpsa_offline_devices_ready(h)) { if (hpsa_ctlr_needs_rescan(h) || hpsa_offline_devices_ready(h)) {
scsi_host_get(h->scsi_host); scsi_host_get(h->scsi_host);
h->drv_req_rescan = 0;
hpsa_ack_ctlr_events(h); hpsa_ack_ctlr_events(h);
hpsa_scan_start(h->scsi_host); hpsa_scan_start(h->scsi_host);
scsi_host_put(h->scsi_host); scsi_host_put(h->scsi_host);
...@@ -6743,7 +6734,6 @@ static int hpsa_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -6743,7 +6734,6 @@ static int hpsa_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
/* Enable Accelerated IO path at driver layer */ /* Enable Accelerated IO path at driver layer */
h->acciopath_status = 1; h->acciopath_status = 1;
h->drv_req_rescan = 0;
/* Turn the interrupts on so we can service requests */ /* Turn the interrupts on so we can service requests */
h->access.set_intr_mask(h, HPSA_INTR_ON); h->access.set_intr_mask(h, HPSA_INTR_ON);
......
...@@ -235,7 +235,6 @@ struct ctlr_info { ...@@ -235,7 +235,6 @@ struct ctlr_info {
spinlock_t offline_device_lock; spinlock_t offline_device_lock;
struct list_head offline_device_list; struct list_head offline_device_list;
int acciopath_status; int acciopath_status;
int drv_req_rescan; /* flag for driver to request rescan event */
int raid_offload_debug; int raid_offload_debug;
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment