On 2022/5/30 9:02, Jack Qiu wrote:
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.
I guess something like those pages were pinned by adding extra
reference, and find_lock_page() should never miss them...
> If it is true, maybe use f2fs_bug_on(sbi, !page) is better?
I think so.
Thanks,
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