[openib-general][patch review] srp: fmr implementation,
Vu Pham
vuhuong at mellanox.com
Mon May 8 10:25:15 PDT 2006
Roland Dreier wrote:
> Vu> Have you read scsi_eh_try_stu(scmnd) and scsi_eh_tur(scmnd)?
> Vu> These functions use the same scmnd and reformat it with new
> Vu> cdb and call srp_queuecommand() which uses new req and put
> Vu> this new req in request queue for this same scmnd with
> Vu> different cdb
>
> Yes, but why are there any commands in the work_q at all? In other
> words, why is this loop entered at all?
>
> list_for_each_entry_safe(scmd, next, work_q, eh_entry) {
> if (!scsi_device_online(scmd->device) ||
> (!scsi_eh_try_stu(scmd) && !scsi_eh_tur(scmd)) ||
> !scsi_eh_tur(scmd))
> scsi_eh_finish_cmd(scmd, done_q);
> }
>
The command is removed from work_q in scsi_eh_finish_cmd()
if scsi_eh_abort_cmds() or scsi_eh_bus_device_reset() or
scsi_eh_host_reset() return SUCCESS. This require at least
one scsi_eh_tur or stu has to be successfully sent.
In our case we failed scsi_eh_abort_cmds() and
scsi_eh_bus_device_reset(). Therefore, if we enter
scsi_eh_host_reset with 2 outstanding scmnd in work_q, we
end up in this loop.
> srp_reconnect_target() should get rid of all queued commands already:
>
> list_for_each_entry(req, &target->req_queue, list) {
> req->scmnd->result = DID_RESET << 16;
> req->scmnd->scsi_done(req->scmnd);
> srp_unmap_data(req->scmnd, target, req);
> }
>
> why does the midlayer have any commands around after that loop?
>
scmnd->scsi_done() does not guarantee the scmnd is removed
from work_q of scsi midlayer in error handling flow.
Moreover scmnd may be reformat by scsi milayer to send stu
or tur command if any and scmnd->scsi_done is already
changed to scsi_eh_done() by srp.
More information about the general
mailing list