As reported by Qu Wenruo, the following getconf PAGESIZE 65536 blkdiscard -p 4k /dev/zram0 takes literally forever to complete. zram doesn't support partial discards and just returns immediately w/o doing any discard work in such cases. The problem is that we forget to endio on our way out, so blkdiscard sleeps forever in submit_bio_wait(). Fix this by adding a missing bio_endio() call. Fixes: 0120dd6e4e202 ("zram: make zram_bio_discard more self-contained") Signed-off-by: Sergey Senozhatsky Reported-by: Qu Wenruo Closes: https://lore.kernel.org/linux-block/92361cd3-fb8b-482e-bc89-15ff1acb9a59@suse.com Cc: Christoph Hellwig --- drivers/block/zram/zram_drv.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index dcea703a6766..b0637423953b 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c @@ -2683,8 +2683,10 @@ static void zram_bio_discard(struct zram *zram, struct bio *bio) * skipping this logical block is appropriate here. */ if (offset) { - if (n <= (PAGE_SIZE - offset)) + if (n <= (PAGE_SIZE - offset)) { + bio_endio(bio); return; + } n -= (PAGE_SIZE - offset); index++; -- 2.53.0.1018.g2bb0e51243-goog