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 -- dm-devel mailing list dm-devel@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/dm-devel