Hannes Reinecke ba3392
From: Sagi Grimberg <sagi@grimberg.me>
Hannes Reinecke ba3392
Date: Wed, 13 Jan 2021 13:56:57 -0800
Hannes Reinecke ba3392
Subject: [PATCH] nvme-tcp: fix possible data corruption with bio merges
Hannes Reinecke ba3392
Git-commit: ca1ff67d0fb14f39cf0cc5102b1fbcc3b14f6fb9
Hannes Reinecke ba3392
Patch-mainline: v5.11-rc1
Hannes Reinecke ba3392
References: git-fixes
Hannes Reinecke ba3392
Hannes Reinecke ba3392
When a bio merges, we can get a request that spans multiple
Hannes Reinecke ba3392
bios, and the overall request payload size is the sum of
Hannes Reinecke ba3392
all bios. When we calculate how much we need to send
Hannes Reinecke ba3392
from the existing bio (and bvec), we did not take into
Hannes Reinecke ba3392
account the iov_iter byte count cap.
Hannes Reinecke ba3392
Hannes Reinecke ba3392
Since multipage bvecs support, bvecs can split in the middle
Hannes Reinecke ba3392
which means that when we account for the last bvec send we
Hannes Reinecke ba3392
should also take the iov_iter byte count cap as it might be
Hannes Reinecke ba3392
lower than the last bvec size.
Hannes Reinecke ba3392
Hannes Reinecke ba3392
Reported-by: Hao Wang <pkuwangh@gmail.com>
Hannes Reinecke ba3392
Fixes: 3f2304f8c6d6 ("nvme-tcp: add NVMe over TCP host driver")
Hannes Reinecke ba3392
Tested-by: Hao Wang <pkuwangh@gmail.com>
Hannes Reinecke ba3392
Signed-off-by: Sagi Grimberg <sagi@grimberg.me>
Hannes Reinecke ba3392
Signed-off-by: Christoph Hellwig <hch@lst.de>
Hannes Reinecke ba3392
Acked-by: Hannes Reinecke <hare@suse.com>
Hannes Reinecke ba3392
---
Hannes Reinecke ba3392
 drivers/nvme/host/tcp.c | 2 +-
Hannes Reinecke ba3392
 1 file changed, 1 insertion(+), 1 deletion(-)
Hannes Reinecke ba3392
Hannes Reinecke ba3392
diff --git a/drivers/nvme/host/tcp.c b/drivers/nvme/host/tcp.c
Hannes Reinecke ba3392
index b2e0865785ef..216619926563 100644
Hannes Reinecke ba3392
--- a/drivers/nvme/host/tcp.c
Hannes Reinecke ba3392
+++ b/drivers/nvme/host/tcp.c
Hannes Reinecke ba3392
@@ -201,7 +201,7 @@ static inline size_t nvme_tcp_req_cur_offset(struct nvme_tcp_request *req)
Hannes Reinecke ba3392
 
Hannes Reinecke ba3392
 static inline size_t nvme_tcp_req_cur_length(struct nvme_tcp_request *req)
Hannes Reinecke ba3392
 {
Hannes Reinecke ba3392
-	return min_t(size_t, req->iter.bvec->bv_len - req->iter.iov_offset,
Hannes Reinecke ba3392
+	return min_t(size_t, iov_iter_single_seg_count(&req->iter),
Hannes Reinecke ba3392
 			req->pdu_len - req->pdu_sent);
Hannes Reinecke ba3392
 }
Hannes Reinecke ba3392
 
Hannes Reinecke ba3392
-- 
Hannes Reinecke ba3392
2.29.2
Hannes Reinecke ba3392