|
@@ -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
|
|
|
|
|
|
|
|
|