On Mon, Aug 28, 2017 at 04:40:43PM +0300, Sagi Grimberg wrote: > I thought your multipathing code would really live in the block > layer and only require something really basic from nvme (which could > easily be applied on other drivers). But I do understand it might > create a lot of churn. The earlier versions did a lot more in common code, but I gradually moved away from that: - first I didn't have a separate queue, but just bounced I/O between sibling queues. So there was no new make_request based queue, and we had to track the relations in the block layer, with a callback to check the path status - I got rid of the non-trivial path selector So in the end very little block layer code remained. But then again very little nvme code remained either.. > btw, why are partial completions something that can't be done > without cloning the bio? is it possible to clone the bio once from the > completion flow when you see that you got a partial completion? The problem with partial completions is that blk_update_request completes bios as soon as it get enough bytes to finish them. This should not be an unsolvable problem, but it will be a bit messy at least. But then again I hope that no new protocols will be designed with partial completions - SCSI is pretty special in that regard.