When find_lock_page return error, page in [i, page_len) will leak. Signed-off-by: Jack Qiu <jack....@huawei.com> --- fs/f2fs/file.c | 13 +++++++++++++ 1 file changed, 13 insertions(+)
diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c index 100637b1adb3..0e8938c5918e 100644 --- a/fs/f2fs/file.c +++ b/fs/f2fs/file.c @@ -3954,6 +3954,12 @@ static int redirty_blocks(struct inode *inode, pgoff_t page_idx, int len) struct page *page; pgoff_t redirty_idx = page_idx; int i, page_len = 0, ret = 0; + struct page **pages; + + pages = f2fs_kvzalloc(F2FS_I_SB(inode), + sizeof(struct page *) * len, GFP_NOFS); + if (!pages) + return -ENOMEM; page_cache_ra_unbounded(&ractl, len, 0); @@ -3964,6 +3970,7 @@ static int redirty_blocks(struct inode *inode, pgoff_t page_idx, int len) break; } page_len++; + pages[i] = page; } for (i = 0; i < page_len; i++, redirty_idx++) { @@ -3975,8 +3982,14 @@ static int redirty_blocks(struct inode *inode, pgoff_t page_idx, int len) set_page_dirty(page); f2fs_put_page(page, 1); f2fs_put_page(page, 0); + pages[i] = NULL; } + /* put pages[i, page_len) when error happens */ + for (; ret < 0 && i < page_len; i++) + f2fs_put_page(pages[i], 0); + kvfree(pages); + return ret; } -- 2.31.1 _______________________________________________ Linux-f2fs-devel mailing list Linux-f2fs-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel