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

Commit 50d9025b authored by Zhang Qilong's avatar Zhang Qilong Committed by Jaegeuk Kim
Browse files

f2fs: fix race condition on setting FI_NO_EXTENT flag



The following scenarios exist.
process A:               process B:
->f2fs_drop_extent_tree  ->f2fs_update_extent_cache_range
                          ->f2fs_update_extent_tree_range
                           ->write_lock
 ->set_inode_flag
                           ->is_inode_flag_set
                           ->__free_extent_tree // Shouldn't
                                                // have been
                                                // cleaned up
                                                // here
  ->write_lock

In this case, the "FI_NO_EXTENT" flag is set between
f2fs_update_extent_tree_range and is_inode_flag_set
by other process. it leads to clearing the whole exten
tree which should not have happened. And we fix it by
move the setting it to the range of write_lock.

Fixes:5f281fab ("f2fs: disable extent_cache for fcollapse/finsert inodes")
Signed-off-by: default avatarZhang Qilong <zhangqilong3@huawei.com>
Reviewed-by: default avatarChao Yu <chao@kernel.org>
Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
parent c5151e43
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -804,9 +804,8 @@ void f2fs_drop_extent_tree(struct inode *inode)
	if (!f2fs_may_extent_tree(inode))
		return;

	set_inode_flag(inode, FI_NO_EXTENT);

	write_lock(&et->lock);
	set_inode_flag(inode, FI_NO_EXTENT);
	__free_extent_tree(sbi, et);
	if (et->largest.len) {
		et->largest.len = 0;