On 2022/5/29 14:58, Chao Yu wrote: > On 2022/5/28 17:35, Jack Qiu via Linux-f2fs-devel wrote: >> When find_lock_page return error, page in [i, page_len) will leak. > > I doubt it is impossible to fail in find_lock_page due to one extra > reference count was added in previous read_cache_page().
Thanks for review. I'm not sure about it with limited knowledge. If it is true, maybe use f2fs_bug_on(sbi, !page) is better? > > Thanks, > >> >> 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 > . _______________________________________________ Linux-f2fs-devel mailing list Linux-f2fs-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel