|
Hannes Reinecke |
1412d5 |
From: Sagi Grimberg <sagi@grimberg.me>
|
|
Hannes Reinecke |
1412d5 |
Date: Wed, 10 Feb 2021 14:04:00 -0800
|
|
Hannes Reinecke |
1412d5 |
Subject: [PATCH] nvme-tcp: fix crash triggered with a dataless request
|
|
Hannes Reinecke |
1412d5 |
submission
|
|
Hannes Reinecke |
1412d5 |
Git-commit: e11e5116171dedeaf63735931e72ad5de0f30ed5
|
|
Hannes Reinecke |
1412d5 |
Patch-mainline: v5.12-rc1
|
|
Hannes Reinecke |
1412d5 |
References: git-fixes
|
|
Hannes Reinecke |
1412d5 |
|
|
Hannes Reinecke |
1412d5 |
write-zeros has a bio, but does not have any data buffers associated
|
|
Hannes Reinecke |
1412d5 |
with it. Hence should not initialize the request iter for it (which
|
|
Hannes Reinecke |
1412d5 |
attempts to reference the bi_io_vec (and crash).
|
|
Hannes Reinecke |
1412d5 |
--
|
|
Hannes Reinecke |
1412d5 |
run blktests nvme/012 at 2021-02-05 21:53:34
|
|
Hannes Reinecke |
1412d5 |
BUG: kernel NULL pointer dereference, address: 0000000000000008
|
|
Hannes Reinecke |
1412d5 |
#PF: supervisor read access in kernel mode
|
|
Hannes Reinecke |
1412d5 |
#PF: error_code(0x0000) - not-present page
|
|
Hannes Reinecke |
1412d5 |
PGD 0 P4D 0
|
|
Hannes Reinecke |
1412d5 |
Oops: 0000 [#1] SMP NOPTI
|
|
Hannes Reinecke |
1412d5 |
CPU: 15 PID: 12069 Comm: kworker/15:2H Tainted: G S I 5.11.0-rc6+ #1
|
|
Hannes Reinecke |
1412d5 |
Hardware name: Dell Inc. PowerEdge R640/06NR82, BIOS 2.10.0 11/12/2020
|
|
Hannes Reinecke |
1412d5 |
Workqueue: kblockd blk_mq_run_work_fn
|
|
Hannes Reinecke |
1412d5 |
RIP: 0010:nvme_tcp_init_iter+0x7d/0xd0 [nvme_tcp]
|
|
Hannes Reinecke |
1412d5 |
RSP: 0018:ffffbd084447bd18 EFLAGS: 00010246
|
|
Hannes Reinecke |
1412d5 |
RAX: 0000000000000000 RBX: ffffa0bba9f3ce80 RCX: 0000000000000000
|
|
Hannes Reinecke |
1412d5 |
RDX: 0000000000000000 RSI: 0000000000000001 RDI: 0000000002000000
|
|
Hannes Reinecke |
1412d5 |
RBP: ffffa0ba8ac6fec0 R08: 0000000002000000 R09: 0000000000000000
|
|
Hannes Reinecke |
1412d5 |
R10: 0000000002800809 R11: 0000000000000000 R12: 0000000000000000
|
|
Hannes Reinecke |
1412d5 |
R13: ffffa0bba9f3cf90 R14: 0000000000000000 R15: 0000000000000000
|
|
Hannes Reinecke |
1412d5 |
FS: 0000000000000000(0000) GS:ffffa0c9ff9c0000(0000) knlGS:0000000000000000
|
|
Hannes Reinecke |
1412d5 |
CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
|
|
Hannes Reinecke |
1412d5 |
CR2: 0000000000000008 CR3: 00000001c9c6c005 CR4: 00000000007706e0
|
|
Hannes Reinecke |
1412d5 |
DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
|
|
Hannes Reinecke |
1412d5 |
DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
|
|
Hannes Reinecke |
1412d5 |
PKRU: 55555554
|
|
Hannes Reinecke |
1412d5 |
Call Trace:
|
|
Hannes Reinecke |
1412d5 |
nvme_tcp_queue_rq+0xef/0x330 [nvme_tcp]
|
|
Hannes Reinecke |
1412d5 |
blk_mq_dispatch_rq_list+0x11c/0x7c0
|
|
Hannes Reinecke |
1412d5 |
? blk_mq_flush_busy_ctxs+0xf6/0x110
|
|
Hannes Reinecke |
1412d5 |
__blk_mq_sched_dispatch_requests+0x12b/0x170
|
|
Hannes Reinecke |
1412d5 |
blk_mq_sched_dispatch_requests+0x30/0x60
|
|
Hannes Reinecke |
1412d5 |
__blk_mq_run_hw_queue+0x2b/0x60
|
|
Hannes Reinecke |
1412d5 |
process_one_work+0x1cb/0x360
|
|
Hannes Reinecke |
1412d5 |
? process_one_work+0x360/0x360
|
|
Hannes Reinecke |
1412d5 |
worker_thread+0x30/0x370
|
|
Hannes Reinecke |
1412d5 |
? process_one_work+0x360/0x360
|
|
Hannes Reinecke |
1412d5 |
kthread+0x116/0x130
|
|
Hannes Reinecke |
1412d5 |
? kthread_park+0x80/0x80
|
|
Hannes Reinecke |
1412d5 |
ret_from_fork+0x1f/0x30
|
|
Hannes Reinecke |
1412d5 |
--
|
|
Hannes Reinecke |
1412d5 |
|
|
Hannes Reinecke |
1412d5 |
Fixes: cb9b870fba3e ("nvme-tcp: fix wrong setting of request iov_iter")
|
|
Hannes Reinecke |
1412d5 |
Reported-by: Yi Zhang <yi.zhang@redhat.com>
|
|
Hannes Reinecke |
1412d5 |
Signed-off-by: Sagi Grimberg <sagi@grimberg.me>
|
|
Hannes Reinecke |
1412d5 |
Reviewed-by: Keith Busch <kbusch@kernel.org>
|
|
Hannes Reinecke |
1412d5 |
Reviewed-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
|
|
Hannes Reinecke |
1412d5 |
Tested-by: Yi Zhang <yi.zhang@redhat.com>
|
|
Hannes Reinecke |
1412d5 |
Signed-off-by: Christoph Hellwig <hch@lst.de>
|
|
Hannes Reinecke |
1412d5 |
Acked-by: Hannes Reinecke <hare@suse.com>
|
|
Hannes Reinecke |
1412d5 |
---
|
|
Hannes Reinecke |
1412d5 |
drivers/nvme/host/tcp.c | 2 +-
|
|
Hannes Reinecke |
1412d5 |
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
Hannes Reinecke |
1412d5 |
|
|
Hannes Reinecke |
1412d5 |
diff --git a/drivers/nvme/host/tcp.c b/drivers/nvme/host/tcp.c
|
|
Hannes Reinecke |
1412d5 |
index 619b0d8f6e38..69f59d2c5799 100644
|
|
Hannes Reinecke |
1412d5 |
--- a/drivers/nvme/host/tcp.c
|
|
Hannes Reinecke |
1412d5 |
+++ b/drivers/nvme/host/tcp.c
|
|
Hannes Reinecke |
1412d5 |
@@ -2271,7 +2271,7 @@ static blk_status_t nvme_tcp_setup_cmd_pdu(struct nvme_ns *ns,
|
|
Hannes Reinecke |
1412d5 |
req->data_len = blk_rq_nr_phys_segments(rq) ?
|
|
Hannes Reinecke |
1412d5 |
blk_rq_payload_bytes(rq) : 0;
|
|
Hannes Reinecke |
1412d5 |
req->curr_bio = rq->bio;
|
|
Hannes Reinecke |
1412d5 |
- if (req->curr_bio)
|
|
Hannes Reinecke |
1412d5 |
+ if (req->curr_bio && req->data_len)
|
|
Hannes Reinecke |
1412d5 |
nvme_tcp_init_iter(req, rq_data_dir(rq));
|
|
Hannes Reinecke |
1412d5 |
|
|
Hannes Reinecke |
1412d5 |
if (rq_data_dir(rq) == WRITE &&
|
|
Hannes Reinecke |
1412d5 |
--
|
|
Hannes Reinecke |
1412d5 |
2.29.2
|
|
Hannes Reinecke |
1412d5 |
|