--- a/fs/f2fs/extent_cache.c +++ b/fs/f2fs/extent_cache.c @@ -652,9 +652,12 @@ static struct extent_node *__insert_extent_tree(struct f2fs_sb_info *sbi, p = f2fs_lookup_rb_tree_for_insert(sbi, &et->root, &parent, ei->fofs, &leftmost); do_insert: + if (!mutex_trylock(&eti->extent_tree_lock)) + return NULL; + en = __attach_extent_node(sbi, et, ei, parent, p, leftmost); if (!en) - return NULL; + goto out; __try_update_largest_extent(et, en); @@ -663,6 +666,8 @@ static struct extent_node *__insert_extent_tree(struct f2fs_sb_info *sbi, list_add_tail(&en->list, &eti->extent_list); et->cached_en = en; spin_unlock(&eti->extent_lock); +out: + mutex_unlock(&eti->extent_tree_lock); return en; }