]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
zram: do not forget to endio for partial discard requests
authorSergey Senozhatsky <senozhatsky@chromium.org>
Tue, 31 Mar 2026 07:42:44 +0000 (16:42 +0900)
committerAndrew Morton <akpm@linux-foundation.org>
Sat, 18 Apr 2026 07:10:52 +0000 (00:10 -0700)
As reported by Qu Wenruo and Avinesh Kumar, 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 jumping to
end_bio label, which does bio_endio().

Link: https://lore.kernel.org/20260331074255.777019-1-senozhatsky@chromium.org
Fixes: 0120dd6e4e20 ("zram: make zram_bio_discard more self-contained")
Signed-off-by: Sergey Senozhatsky <senozhatsky@chromium.org>
Reported-by: Qu Wenruo <wqu@suse.com>
Closes: https://lore.kernel.org/linux-block/92361cd3-fb8b-482e-bc89-15ff1acb9a59@suse.com
Tested-by: Qu Wenruo <wqu@suse.com>
Reported-by: Avinesh Kumar <avinesh.kumar@suse.com>
Closes: https://bugzilla.suse.com/show_bug.cgi?id=1256530
Reviewed-by: Christoph Hellwig <hch@lst.de>
Cc: Brian Geffon <bgeffon@google.com>
Cc: Jens Axboe <axboe@kernel.dk>
Cc: Minchan Kim <minchan@kernel.org>
Cc: <stable@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
drivers/block/zram/zram_drv.c

index c2afd1c34f4a6f6faa03fc95b6ee18e37cdb0383..43b68fdd95d6df79f39fd95646119b22e52869ba 100644 (file)
@@ -2678,7 +2678,7 @@ static void zram_bio_discard(struct zram *zram, struct bio *bio)
         */
        if (offset) {
                if (n <= (PAGE_SIZE - offset))
-                       return;
+                       goto end_bio;
 
                n -= (PAGE_SIZE - offset);
                index++;
@@ -2693,6 +2693,7 @@ static void zram_bio_discard(struct zram *zram, struct bio *bio)
                n -= PAGE_SIZE;
        }
 
+end_bio:
        bio_endio(bio);
 }