Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cbcb2872 authored by Jaegeuk Kim's avatar Jaegeuk Kim
Browse files

f2fs: invalidate inmemory page



If user truncates file's data, we should truncate inmemory pages too.

Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
parent 34ba94ba
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -1116,6 +1116,9 @@ static void f2fs_invalidate_data_page(struct page *page, unsigned int offset,
	if (offset % PAGE_CACHE_SIZE || length != PAGE_CACHE_SIZE)
		return;

	if (f2fs_is_atomic_file(inode) || f2fs_is_volatile_file(inode))
		invalidate_inmem_page(inode, page);

	if (PageDirty(page))
		inode_dec_dirty_pages(inode);
	ClearPagePrivate(page);
+1 −0
Original line number Diff line number Diff line
@@ -1297,6 +1297,7 @@ void destroy_node_manager_caches(void);
 * segment.c
 */
void register_inmem_page(struct inode *, struct page *);
void invalidate_inmem_page(struct inode *, struct page *);
void commit_inmem_pages(struct inode *, bool);
void f2fs_balance_fs(struct f2fs_sb_info *);
void f2fs_balance_fs_bg(struct f2fs_sb_info *);
+16 −0
Original line number Diff line number Diff line
@@ -203,6 +203,22 @@ void register_inmem_page(struct inode *inode, struct page *page)
	mutex_unlock(&fi->inmem_lock);
}

void invalidate_inmem_page(struct inode *inode, struct page *page)
{
	struct f2fs_inode_info *fi = F2FS_I(inode);
	struct inmem_pages *cur;

	mutex_lock(&fi->inmem_lock);
	cur = radix_tree_lookup(&fi->inmem_root, page->index);
	if (cur) {
		radix_tree_delete(&fi->inmem_root, cur->page->index);
		f2fs_put_page(cur->page, 0);
		list_del(&cur->list);
		kmem_cache_free(inmem_entry_slab, cur);
	}
	mutex_unlock(&fi->inmem_lock);
}

void commit_inmem_pages(struct inode *inode, bool abort)
{
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);