diff options
author | Wayne Boyer <wayneb@linux.vnet.ibm.com> | 2010-06-10 17:46:34 -0400 |
---|---|---|
committer | James Bottomley <James.Bottomley@suse.de> | 2010-07-27 13:01:42 -0400 |
commit | 56115598c571cadd4b465836e1423a452a908c89 (patch) | |
tree | e2b37e4e62e6fb1b0d243b2e2d5d5a6b57e2a6fc | |
parent | 82284c09c5dc5c5a5046f3c852f2683dab60109c (diff) |
[SCSI] ipr: move setting of the allow_restart flag for vsets and disks
A problem was found where the call to scsi_add_device() fails intermittently
for an adapter. This is caused when __scsi_add_device() returns -ENODEV as
a result of not calling scsi_probe_and_add_lun() since the call to
scsi_host_scan_allowed() fails. scsi_host_scan_allowed() fails because the
adapter state is set to SHOST_RECOVERY instead of SHOST_RUNNING. The state of
the adapter is being set to SHOST_RECOVERY by scsi_eh_scmd_add() during
error handling.
This problem is avoided by moving the setting of the allow_restart flag to
later in the device initialization sequence. This prevents further error
handling if we get a NOT_READY response from a TUR command by causing
scsi_check_sense() to return SUCCESS. Therefore, scsi_eh_scmd_add() will
not run and the adapter state will remain as SHOST_RUNNING.
Signed-off-by: Wayne Boyer <wayneb@linux.vnet.ibm.com>
Acked-by: Brian King <brking@linux.vnet.ibm.com>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>
-rw-r--r-- | drivers/scsi/ipr.c | 5 |
1 files changed, 2 insertions, 3 deletions
diff --git a/drivers/scsi/ipr.c b/drivers/scsi/ipr.c index 62bbe31dd47b..37158eab3c89 100644 --- a/drivers/scsi/ipr.c +++ b/drivers/scsi/ipr.c | |||
@@ -4353,8 +4353,6 @@ static int ipr_slave_configure(struct scsi_device *sdev) | |||
4353 | IPR_VSET_RW_TIMEOUT); | 4353 | IPR_VSET_RW_TIMEOUT); |
4354 | blk_queue_max_hw_sectors(sdev->request_queue, IPR_VSET_MAX_SECTORS); | 4354 | blk_queue_max_hw_sectors(sdev->request_queue, IPR_VSET_MAX_SECTORS); |
4355 | } | 4355 | } |
4356 | if (ipr_is_vset_device(res) || ipr_is_scsi_disk(res)) | ||
4357 | sdev->allow_restart = 1; | ||
4358 | if (ipr_is_gata(res) && res->sata_port) | 4356 | if (ipr_is_gata(res) && res->sata_port) |
4359 | ap = res->sata_port->ap; | 4357 | ap = res->sata_port->ap; |
4360 | spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); | 4358 | spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); |
@@ -6771,7 +6769,8 @@ static int ipr_init_res_table(struct ipr_cmnd *ipr_cmd) | |||
6771 | list_move_tail(&res->queue, &ioa_cfg->used_res_q); | 6769 | list_move_tail(&res->queue, &ioa_cfg->used_res_q); |
6772 | ipr_init_res_entry(res, &cfgtew); | 6770 | ipr_init_res_entry(res, &cfgtew); |
6773 | res->add_to_ml = 1; | 6771 | res->add_to_ml = 1; |
6774 | } | 6772 | } else if (res->sdev && (ipr_is_vset_device(res) || ipr_is_scsi_disk(res))) |
6773 | res->sdev->allow_restart = 1; | ||
6775 | 6774 | ||
6776 | if (found) | 6775 | if (found) |
6777 | ipr_update_res_entry(res, &cfgtew); | 6776 | ipr_update_res_entry(res, &cfgtew); |