]> git.ipfire.org Git - thirdparty/kernel/linux.git/commit
block: fix partial IOVA mapping cleanup in blk_rq_dma_map_iova
authorChaitanya Kulkarni <kch@nvidia.com>
Wed, 11 Feb 2026 20:49:44 +0000 (12:49 -0800)
committerJens Axboe <axboe@kernel.dk>
Thu, 12 Feb 2026 11:23:31 +0000 (04:23 -0700)
commit81e7223b1a2d63b655ee72577c8579f968d037e3
tree4a0ed061f6ab14f2465b60c4b1e2574efe5fa5d7
parent5991bfa3f88ec8d67fa3f552c19c39ff37a4e67b
block: fix partial IOVA mapping cleanup in blk_rq_dma_map_iova

When dma_iova_link() fails partway through mapping a request's bvec
list, the function breaks out of the loop without cleaning up
already mapped segments. Similarly, if dma_iova_sync() fails after
linking all segments, no cleanup is performed.

This leaves partial IOVA mappings in place. The completion path
attempts to unmap the full expected size via dma_iova_destroy() or
nvme_unmap_data(), but only a partial size was actually mapped,
leading to incorrect unmap operations.

Add an out_unlink error path that calls dma_iova_destroy() to clean
up partial mappings before returning failure. The dma_iova_destroy()
function handles both partial unlink and IOVA space freeing. It
correctly handles the mapped_len == 0 case (first dma_iova_link()
failure) by only freeing the IOVA allocation without attempting to
unmap.

Signed-off-by: Chaitanya Kulkarni <kch@nvidia.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/blk-mq-dma.c