Lines Matching full:wc
4748 struct walk_control *wc, in reada_walk_down() argument
4763 if (path->slots[wc->level] < wc->reada_slot) { in reada_walk_down()
4764 wc->reada_count = wc->reada_count * 2 / 3; in reada_walk_down()
4765 wc->reada_count = max(wc->reada_count, 2); in reada_walk_down()
4767 wc->reada_count = wc->reada_count * 3 / 2; in reada_walk_down()
4768 wc->reada_count = min_t(int, wc->reada_count, in reada_walk_down()
4772 eb = path->nodes[wc->level]; in reada_walk_down()
4775 for (slot = path->slots[wc->level]; slot < nritems; slot++) { in reada_walk_down()
4776 if (nread >= wc->reada_count) in reada_walk_down()
4783 if (slot == path->slots[wc->level]) in reada_walk_down()
4786 if (wc->stage == UPDATE_BACKREF && in reada_walk_down()
4792 wc->level - 1, 1, &refs, in reada_walk_down()
4799 if (wc->stage == DROP_REFERENCE) { in reada_walk_down()
4803 if (wc->level == 1 && in reada_walk_down()
4806 if (!wc->update_ref || in reada_walk_down()
4811 &wc->update_progress); in reada_walk_down()
4815 if (wc->level == 1 && in reada_walk_down()
4823 wc->reada_slot = slot; in reada_walk_down()
4829 * when wc->stage == UPDATE_BACKREF, this function updates
4837 struct walk_control *wc, int lookup_info) in walk_down_proc() argument
4840 int level = wc->level; in walk_down_proc()
4845 if (wc->stage == UPDATE_BACKREF && in walk_down_proc()
4854 ((wc->stage == DROP_REFERENCE && wc->refs[level] != 1) || in walk_down_proc()
4855 (wc->stage == UPDATE_BACKREF && !(wc->flags[level] & flag)))) { in walk_down_proc()
4859 &wc->refs[level], in walk_down_proc()
4860 &wc->flags[level]); in walk_down_proc()
4864 BUG_ON(wc->refs[level] == 0); in walk_down_proc()
4867 if (wc->stage == DROP_REFERENCE) { in walk_down_proc()
4868 if (wc->refs[level] > 1) in walk_down_proc()
4871 if (path->locks[level] && !wc->keep_locks) { in walk_down_proc()
4878 /* wc->stage == UPDATE_BACKREF */ in walk_down_proc()
4879 if (!(wc->flags[level] & flag)) { in walk_down_proc()
4888 wc->flags[level] |= flag; in walk_down_proc()
4932 * when wc->stage == DROP_REFERENCE, this function checks
4935 * rooted at the block, this function changes wc->stage to
4945 struct walk_control *wc, int *lookup_info) in do_walk_down() argument
4955 int level = wc->level; in do_walk_down()
4967 if (wc->stage == UPDATE_BACKREF && in do_walk_down()
4991 &wc->refs[level - 1], in do_walk_down()
4992 &wc->flags[level - 1]); in do_walk_down()
4996 if (unlikely(wc->refs[level - 1] == 0)) { in do_walk_down()
5003 if (wc->stage == DROP_REFERENCE) { in do_walk_down()
5004 if (wc->refs[level - 1] > 1) { in do_walk_down()
5007 (wc->flags[0] & BTRFS_BLOCK_FLAG_FULL_BACKREF)) in do_walk_down()
5010 if (!wc->update_ref || in do_walk_down()
5016 ret = btrfs_comp_cpu_keys(&key, &wc->update_progress); in do_walk_down()
5020 wc->stage = UPDATE_BACKREF; in do_walk_down()
5021 wc->shared_level = level - 1; in do_walk_down()
5025 (wc->flags[0] & BTRFS_BLOCK_FLAG_FULL_BACKREF)) in do_walk_down()
5038 reada_walk_down(trans, root, wc, path); in do_walk_down()
5061 wc->level = level; in do_walk_down()
5062 if (wc->level == 1) in do_walk_down()
5063 wc->reada_slot = 0; in do_walk_down()
5066 wc->refs[level - 1] = 0; in do_walk_down()
5067 wc->flags[level - 1] = 0; in do_walk_down()
5068 if (wc->stage == DROP_REFERENCE) { in do_walk_down()
5069 if (wc->flags[level] & BTRFS_BLOCK_FLAG_FULL_BACKREF) { in do_walk_down()
5090 if (wc->restarted) { in do_walk_down()
5098 wc->restarted = 0; in do_walk_down()
5123 wc->drop_level = level; in do_walk_down()
5124 find_next_key(path, level, &wc->drop_progress); in do_walk_down()
5147 * when wc->stage == DROP_REFERENCE, this function drops
5150 * when wc->stage == UPDATE_BACKREF, this function changes
5151 * wc->stage back to DROP_REFERENCE if we changed wc->stage
5159 struct walk_control *wc) in walk_up_proc() argument
5163 int level = wc->level; in walk_up_proc()
5167 if (wc->stage == UPDATE_BACKREF) { in walk_up_proc()
5168 BUG_ON(wc->shared_level < level); in walk_up_proc()
5169 if (level < wc->shared_level) in walk_up_proc()
5172 ret = find_next_key(path, level + 1, &wc->update_progress); in walk_up_proc()
5174 wc->update_ref = 0; in walk_up_proc()
5176 wc->stage = DROP_REFERENCE; in walk_up_proc()
5177 wc->shared_level = -1; in walk_up_proc()
5193 &wc->refs[level], in walk_up_proc()
5194 &wc->flags[level]); in walk_up_proc()
5200 BUG_ON(wc->refs[level] == 0); in walk_up_proc()
5201 if (wc->refs[level] == 1) { in walk_up_proc()
5209 /* wc->stage == DROP_REFERENCE */ in walk_up_proc()
5210 BUG_ON(wc->refs[level] > 1 && !path->locks[level]); in walk_up_proc()
5212 if (wc->refs[level] == 1) { in walk_up_proc()
5214 if (wc->flags[level] & BTRFS_BLOCK_FLAG_FULL_BACKREF) in walk_up_proc()
5239 if (wc->flags[level] & BTRFS_BLOCK_FLAG_FULL_BACKREF) in walk_up_proc()
5244 if (wc->flags[level + 1] & BTRFS_BLOCK_FLAG_FULL_BACKREF) in walk_up_proc()
5251 btrfs_free_tree_block(trans, root, eb, parent, wc->refs[level] == 1); in walk_up_proc()
5253 wc->refs[level] = 0; in walk_up_proc()
5254 wc->flags[level] = 0; in walk_up_proc()
5266 struct walk_control *wc) in walk_down_tree() argument
5268 int level = wc->level; in walk_down_tree()
5273 ret = walk_down_proc(trans, root, path, wc, lookup_info); in walk_down_tree()
5284 ret = do_walk_down(trans, root, path, wc, &lookup_info); in walk_down_tree()
5290 level = wc->level; in walk_down_tree()
5298 struct walk_control *wc, int max_level) in walk_up_tree() argument
5300 int level = wc->level; in walk_up_tree()
5305 wc->level = level; in walk_up_tree()
5311 ret = walk_up_proc(trans, root, path, wc); in walk_up_tree()
5350 struct walk_control *wc; in btrfs_drop_snapshot() local
5365 wc = kzalloc(sizeof(*wc), GFP_NOFS); in btrfs_drop_snapshot()
5366 if (!wc) { in btrfs_drop_snapshot()
5404 memset(&wc->update_progress, 0, in btrfs_drop_snapshot()
5405 sizeof(wc->update_progress)); in btrfs_drop_snapshot()
5408 memcpy(&wc->update_progress, &key, in btrfs_drop_snapshot()
5409 sizeof(wc->update_progress)); in btrfs_drop_snapshot()
5436 level, 1, &wc->refs[level], in btrfs_drop_snapshot()
5437 &wc->flags[level]); in btrfs_drop_snapshot()
5442 BUG_ON(wc->refs[level] == 0); in btrfs_drop_snapshot()
5449 WARN_ON(wc->refs[level] != 1); in btrfs_drop_snapshot()
5454 wc->restarted = test_bit(BTRFS_ROOT_DEAD_TREE, &root->state); in btrfs_drop_snapshot()
5455 wc->level = level; in btrfs_drop_snapshot()
5456 wc->shared_level = -1; in btrfs_drop_snapshot()
5457 wc->stage = DROP_REFERENCE; in btrfs_drop_snapshot()
5458 wc->update_ref = update_ref; in btrfs_drop_snapshot()
5459 wc->keep_locks = 0; in btrfs_drop_snapshot()
5460 wc->reada_count = BTRFS_NODEPTRS_PER_BLOCK(fs_info); in btrfs_drop_snapshot()
5464 ret = walk_down_tree(trans, root, path, wc); in btrfs_drop_snapshot()
5470 ret = walk_up_tree(trans, root, path, wc, BTRFS_MAX_LEVEL); in btrfs_drop_snapshot()
5477 BUG_ON(wc->stage != DROP_REFERENCE); in btrfs_drop_snapshot()
5481 if (wc->stage == DROP_REFERENCE) { in btrfs_drop_snapshot()
5482 wc->drop_level = wc->level; in btrfs_drop_snapshot()
5483 btrfs_node_key_to_cpu(path->nodes[wc->drop_level], in btrfs_drop_snapshot()
5484 &wc->drop_progress, in btrfs_drop_snapshot()
5485 path->slots[wc->drop_level]); in btrfs_drop_snapshot()
5488 &wc->drop_progress); in btrfs_drop_snapshot()
5489 root_item->drop_level = wc->drop_level; in btrfs_drop_snapshot()
5491 BUG_ON(wc->level == 0); in btrfs_drop_snapshot()
5571 kfree(wc); in btrfs_drop_snapshot()
5599 struct walk_control *wc; in btrfs_drop_subtree() local
5611 wc = kzalloc(sizeof(*wc), GFP_NOFS); in btrfs_drop_subtree()
5612 if (!wc) { in btrfs_drop_subtree()
5629 wc->refs[parent_level] = 1; in btrfs_drop_subtree()
5630 wc->flags[parent_level] = BTRFS_BLOCK_FLAG_FULL_BACKREF; in btrfs_drop_subtree()
5631 wc->level = level; in btrfs_drop_subtree()
5632 wc->shared_level = -1; in btrfs_drop_subtree()
5633 wc->stage = DROP_REFERENCE; in btrfs_drop_subtree()
5634 wc->update_ref = 0; in btrfs_drop_subtree()
5635 wc->keep_locks = 1; in btrfs_drop_subtree()
5636 wc->reada_count = BTRFS_NODEPTRS_PER_BLOCK(fs_info); in btrfs_drop_subtree()
5639 wret = walk_down_tree(trans, root, path, wc); in btrfs_drop_subtree()
5645 wret = walk_up_tree(trans, root, path, wc, parent_level); in btrfs_drop_subtree()
5652 kfree(wc); in btrfs_drop_subtree()