From: Christoph Hellwig Date: Fri, 16 Oct 2015 05:58:31 +0000 (+0200) Subject: nvme: add missing unmaps in nvme_queue_rq X-Git-Tag: v4.1.12-92~126^2~218 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=d20457fd75ada8b30c39d1406f3f7fb65bc85ee8;p=users%2Fjedix%2Flinux-maple.git nvme: add missing unmaps in nvme_queue_rq When we fail various metadata related operations in nvme_queue_rq we need to unmap the data SGL. Cc: stable@vger.kernel.org Signed-off-by: Christoph Hellwig Signed-off-by: Keith Busch Signed-off-by: Jens Axboe (cherry picked from commit bf508e910b02a6107a5aa054e03c6fc8a65dae1e) Orabug: 22620486 Signed-off-by: Jason Luo --- diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c index 92391e42f17ff..c6e0ac671cc10 100644 --- a/drivers/nvme/host/pci.c +++ b/drivers/nvme/host/pci.c @@ -910,19 +910,28 @@ static int nvme_queue_rq(struct blk_mq_hw_ctx *hctx, goto retry_cmd; } if (blk_integrity_rq(req)) { - if (blk_rq_count_integrity_sg(req->q, req->bio) != 1) + if (blk_rq_count_integrity_sg(req->q, req->bio) != 1) { + dma_unmap_sg(dev->dev, iod->sg, iod->nents, + dma_dir); goto error_cmd; + } sg_init_table(iod->meta_sg, 1); if (blk_rq_map_integrity_sg( - req->q, req->bio, iod->meta_sg) != 1) + req->q, req->bio, iod->meta_sg) != 1) { + dma_unmap_sg(dev->dev, iod->sg, iod->nents, + dma_dir); goto error_cmd; + } if (rq_data_dir(req)) nvme_dif_remap(req, nvme_dif_prep); - if (!dma_map_sg(nvmeq->q_dmadev, iod->meta_sg, 1, dma_dir)) + if (!dma_map_sg(nvmeq->q_dmadev, iod->meta_sg, 1, dma_dir)) { + dma_unmap_sg(dev->dev, iod->sg, iod->nents, + dma_dir); goto error_cmd; + } } }