From: Keith Busch <kbusch@xxxxxxxxxx> I was never happy with previous block copy offload attempts, so I had to take a stab at it. And I was recently asked to take a look at this, so here goes. Some key implementation differences from previous approaches: 1. Only one bio is needed to describe a copy request, so no plugging or dispatch tricks required. Like read and write requests, these can be artbitrarily large and will be split as needed based on the request_queue's limits. The bio's are mergeable with other copy commands on adjacent destination sectors. 2. You can describe as many source sectors as you want in a vector in a single bio. This aligns with the nvme protocol's Copy implementation, which can be used to efficiently defragment scattered blocks into a contiguous destination with a single command. Oh, and the nvme-target support was included with this patchset too, so there's a purely in-kernel way to test out the code paths if you don't have otherwise capable hardware. I also used qemu since that nvme device supports copy offload too. Keith Busch (5): block: new sector copy api block: add support for copy offload nvme: add support for copy offload block: add support for vectored copies nvmet: implement copy support for bdev backed target block/bio.c | 25 +++++++ block/blk-core.c | 4 ++ block/blk-lib.c | 115 ++++++++++++++++++++++++++++++ block/blk-merge.c | 28 +++++++- block/blk-sysfs.c | 9 +++ block/blk.h | 17 ++++- block/ioctl.c | 89 +++++++++++++++++++++++ drivers/nvme/host/core.c | 61 ++++++++++++++++ drivers/nvme/target/io-cmd-bdev.c | 52 ++++++++++++++ include/linux/bio.h | 20 ++++++ include/linux/blk-mq.h | 5 ++ include/linux/blk_types.h | 2 + include/linux/blkdev.h | 18 +++++ include/linux/bvec.h | 68 +++++++++++++++++- include/linux/nvme.h | 42 ++++++++++- include/uapi/linux/fs.h | 17 +++++ 16 files changed, 566 insertions(+), 6 deletions(-) -- 2.47.1