[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