f2fs: check its block allocation to avoid producing wrong dirty pages
authorJaegeuk Kim <jaegeuk@kernel.org>
Thu, 26 Feb 2015 03:54:48 +0000 (19:54 -0800)
committerJaegeuk Kim <jaegeuk@kernel.org>
Fri, 10 Apr 2015 22:08:27 +0000 (15:08 -0700)
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 <jaegeuk@kernel.org>
fs/f2fs/data.c

index 62e31b2aa131b823117441b93bd017d8b5753508..389fda772e69fae8c636543c67dc5b7a1db0f697 100644 (file)
@@ -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;