Lines Matching refs:wc

5272 static bool visit_node_for_delete(struct btrfs_root *root, struct walk_control *wc,  in visit_node_for_delete()  argument
5277 int level = wc->level; in visit_node_for_delete()
5280 ASSERT(wc->refs[level - 1] > 0); in visit_node_for_delete()
5286 if (wc->stage == UPDATE_BACKREF) { in visit_node_for_delete()
5296 if (wc->refs[level - 1] == 1) in visit_node_for_delete()
5311 if (!wc->update_ref || generation <= root->root_key.offset) in visit_node_for_delete()
5319 if (btrfs_comp_cpu_keys(&key, &wc->update_progress) < 0) in visit_node_for_delete()
5328 struct walk_control *wc, in reada_walk_down() argument
5342 if (path->slots[wc->level] < wc->reada_slot) { in reada_walk_down()
5343 wc->reada_count = wc->reada_count * 2 / 3; in reada_walk_down()
5344 wc->reada_count = max(wc->reada_count, 2); in reada_walk_down()
5346 wc->reada_count = wc->reada_count * 3 / 2; in reada_walk_down()
5347 wc->reada_count = min_t(int, wc->reada_count, in reada_walk_down()
5351 eb = path->nodes[wc->level]; in reada_walk_down()
5354 for (slot = path->slots[wc->level]; slot < nritems; slot++) { in reada_walk_down()
5355 if (nread >= wc->reada_count) in reada_walk_down()
5362 if (slot == path->slots[wc->level]) in reada_walk_down()
5365 if (wc->stage == UPDATE_BACKREF && in reada_walk_down()
5371 wc->level - 1, 1, &refs, in reada_walk_down()
5387 if (!visit_node_for_delete(root, wc, eb, refs, flags, slot)) in reada_walk_down()
5393 wc->reada_slot = slot; in reada_walk_down()
5407 struct walk_control *wc) in walk_down_proc() argument
5410 int level = wc->level; in walk_down_proc()
5415 if (wc->stage == UPDATE_BACKREF && btrfs_header_owner(eb) != btrfs_root_id(root)) in walk_down_proc()
5422 if (wc->lookup_info && in walk_down_proc()
5423 ((wc->stage == DROP_REFERENCE && wc->refs[level] != 1) || in walk_down_proc()
5424 (wc->stage == UPDATE_BACKREF && !(wc->flags[level] & flag)))) { in walk_down_proc()
5428 &wc->refs[level], in walk_down_proc()
5429 &wc->flags[level], in walk_down_proc()
5433 if (unlikely(wc->refs[level] == 0)) { in walk_down_proc()
5440 if (wc->stage == DROP_REFERENCE) { in walk_down_proc()
5441 if (wc->refs[level] > 1) in walk_down_proc()
5444 if (path->locks[level] && !wc->keep_locks) { in walk_down_proc()
5452 if (!(wc->flags[level] & flag)) { in walk_down_proc()
5469 wc->flags[level] |= flag; in walk_down_proc()
5557 struct walk_control *wc, in check_next_block_uptodate() argument
5562 int level = wc->level; in check_next_block_uptodate()
5580 reada_walk_down(trans, root, wc, path); in check_next_block_uptodate()
5587 wc->lookup_info = 1; in check_next_block_uptodate()
5602 struct btrfs_path *path, struct walk_control *wc, in maybe_drop_reference() argument
5612 int level = wc->level; in maybe_drop_reference()
5616 if (wc->stage == UPDATE_BACKREF) in maybe_drop_reference()
5619 if (wc->flags[level] & BTRFS_BLOCK_FLAG_FULL_BACKREF) { in maybe_drop_reference()
5635 if (wc->restarted) { in maybe_drop_reference()
5641 wc->restarted = 0; in maybe_drop_reference()
5650 wc->refs[level - 1] > 1) { in maybe_drop_reference()
5668 wc->drop_level = level; in maybe_drop_reference()
5669 find_next_key(path, level, &wc->drop_progress); in maybe_drop_reference()
5691 struct walk_control *wc) in do_walk_down() argument
5698 int level = wc->level; in do_walk_down()
5708 if (wc->stage == UPDATE_BACKREF && in do_walk_down()
5710 wc->lookup_info = 1; in do_walk_down()
5724 &wc->refs[level - 1], in do_walk_down()
5725 &wc->flags[level - 1], in do_walk_down()
5730 if (unlikely(wc->refs[level - 1] == 0)) { in do_walk_down()
5736 wc->lookup_info = 0; in do_walk_down()
5739 if (!visit_node_for_delete(root, wc, path->nodes[level], in do_walk_down()
5740 wc->refs[level - 1], wc->flags[level - 1], in do_walk_down()
5749 if (wc->stage == DROP_REFERENCE && wc->refs[level - 1] > 1) { in do_walk_down()
5750 wc->stage = UPDATE_BACKREF; in do_walk_down()
5751 wc->shared_level = level - 1; in do_walk_down()
5754 ret = check_next_block_uptodate(trans, root, path, wc, next); in do_walk_down()
5768 wc->level = level; in do_walk_down()
5769 if (wc->level == 1) in do_walk_down()
5770 wc->reada_slot = 0; in do_walk_down()
5773 ret = maybe_drop_reference(trans, root, path, wc, next, owner_root); in do_walk_down()
5776 wc->refs[level - 1] = 0; in do_walk_down()
5777 wc->flags[level - 1] = 0; in do_walk_down()
5778 wc->lookup_info = 1; in do_walk_down()
5803 struct walk_control *wc) in walk_up_proc() argument
5807 int level = wc->level; in walk_up_proc()
5811 if (wc->stage == UPDATE_BACKREF) { in walk_up_proc()
5812 ASSERT(wc->shared_level >= level); in walk_up_proc()
5813 if (level < wc->shared_level) in walk_up_proc()
5816 ret = find_next_key(path, level + 1, &wc->update_progress); in walk_up_proc()
5818 wc->update_ref = 0; in walk_up_proc()
5820 wc->stage = DROP_REFERENCE; in walk_up_proc()
5821 wc->shared_level = -1; in walk_up_proc()
5836 &wc->refs[level], in walk_up_proc()
5837 &wc->flags[level], in walk_up_proc()
5844 if (unlikely(wc->refs[level] == 0)) { in walk_up_proc()
5850 if (wc->refs[level] == 1) { in walk_up_proc()
5859 ASSERT(path->locks[level] || wc->refs[level] == 1); in walk_up_proc()
5861 if (wc->refs[level] == 1) { in walk_up_proc()
5863 if (wc->flags[level] & BTRFS_BLOCK_FLAG_FULL_BACKREF) in walk_up_proc()
5889 if (wc->flags[level] & BTRFS_BLOCK_FLAG_FULL_BACKREF) in walk_up_proc()
5894 if (wc->flags[level + 1] & BTRFS_BLOCK_FLAG_FULL_BACKREF) in walk_up_proc()
5902 wc->refs[level] == 1); in walk_up_proc()
5906 wc->refs[level] = 0; in walk_up_proc()
5907 wc->flags[level] = 0; in walk_up_proc()
5940 struct walk_control *wc) in walk_down_tree() argument
5942 int level = wc->level; in walk_down_tree()
5945 wc->lookup_info = 1; in walk_down_tree()
5947 ret = walk_down_proc(trans, root, path, wc); in walk_down_tree()
5958 ret = do_walk_down(trans, root, path, wc); in walk_down_tree()
5964 level = wc->level; in walk_down_tree()
5989 struct walk_control *wc, int max_level) in walk_up_tree() argument
5991 int level = wc->level; in walk_up_tree()
5996 wc->level = level; in walk_up_tree()
6002 ret = walk_up_proc(trans, root, path, wc); in walk_up_tree()
6042 struct walk_control *wc; in btrfs_drop_snapshot() local
6058 wc = kzalloc(sizeof(*wc), GFP_NOFS); in btrfs_drop_snapshot()
6059 if (!wc) { in btrfs_drop_snapshot()
6098 memset(&wc->update_progress, 0, in btrfs_drop_snapshot()
6099 sizeof(wc->update_progress)); in btrfs_drop_snapshot()
6102 memcpy(&wc->update_progress, &key, in btrfs_drop_snapshot()
6103 sizeof(wc->update_progress)); in btrfs_drop_snapshot()
6133 level, 1, &wc->refs[level], in btrfs_drop_snapshot()
6134 &wc->flags[level], NULL); in btrfs_drop_snapshot()
6138 BUG_ON(wc->refs[level] == 0); in btrfs_drop_snapshot()
6145 WARN_ON(wc->refs[level] != 1); in btrfs_drop_snapshot()
6150 wc->restarted = test_bit(BTRFS_ROOT_DEAD_TREE, &root->state); in btrfs_drop_snapshot()
6151 wc->level = level; in btrfs_drop_snapshot()
6152 wc->shared_level = -1; in btrfs_drop_snapshot()
6153 wc->stage = DROP_REFERENCE; in btrfs_drop_snapshot()
6154 wc->update_ref = update_ref; in btrfs_drop_snapshot()
6155 wc->keep_locks = 0; in btrfs_drop_snapshot()
6156 wc->reada_count = BTRFS_NODEPTRS_PER_BLOCK(fs_info); in btrfs_drop_snapshot()
6160 ret = walk_down_tree(trans, root, path, wc); in btrfs_drop_snapshot()
6166 ret = walk_up_tree(trans, root, path, wc, BTRFS_MAX_LEVEL); in btrfs_drop_snapshot()
6173 BUG_ON(wc->stage != DROP_REFERENCE); in btrfs_drop_snapshot()
6178 if (wc->stage == DROP_REFERENCE) { in btrfs_drop_snapshot()
6179 wc->drop_level = wc->level; in btrfs_drop_snapshot()
6180 btrfs_node_key_to_cpu(path->nodes[wc->drop_level], in btrfs_drop_snapshot()
6181 &wc->drop_progress, in btrfs_drop_snapshot()
6182 path->slots[wc->drop_level]); in btrfs_drop_snapshot()
6185 &wc->drop_progress); in btrfs_drop_snapshot()
6186 btrfs_set_root_drop_level(root_item, wc->drop_level); in btrfs_drop_snapshot()
6188 BUG_ON(wc->level == 0); in btrfs_drop_snapshot()
6272 kfree(wc); in btrfs_drop_snapshot()
6315 struct walk_control *wc; in btrfs_drop_subtree() local
6326 wc = kzalloc(sizeof(*wc), GFP_NOFS); in btrfs_drop_subtree()
6327 if (!wc) { in btrfs_drop_subtree()
6344 wc->refs[parent_level] = 1; in btrfs_drop_subtree()
6345 wc->flags[parent_level] = BTRFS_BLOCK_FLAG_FULL_BACKREF; in btrfs_drop_subtree()
6346 wc->level = level; in btrfs_drop_subtree()
6347 wc->shared_level = -1; in btrfs_drop_subtree()
6348 wc->stage = DROP_REFERENCE; in btrfs_drop_subtree()
6349 wc->update_ref = 0; in btrfs_drop_subtree()
6350 wc->keep_locks = 1; in btrfs_drop_subtree()
6351 wc->reada_count = BTRFS_NODEPTRS_PER_BLOCK(fs_info); in btrfs_drop_subtree()
6354 ret = walk_down_tree(trans, root, path, wc); in btrfs_drop_subtree()
6358 ret = walk_up_tree(trans, root, path, wc, parent_level); in btrfs_drop_subtree()
6366 kfree(wc); in btrfs_drop_subtree()