|
@@ -1115,20 +1115,28 @@ static ssize_t f2fs_direct_IO(int rw, struct kiocb *iocb,
|
|
|
return err;
|
|
|
}
|
|
|
|
|
|
-static void f2fs_invalidate_data_page(struct page *page, unsigned int offset,
|
|
|
- unsigned int length)
|
|
|
+void f2fs_invalidate_page(struct page *page, unsigned int offset,
|
|
|
+ unsigned int length)
|
|
|
{
|
|
|
struct inode *inode = page->mapping->host;
|
|
|
+ struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
|
|
|
|
|
|
- if (offset % PAGE_CACHE_SIZE || length != PAGE_CACHE_SIZE)
|
|
|
+ if (inode->i_ino >= F2FS_ROOT_INO(sbi) &&
|
|
|
+ (offset % PAGE_CACHE_SIZE || length != PAGE_CACHE_SIZE))
|
|
|
return;
|
|
|
|
|
|
- if (PageDirty(page))
|
|
|
- inode_dec_dirty_pages(inode);
|
|
|
+ if (PageDirty(page)) {
|
|
|
+ if (inode->i_ino == F2FS_META_INO(sbi))
|
|
|
+ dec_page_count(sbi, F2FS_DIRTY_META);
|
|
|
+ else if (inode->i_ino == F2FS_NODE_INO(sbi))
|
|
|
+ dec_page_count(sbi, F2FS_DIRTY_NODES);
|
|
|
+ else
|
|
|
+ inode_dec_dirty_pages(inode);
|
|
|
+ }
|
|
|
ClearPagePrivate(page);
|
|
|
}
|
|
|
|
|
|
-static int f2fs_release_data_page(struct page *page, gfp_t wait)
|
|
|
+int f2fs_release_page(struct page *page, gfp_t wait)
|
|
|
{
|
|
|
/* If this is dirty page, keep PagePrivate */
|
|
|
if (PageDirty(page))
|
|
@@ -1183,8 +1191,8 @@ const struct address_space_operations f2fs_dblock_aops = {
|
|
|
.write_begin = f2fs_write_begin,
|
|
|
.write_end = f2fs_write_end,
|
|
|
.set_page_dirty = f2fs_set_data_page_dirty,
|
|
|
- .invalidatepage = f2fs_invalidate_data_page,
|
|
|
- .releasepage = f2fs_release_data_page,
|
|
|
+ .invalidatepage = f2fs_invalidate_page,
|
|
|
+ .releasepage = f2fs_release_page,
|
|
|
.direct_IO = f2fs_direct_IO,
|
|
|
.bmap = f2fs_bmap,
|
|
|
};
|