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

Reply via email to