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

Commit 34ba94ba authored by Jaegeuk Kim's avatar Jaegeuk Kim
Browse files

f2fs: do not make dirty any inmemory pages



This patch let inmemory pages be clean all the time.

Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
parent f4ca536f
Loading
Loading
Loading
Loading
+7 −4
Original line number Diff line number Diff line
@@ -1052,9 +1052,6 @@ static int f2fs_write_end(struct file *file,

	trace_f2fs_write_end(inode, pos, len, copied);

	if (f2fs_is_atomic_file(inode) || f2fs_is_volatile_file(inode))
		register_inmem_page(inode, page);
	else
	set_page_dirty(page);

	if (pos + copied > i_size_read(inode)) {
@@ -1138,6 +1135,12 @@ static int f2fs_set_data_page_dirty(struct page *page)
	trace_f2fs_set_page_dirty(page, DATA);

	SetPageUptodate(page);

	if (f2fs_is_atomic_file(inode) || f2fs_is_volatile_file(inode)) {
		register_inmem_page(inode, page);
		return 1;
	}

	mark_inode_dirty(inode);

	if (!PageDirty(page)) {
+1 −0
Original line number Diff line number Diff line
@@ -269,6 +269,7 @@ struct f2fs_inode_info {
	struct extent_info ext;		/* in-memory extent cache entry */
	struct dir_inode_entry *dirty_dir;	/* the pointer of dirty dir */

	struct radix_tree_root inmem_root;	/* radix tree for inmem pages */
	struct list_head inmem_pages;	/* inmemory pages managed by f2fs */
	struct mutex inmem_lock;	/* lock for inmemory pages */
};
+13 −1
Original line number Diff line number Diff line
@@ -178,7 +178,8 @@ void register_inmem_page(struct inode *inode, struct page *page)
{
	struct f2fs_inode_info *fi = F2FS_I(inode);
	struct inmem_pages *new;

	int err;
retry:
	new = f2fs_kmem_cache_alloc(inmem_entry_slab, GFP_NOFS);

	/* add atomic page indices to the list */
@@ -187,6 +188,16 @@ void register_inmem_page(struct inode *inode, struct page *page)

	/* increase reference count with clean state */
	mutex_lock(&fi->inmem_lock);
	err = radix_tree_insert(&fi->inmem_root, page->index, new);
	if (err == -EEXIST) {
		mutex_unlock(&fi->inmem_lock);
		kmem_cache_free(inmem_entry_slab, new);
		return;
	} else if (err) {
		mutex_unlock(&fi->inmem_lock);
		kmem_cache_free(inmem_entry_slab, new);
		goto retry;
	}
	get_page(page);
	list_add_tail(&new->list, &fi->inmem_pages);
	mutex_unlock(&fi->inmem_lock);
@@ -216,6 +227,7 @@ void commit_inmem_pages(struct inode *inode, bool abort)
			do_write_data_page(cur->page, &fio);
			submit_bio = true;
		}
		radix_tree_delete(&fi->inmem_root, cur->page->index);
		f2fs_put_page(cur->page, 1);
		list_del(&cur->list);
		kmem_cache_free(inmem_entry_slab, cur);
+1 −0
Original line number Diff line number Diff line
@@ -373,6 +373,7 @@ static struct inode *f2fs_alloc_inode(struct super_block *sb)
	fi->i_advise = 0;
	rwlock_init(&fi->ext.ext_lock);
	init_rwsem(&fi->i_sem);
	INIT_RADIX_TREE(&fi->inmem_root, GFP_NOFS);
	INIT_LIST_HEAD(&fi->inmem_pages);
	mutex_init(&fi->inmem_lock);