|
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 |
|