diff mbox series

[2/2] zram: fix broken page writeback

Message ID 20210312173949.2197662-2-minchan@kernel.org
State Accepted
Commit 2766f1821600cc7562bae2128ad0b163f744c5d9
Headers show
Series None | expand

Commit Message

Minchan Kim March 12, 2021, 5:39 p.m. UTC
commit 0d8359620d9b ("zram: support page writeback") introduced
two problems. It overwrites writeback_store's return value as
kstrtol's return value, which makes return value zero so user
could see zero as return value of write syscall even though it
wrote data successfully.

It also breaks index value in the loop in that it doesn't
increase the index any longer. It means it can write only
first starting block index so user couldn't write all idle
pages in the zram so lose memory saving chance.

This patch fixes those issues.

Cc: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
Cc: stable@vger.kernel.org
Reported-by: Amos Bianchi <amosbianchi@google.com>
Fixes: 0d8359620d9b("zram: support page writeback")
Signed-off-by: Minchan Kim <minchan@kernel.org>
---
 drivers/block/zram/zram_drv.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)
diff mbox series

Patch

diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c
index 63bbefdffc81..cf8deecc39ef 100644
--- a/drivers/block/zram/zram_drv.c
+++ b/drivers/block/zram/zram_drv.c
@@ -638,8 +638,8 @@  static ssize_t writeback_store(struct device *dev,
 		if (strncmp(buf, PAGE_WB_SIG, sizeof(PAGE_WB_SIG) - 1))
 			return -EINVAL;
 
-		ret = kstrtol(buf + sizeof(PAGE_WB_SIG) - 1, 10, &index);
-		if (ret || index >= nr_pages)
+		if (kstrtol(buf + sizeof(PAGE_WB_SIG) - 1, 10, &index) ||
+				index >= nr_pages)
 			return -EINVAL;
 
 		nr_pages = 1;
@@ -663,7 +663,7 @@  static ssize_t writeback_store(struct device *dev,
 		goto release_init_lock;
 	}
 
-	while (nr_pages--) {
+	for (; nr_pages != 0; index++, nr_pages--) {
 		struct bio_vec bvec;
 
 		bvec.bv_page = page;