[Devel] [PATCH rh7] ploop: Do not try to update index after REQ_DISCARD in raw format

Kirill Tkhai ktkhai at virtuozzo.com
Tue Dec 31 15:39:37 MSK 2019


Otherwise panic may occur (unexisting .allocate_complete method will be called):

BUG: unable to handle kernel NULL pointer dereference at           (null)
IP: [<          (null)>]           (null)
PGD 0
Oops: 0010 [#1] SMP
task: ffff8e6641402000 ti: ffff8e6766b38000 task.ti: ffff8e6766b38000
RIP: 0010:[<0000000000000000>]  [<          (null)>]           (null)
RSP: 0018:ffff8e6766b3bda0  EFLAGS: 00010297
RAX: 0000000000000000 RBX: ffff8e6760fd7000 RCX: ffff8e6760fd70d0
RDX: ffff8e664108aa00 RSI: ffff8e6760fd7000 RDI: ffff8e664108aa00
RBP: ffff8e6766b3be20 R08: ffff8e6760fd7000 R09: ffffffffc036352a
R10: ffff8e677fdb07e0 R11: ffffdeee48dc74c0 R12: ffff8e66e5fda1d8
R13: ffffffffa638c400 R14: 0000000000000000 R15: 0000000000000000
FS:  0000000000000000(0000) GS:ffff8e677fd80000(0000) knlGS:0000000000000000
CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: 0000000000000000 CR3: 00000000bafac000 CR4: 00000000007626e0
DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
PKRU: 55555554
Call Trace:
? ploop_req_state_process+0x888/0xe10 [ploop]
? ploop_wait+0x155/0x1b0 [ploop]
? ploop_bio_queue+0x17b/0x6a0 [ploop]
ploop_thread+0x23d/0x4f0 [ploop]
? ploop_req_state_process+0xe10/0xe10 [ploop]
kthread+0xd1/0xe0
? create_kthread+0x60/0x60
ret_from_fork_nospec_begin+0x7/0x21
? create_kthread+0x60/0x60
Code:  Bad RIP value
RIP  [<          (null)>]           (null)
 RSP <ffff8e6766b3bda0>
CR2: 0000000000000000

Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
---
 drivers/block/ploop/dev.c |    3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/block/ploop/dev.c b/drivers/block/ploop/dev.c
index b2675388ae03..2029703020e4 100644
--- a/drivers/block/ploop/dev.c
+++ b/drivers/block/ploop/dev.c
@@ -2474,7 +2474,8 @@ ploop_entry_request(struct ploop_request * preq)
 					spin_unlock_irq(&plo->lock);
 				}
 				preq->iblock = iblk;
-				if (!(preq->req_rw & REQ_DISCARD))
+				if (!(preq->req_rw & REQ_DISCARD) ||
+				    (delta->ops->capability & PLOOP_FMT_CAP_IDENTICAL))
 					preq->eng_state = PLOOP_E_COMPLETE;
 				else
 					preq->eng_state = PLOOP_E_DATA_WBI;




More information about the Devel mailing list