If a page is cached but its block was deallocated, we don't need to make
the page dirty again by gc and truncate_partial_data_page.

In that case, it needs to check its block allocation all the time instead
of giving up-to-date page.

Signed-off-by: Jaegeuk Kim <[email protected]>
---
 fs/f2fs/data.c | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c
index 62e31b2..389fda7 100644
--- a/fs/f2fs/data.c
+++ b/fs/f2fs/data.c
@@ -813,11 +813,19 @@ struct page *find_data_page(struct inode *inode, pgoff_t 
index, bool sync)
                .rw = sync ? READ_SYNC : READA,
        };
 
+       /*
+        * If sync is false, it needs to check its block allocation.
+        * This is need and triggered by two flows:
+        *   gc and truncate_partial_data_page.
+        */
+       if (!sync)
+               goto search;
+
        page = find_get_page(mapping, index);
        if (page && PageUptodate(page))
                return page;
        f2fs_put_page(page, 0);
-
+search:
        if (f2fs_lookup_extent_cache(inode, index, &ei)) {
                dn.data_blkaddr = ei.blk + index - ei.fofs;
                goto got_it;
-- 
2.1.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to