Reviewed-by: Scott Teel <[email protected]>
Reviewed-by: Justin Lindley <[email protected]>
Reviewed-by: Kevin Barnett <[email protected]>
Reviewed-by: Tomas Henzl <[email protected]>
Signed-off-by: Don Brace <[email protected]>
---
drivers/scsi/hpsa.c | 17 +++++++++++++++--
drivers/scsi/hpsa.h | 1 +
2 files changed, 16 insertions(+), 2 deletions(-)
diff --git a/drivers/scsi/hpsa.c b/drivers/scsi/hpsa.c
index 3fe8a18..a3f671c 100644
--- a/drivers/scsi/hpsa.c
+++ b/drivers/scsi/hpsa.c
@@ -1819,6 +1819,7 @@ static void adjust_hpsa_scsi_table(struct ctlr_info *h,
int hostno,
* since it didn't get added to scsi mid layer
*/
fixup_botched_add(h, added[i]);
+ h->drv_req_rescan = 1;
}
free_and_out:
@@ -3760,9 +3761,13 @@ static void hpsa_update_scsi_devices(struct ctlr_info
*h, int hostno)
}
memset(lunzerobits, 0, sizeof(lunzerobits));
+ h->drv_req_rescan = 0; /* cancel scheduled rescan - we're doing it. */
+
if (hpsa_gather_lun_info(h, physdev_list, &nphysicals,
- logdev_list, &nlogicals))
+ logdev_list, &nlogicals)) {
+ h->drv_req_rescan = 1;
goto out;
+ }
/* We might see up to the maximum number of logical and physical disks
* plus external target devices, and a device for the local RAID
@@ -3783,6 +3788,7 @@ static void hpsa_update_scsi_devices(struct ctlr_info *h,
int hostno)
if (!currentsd[i]) {
dev_warn(&h->pdev->dev, "out of memory at %s:%d\n",
__FILE__, __LINE__);
+ h->drv_req_rescan = 1;
goto out;
}
ndev_allocated++;
@@ -3810,8 +3816,10 @@ static void hpsa_update_scsi_devices(struct ctlr_info
*h, int hostno)
/* Get device type, vendor, model, device id */
if (hpsa_update_device_info(h, lunaddrbytes, tmpdevice,
- &is_OBDR))
+ &is_OBDR)) {
+ h->drv_req_rescan = 1;
continue; /* skip it if we can't talk to it. */
+ }
figure_bus_target_lun(h, lunaddrbytes, tmpdevice);
hpsa_update_device_supports_aborts(h, tmpdevice, lunaddrbytes);
this_device = currentsd[ncurrent];
@@ -7871,6 +7879,11 @@ static void hpsa_ack_ctlr_events(struct ctlr_info *h)
*/
static int hpsa_ctlr_needs_rescan(struct ctlr_info *h)
{
+ if (h->drv_req_rescan) {
+ h->drv_req_rescan = 0;
+ return 1;
+ }
+
if (!(h->fw_support & MISC_FW_EVENT_NOTIFY))
return 0;
diff --git a/drivers/scsi/hpsa.h b/drivers/scsi/hpsa.h
index d6c4ebf..b173c0e 100644
--- a/drivers/scsi/hpsa.h
+++ b/drivers/scsi/hpsa.h
@@ -262,6 +262,7 @@ struct ctlr_info {
spinlock_t offline_device_lock;
struct list_head offline_device_list;
int acciopath_status;
+ int drv_req_rescan;
int raid_offload_debug;
int needs_abort_tags_swizzled;
struct workqueue_struct *resubmit_wq;
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html