From: Keith Busch Date: Sat, 17 Dec 2016 23:33:20 +0000 (-0800) Subject: NVMe: Fix IO for extended metadata formats X-Git-Tag: v4.1.12-102.0.20170601_1400~203 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=40c256c1b7161800c767d7af8aab78761be1eae2;p=users%2Fjedix%2Flinux-maple.git NVMe: Fix IO for extended metadata formats This fixes io submit ioctl handling when using extended metadata formats. When these formats are used, the user provides a single virtually contiguous buffer containing both the block and metadata interleaved, so the metadata size needs to be added to the total length and not mapped as a separate transfer. The command is also driver generated, so this patch does not enforce blk-integrity extensions provide the metadata buffer. Reported-by: Marcin Dziegielewski Signed-off-by: Keith Busch Signed-off-by: Jens Axboe (cherry picked from commit 71feb364e7faadc681e714f7fdc2bede208ba26c) Orabug: 25130845 Signed-off-by: Ashok Vairavan Reviewed-by: Martin K. Petersen --- diff --git a/drivers/block/nvme-core.c b/drivers/block/nvme-core.c index 6302216e03032..360526b195692 100644 --- a/drivers/block/nvme-core.c +++ b/drivers/block/nvme-core.c @@ -893,7 +893,8 @@ static int nvme_queue_rq(struct blk_mq_hw_ctx *hctx, * stripped/generated by the controller with PRACT=1. */ if (ns && ns->ms && !blk_integrity_rq(req)) { - if (!(ns->pi_type && ns->ms == 8)) { + if (!(ns->pi_type && ns->ms == 8) && + req->cmd_type != REQ_TYPE_DRV_PRIV) { req->errors = -EFAULT; blk_mq_complete_request(req); return BLK_MQ_RQ_QUEUE_OK; @@ -1804,15 +1805,14 @@ static int nvme_submit_io(struct nvme_ns *ns, struct nvme_user_io __user *uio) metadata = (void __user *)(uintptr_t)io.metadata; write = io.opcode & 1; + if (ns->ext) { + length += meta_len; + meta_len = 0; + } if (meta_len) { if (((io.metadata & 3) || !io.metadata) && !ns->ext) return -EINVAL; - if (ns->ext) { - length += meta_len; - meta_len = 0; - } - meta = dma_alloc_coherent(dev->dev, meta_len, &meta_dma, GFP_KERNEL);