md treats an unsupported P2PDMA transfer to a member as success, and
nvme-rdma retries one forever. Restore BLK_STS_TARGET for these
failures (lost in the blk_rq_dma_map conversion, v6.17) and fix what
md and nvme-rdma do around it.
Whether peer memory can be DMA-mapped depends on the PCIe topology
between the two devices: the same buffer may map fine for one
array member or nvme path and fail for another. Since v6.17 that
failure completes as BLK_STS_INVAL.
md deliberately ignores INVAL member failures (commit
f7b24c7b41f2) and accepts P2PDMA bios since v7.2-rc1. So a peer
write to an unreachable member simply counts as written: mirrors
silently diverge, and with no member reachable the write still
reports success. nvme-rdma never even sees the errno --
ib_dma_map_sg() returns 0 -- and reports a path error, which
default multipath requeues forever.
1 blk-mq-dma: restore BLK_STS_TARGET (block; stable, v6.17)
2 md: keep REQ_NOMERGE on P2PDMA bios
3 md/raid1: serialize non-write-behind writes on CollisionCheck
rdevs (pre-existing bug patch 4 would widen; stable)
4 md/raid1: no write-behind for P2PDMA bios
5 md/raid1,raid10: keep REQ_NOMERGE on narrow_write_error()
retry clones
6 md/raid1: skip futile retries on P2PDMA mapping failures
7 md/raid10: same
8 nvme-rdma: preserve the DMA errno, return BLK_STS_TARGET
(stable, v7.1)
Routing: patch 1 block, 2-7 md, 8 nvme; independently applicable
(patch 8 takes the errno from dma_map_sgtable() in rdma.c, not
from patch 1).
The patches were developed with AI assistance (see the Assisted-by
trailers); all code was human-reviewed and tested (result tables in
the v2 cover, linked below).
Against v7.2-rc2; merges clean onto current master.
Changes in v3:
- split the raid1,raid10 mapping-failure patch per personality and
folded its completion-path checks into one branch (Logan)
- much shorter commit messages, comments and cover (Christoph,
Keith, Leon); repro description added (Christoph)
- picked up Logan's Reviewed-by on 1, 2, 4 and 5; since his review
only a code comment in 1 and 2 was shortened (no code change)
Changes in v2: new serialization fix (patch 3), submission-time
state bit, metadata scatterlist, WantReplacement dropped for
mapping failures -- details in the v2 cover.
Link: https://lore.kernel.org/linux-raid/20260718162547.448892-1-mykola@meshstor.io/ [v1]
Link: https://lore.kernel.org/linux-raid/20260719105327.864949-1-mykola@meshstor.io/ [v2]
Mykola Marzhan (8):
blk-mq-dma: restore BLK_STS_TARGET for unsupported P2P transfers
md: ensure REQ_NOMERGE is set on P2PDMA bios
md/raid1: serialize non-write-behind writes on CollisionCheck rdevs
md/raid1: don't use write-behind for P2PDMA bios
md/raid1,raid10: keep REQ_NOMERGE on narrow_write_error() retry clones
md/raid1: skip futile retries on P2PDMA mapping failures
md/raid10: skip futile retries on P2PDMA mapping failures
nvme-rdma: return BLK_STS_TARGET for unsupported P2P transfers
block/blk-mq-dma.c | 6 +++-
drivers/md/md.c | 10 ++++--
drivers/md/md.h | 15 +++++++++
drivers/md/raid1.c | 73 ++++++++++++++++++++++++++++++----------
drivers/md/raid1.h | 2 ++
drivers/md/raid10.c | 66 +++++++++++++++++++++++++++---------
drivers/md/raid10.h | 2 ++
drivers/nvme/host/rdma.c | 38 ++++++++++++---------
8 files changed, 160 insertions(+), 52 deletions(-)
base-commit: 8cdeaa50eae8dad34885515f62559ee83e7e8dda
--
2.52.0