f2fs: check its block allocation to avoid producing wrong dirty pages

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>
This commit is contained in:
Jaegeuk Kim 2015-02-25 19:54:48 -08:00
parent 2bca1e2388
commit b7f204cca4
1 changed files with 9 additions and 1 deletions

View 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;