| From: Christoph Hellwig <hch@lst.de> |
| Subject: zram-fix-synchronous-reads-fix |
| Date: Fri, 7 Apr 2023 09:22:24 +0200 |
| |
| turns out this doesn't even compile for PAGE_SIZE > 4096. |
| |
| Below is the fix, which also removes the #if and instead relies |
| on compiler dead code elimination. I wonder if zram should (maybe |
| optionally) also offer a 512 byte block size, so that we could |
| also test the smaller than page size I/O path even on x86. |
| |
| Link: https://lkml.kernel.org/r/20230407072224.GA8982@lst.de |
| Signed-off-by: Christoph Hellwig <hch@lst.de> |
| Reviewed-by: Sergey Senozhatsky <senozhatsky@chromium.org> |
| Cc: Jens Axboe <axboe@kernel.dk> |
| Cc: Minchan Kim <minchan@kernel.org> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| --- |
| |
| drivers/block/zram/zram_drv.c | 14 ++++---------- |
| 1 file changed, 4 insertions(+), 10 deletions(-) |
| |
| --- a/drivers/block/zram/zram_drv.c~zram-fix-synchronous-reads-fix |
| +++ a/drivers/block/zram/zram_drv.c |
| @@ -764,7 +764,6 @@ release_init_lock: |
| return ret; |
| } |
| |
| -#if PAGE_SIZE != 4096 |
| struct zram_work { |
| struct work_struct work; |
| struct zram *zram; |
| @@ -775,7 +774,7 @@ struct zram_work { |
| static void zram_sync_read(struct work_struct *work) |
| { |
| struct zram_work *zw = container_of(work, struct zram_work, work); |
| - struct bio_bvec bv; |
| + struct bio_vec bv; |
| struct bio bio; |
| |
| bio_init(&bio, zw->zram->bdev, &bv, 1, REQ_OP_READ); |
| @@ -794,6 +793,9 @@ static int read_from_bdev_sync(struct zr |
| { |
| struct zram_work work; |
| |
| + if (WARN_ON_ONCE(PAGE_SIZE != 4096)) |
| + return -EIO; |
| + |
| work.page = page; |
| work.zram = zram; |
| work.entry = entry; |
| @@ -805,14 +807,6 @@ static int read_from_bdev_sync(struct zr |
| |
| return 1; |
| } |
| -#else |
| -static int read_from_bdev_sync(struct zram *zram, struct page *page, |
| - unsigned long entry) |
| -{ |
| - WARN_ON(1); |
| - return -EIO; |
| -} |
| -#endif |
| |
| static int read_from_bdev(struct zram *zram, struct page *page, |
| unsigned long entry, struct bio *parent) |
| _ |