[dm-devel] [PATCH for-4.2 2/3] block, dm: don't copy bios for request clones
Junichi Nomura
j-nomura at ce.jp.nec.com
Wed Jun 3 23:13:09 UTC 2015
On 06/03/15 16:37, Christoph Hellwig wrote:
> From scsi_io_completion:
>
> /*
> * If we finished all bytes in the request we are done now.
> */
> if (!scsi_end_request(req, error, good_bytes, 0))
> return;
>
> /*
> * Kill remainder if no retrys.
> */
> if (error && scsi_noretry_cmd(cmd)) {
> if (scsi_end_request(req, error, blk_rq_bytes(req), 0))
> BUG();
> return;
> }
>
> So for a noretry command send from dm-mpath we will never leave a command
> that had an error completion around, even if it was a partial completion.
scsi_noretry_cmd() is not always true even for dm-mpath.
Following code in the later part of the function tries to complete
some bytes with error and requeue the remainder.
However it depends on blk_rq_err_bytes() whether partial error completion
actually happens...
case ACTION_FAIL:
...
if (!scsi_end_request(req, error, blk_rq_err_bytes(req), 0))
return;
/*FALLTHRU*/
case ACTION_REPREP:
requeue:
/* Unprep the request and put it back at the head of the queue.
* A new command will be prepared and issued.
*/
if (q->mq_ops) {
cmd->request->cmd_flags &= ~REQ_DONTPREP;
scsi_mq_uninit_cmd(cmd);
scsi_mq_requeue_cmd(cmd);
} else {
scsi_release_buffers(cmd);
scsi_requeue_command(q, cmd);
}
> Relying on the LLDDs to get this right seems rather dangerous, though, so
> it might make sense to lift the above sequence to core code after a careful
> audit of other drivers to see if and how they handle partial completions.
Right, that is the point.
--
Jun'ichi Nomura, NEC Corporation
More information about the dm-devel
mailing list