> + if (blk_rq_nr_phys_segments(req) != 2) > + return BLK_STS_IOERR; The magic number of segments adding up source and dest really need constants and helpers to make the code understandable. > + /* +1 shift as dst+src length is added in request merging, we send copy > + * for half the length. > + */ > + n_lba = blk_rq_bytes(req) >> (ns->lba_shift + 1); I do not understand the logic and comment here. > + if (WARN_ON(!n_lba)) WARN_ON_ONCE > + return BLK_STS_NOTSUPP; and BLK_STS_NOTSUPP seems like the wrong error here, this is an invalid argument.