diff options
author | Don Brace <don.brace@pmcs.com> | 2015-11-05 00:50:37 +0300 |
---|---|---|
committer | Martin K. Petersen <martin.petersen@oracle.com> | 2015-11-09 20:34:19 +0300 |
commit | 853633e85996cb661e7aed5b3ae8823b12f265cf (patch) | |
tree | e3d9d14981b819f290fa622a26157e2b166b1511 /drivers/scsi/hpsa.c | |
parent | 1d33d85d4e51d85ee986b603de90be4f0b2faf2c (diff) | |
download | linux-853633e85996cb661e7aed5b3ae8823b12f265cf.tar.xz |
hpsa: allow driver requested rescans
Reviewed-by: Scott Teel <scott.teel@pmcs.com>
Reviewed-by: Justin Lindley <justin.lindley@pmcs.com>
Reviewed-by: Kevin Barnett <kevin.barnett@pmcs.com>
Reviewed-by: Tomas Henzl <thenzl@redhat.com>
Reviewed-by; Hannes Reinecke <hare@suse.de>
Signed-off-by: Don Brace <don.brace@pmcs.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Diffstat (limited to 'drivers/scsi/hpsa.c')
-rw-r--r-- | drivers/scsi/hpsa.c | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/drivers/scsi/hpsa.c b/drivers/scsi/hpsa.c index 446816664335..f010b8ec1a20 100644 --- a/drivers/scsi/hpsa.c +++ b/drivers/scsi/hpsa.c @@ -1810,6 +1810,7 @@ static void adjust_hpsa_scsi_table(struct ctlr_info *h, * since it didn't get added to scsi mid layer */ fixup_botched_add(h, added[i]); + h->drv_req_rescan = 1; } free_and_out: @@ -3751,9 +3752,13 @@ static void hpsa_update_scsi_devices(struct ctlr_info *h) } 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 @@ -3774,6 +3779,7 @@ static void hpsa_update_scsi_devices(struct ctlr_info *h) 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++; @@ -3801,8 +3807,10 @@ static void hpsa_update_scsi_devices(struct ctlr_info *h) /* 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]; @@ -7862,6 +7870,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; |