Commit 951d77fd authored by James Bottomley's avatar James Bottomley

Merge remote-tracking branch 'mkp-scsi/4.7/scsi-fixes' into fixes

parents 27ea13e6 8beb3300
...@@ -263,19 +263,23 @@ scmd->allowed. ...@@ -263,19 +263,23 @@ scmd->allowed.
3. scmd recovered 3. scmd recovered
ACTION: scsi_eh_finish_cmd() is invoked to EH-finish scmd ACTION: scsi_eh_finish_cmd() is invoked to EH-finish scmd
- shost->host_failed--
- clear scmd->eh_eflags - clear scmd->eh_eflags
- scsi_setup_cmd_retry() - scsi_setup_cmd_retry()
- move from local eh_work_q to local eh_done_q - move from local eh_work_q to local eh_done_q
LOCKING: none LOCKING: none
CONCURRENCY: at most one thread per separate eh_work_q to
keep queue manipulation lockless
4. EH completes 4. EH completes
ACTION: scsi_eh_flush_done_q() retries scmds or notifies upper ACTION: scsi_eh_flush_done_q() retries scmds or notifies upper
layer of failure. layer of failure. May be called concurrently but must have
a no more than one thread per separate eh_work_q to
manipulate the queue locklessly
- scmd is removed from eh_done_q and scmd->eh_entry is cleared - scmd is removed from eh_done_q and scmd->eh_entry is cleared
- if retry is necessary, scmd is requeued using - if retry is necessary, scmd is requeued using
scsi_queue_insert() scsi_queue_insert()
- otherwise, scsi_finish_command() is invoked for scmd - otherwise, scsi_finish_command() is invoked for scmd
- zero shost->host_failed
LOCKING: queue or finish function performs appropriate locking LOCKING: queue or finish function performs appropriate locking
......
...@@ -606,7 +606,7 @@ void ata_scsi_error(struct Scsi_Host *host) ...@@ -606,7 +606,7 @@ void ata_scsi_error(struct Scsi_Host *host)
ata_scsi_port_error_handler(host, ap); ata_scsi_port_error_handler(host, ap);
/* finish or retry handled scmd's and clean up */ /* finish or retry handled scmd's and clean up */
WARN_ON(host->host_failed || !list_empty(&eh_work_q)); WARN_ON(!list_empty(&eh_work_q));
DPRINTK("EXIT\n"); DPRINTK("EXIT\n");
} }
......
...@@ -1122,7 +1122,7 @@ process_script_interrupt(__u32 dsps, __u32 dsp, struct scsi_cmnd *SCp, ...@@ -1122,7 +1122,7 @@ process_script_interrupt(__u32 dsps, __u32 dsp, struct scsi_cmnd *SCp,
} else { } else {
struct scsi_cmnd *SCp; struct scsi_cmnd *SCp;
SCp = scsi_host_find_tag(SDp->host, SCSI_NO_TAG); SCp = SDp->current_cmnd;
if(unlikely(SCp == NULL)) { if(unlikely(SCp == NULL)) {
sdev_printk(KERN_ERR, SDp, sdev_printk(KERN_ERR, SDp,
"no saved request for untagged cmd\n"); "no saved request for untagged cmd\n");
...@@ -1826,7 +1826,7 @@ NCR_700_queuecommand_lck(struct scsi_cmnd *SCp, void (*done)(struct scsi_cmnd *) ...@@ -1826,7 +1826,7 @@ NCR_700_queuecommand_lck(struct scsi_cmnd *SCp, void (*done)(struct scsi_cmnd *)
slot->tag, slot); slot->tag, slot);
} else { } else {
slot->tag = SCSI_NO_TAG; slot->tag = SCSI_NO_TAG;
/* must populate current_cmnd for scsi_host_find_tag to work */ /* save current command for reselection */
SCp->device->current_cmnd = SCp; SCp->device->current_cmnd = SCp;
} }
/* sanity check: some of the commands generated by the mid-layer /* sanity check: some of the commands generated by the mid-layer
......
...@@ -1128,7 +1128,6 @@ static int scsi_eh_action(struct scsi_cmnd *scmd, int rtn) ...@@ -1128,7 +1128,6 @@ static int scsi_eh_action(struct scsi_cmnd *scmd, int rtn)
*/ */
void scsi_eh_finish_cmd(struct scsi_cmnd *scmd, struct list_head *done_q) void scsi_eh_finish_cmd(struct scsi_cmnd *scmd, struct list_head *done_q)
{ {
scmd->device->host->host_failed--;
scmd->eh_eflags = 0; scmd->eh_eflags = 0;
list_move_tail(&scmd->eh_entry, done_q); list_move_tail(&scmd->eh_entry, done_q);
} }
...@@ -2227,6 +2226,9 @@ int scsi_error_handler(void *data) ...@@ -2227,6 +2226,9 @@ int scsi_error_handler(void *data)
else else
scsi_unjam_host(shost); scsi_unjam_host(shost);
/* All scmds have been handled */
shost->host_failed = 0;
/* /*
* Note - if the above fails completely, the action is to take * Note - if the above fails completely, the action is to take
* individual devices offline and flush the queue of any * individual devices offline and flush the queue of any
......
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