Commit 078cad82 authored by Jaegeuk Kim's avatar Jaegeuk Kim
Browse files

f2fs: drop inode from the donation list when the last file is closed



Let's drop the inode from the donation list when there is no other
open file.

Reviewed-by: default avatarChao Yu <chao@kernel.org>
Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
parent c8705cef
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -876,6 +876,7 @@ struct f2fs_inode_info {
	/* linked in global inode list for cache donation */
	struct list_head gdonate_list;
	pgoff_t donate_start, donate_end; /* inclusive */
	atomic_t open_count;		/* # of open files */

	struct task_struct *atomic_write_task;	/* store atomic write task */
	struct extent_tree *extent_tree[NR_EXTENT_CACHES];
@@ -3652,6 +3653,7 @@ int f2fs_try_to_free_nats(struct f2fs_sb_info *sbi, int nr_shrink);
void f2fs_update_inode(struct inode *inode, struct folio *node_folio);
void f2fs_update_inode_page(struct inode *inode);
int f2fs_write_inode(struct inode *inode, struct writeback_control *wbc);
void f2fs_remove_donate_inode(struct inode *inode);
void f2fs_evict_inode(struct inode *inode);
void f2fs_handle_failed_inode(struct inode *inode);

+7 −1
Original line number Diff line number Diff line
@@ -628,7 +628,10 @@ static int f2fs_file_open(struct inode *inode, struct file *filp)
	if (err)
		return err;

	return finish_preallocate_blocks(inode);
	err = finish_preallocate_blocks(inode);
	if (!err)
		atomic_inc(&F2FS_I(inode)->open_count);
	return err;
}

void f2fs_truncate_data_blocks_range(struct dnode_of_data *dn, int count)
@@ -2037,6 +2040,9 @@ static long f2fs_fallocate(struct file *file, int mode,

static int f2fs_release_file(struct inode *inode, struct file *filp)
{
	if (atomic_dec_and_test(&F2FS_I(inode)->open_count))
		f2fs_remove_donate_inode(inode);

	/*
	 * f2fs_release_file is called at every close calls. So we should
	 * not drop any inmemory pages by close called by other process.
+1 −1
Original line number Diff line number Diff line
@@ -821,7 +821,7 @@ int f2fs_write_inode(struct inode *inode, struct writeback_control *wbc)
	return 0;
}

static void f2fs_remove_donate_inode(struct inode *inode)
void f2fs_remove_donate_inode(struct inode *inode)
{
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);

+1 −0
Original line number Diff line number Diff line
@@ -1701,6 +1701,7 @@ static struct inode *f2fs_alloc_inode(struct super_block *sb)
	/* Initialize f2fs-specific inode info */
	atomic_set(&fi->dirty_pages, 0);
	atomic_set(&fi->i_compr_blocks, 0);
	atomic_set(&fi->open_count, 0);
	init_f2fs_rwsem(&fi->i_sem);
	spin_lock_init(&fi->i_size_lock);
	INIT_LIST_HEAD(&fi->dirty_list);