static unsigned int __free_extent_tree(struct f2fs_sb_info *sbi, struct extent_tree *et, bool free_all) { struct rb_node *node, *next; struct extent_node *en; unsigned int count = et->count; node = rb_first(&et->root); while (node) { next = rb_next(node); en = rb_entry(node, struct extent_node, rb_node); if (free_all) { spin_lock(&sbi->extent_lock); if (!list_empty(&en->list)) list_del_init(&en->list); spin_unlock(&sbi->extent_lock); } if (free_all || list_empty(&en->list)) { __detach_extent_node(sbi, et, en); kmem_cache_free(extent_node_slab, en); } node = next; } return count - et->count; }
/* * Flow to release an extent_node: * 1. list_del_init * 2. __detach_extent_node * 3. kmem_cache_free. */ static void __release_extent_node(struct f2fs_sb_info *sbi, struct extent_tree *et, struct extent_node *en) { spin_lock(&sbi->extent_lock); f2fs_bug_on(sbi, list_empty(&en->list)); list_del_init(&en->list); spin_unlock(&sbi->extent_lock); __detach_extent_node(sbi, et, en); }