All of lore.kernel.org
 help / color / mirror / Atom feed
From: Josef Bacik <josef@toxicpanda.com>
To: linux-btrfs@vger.kernel.org, kernel-team@fb.com
Subject: [PATCH 05/15] btrfs: move the eb uptodate code into it's own helper
Date: Fri, 19 Apr 2024 14:17:00 -0400	[thread overview]
Message-ID: <569ec6a3d78ce12808f515ddc0924bea62733221.1713550368.git.josef@toxicpanda.com> (raw)
In-Reply-To: <cover.1713550368.git.josef@toxicpanda.com>

do_walk_down() already has a bunch of things going on, and there's a bit
of code related to reading in the next eb if we decide we need it.  Move
this code off into it's own helper to clean up do_walk_down() a little
bit.

Signed-off-by: Josef Bacik <josef@toxicpanda.com>
---
 fs/btrfs/extent-tree.c | 68 +++++++++++++++++++++++++++++-------------
 1 file changed, 48 insertions(+), 20 deletions(-)

diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
index 0ebbad032c73..9132cfb7fee1 100644
--- a/fs/btrfs/extent-tree.c
+++ b/fs/btrfs/extent-tree.c
@@ -5409,6 +5409,51 @@ static int check_ref_exists(struct btrfs_trans_handle *trans,
 	return 1;
 }
 
+/*
+ * We may not have an uptodate block, so if we are going to walk down into this
+ * block we need to drop the lock, read it off of the disk, re-lock it and
+ * return to continue dropping the snapshot.
+ */
+static int check_next_block_uptodate(struct btrfs_trans_handle *trans,
+				     struct btrfs_root *root,
+				     struct btrfs_path *path,
+				     struct walk_control *wc,
+				     struct extent_buffer *next)
+{
+	struct btrfs_tree_parent_check check = { 0 };
+	u64 generation;
+	int level = wc->level;
+	int ret;
+
+	btrfs_assert_tree_write_locked(next);
+
+	generation = btrfs_node_ptr_generation(path->nodes[level],
+					       path->slots[level]);
+
+	if (btrfs_buffer_uptodate(next, generation, 0))
+		return 0;
+
+	check.level = level - 1;
+	check.transid = generation;
+	check.owner_root = btrfs_root_id(root);
+	check.has_first_key = true;
+	btrfs_node_key_to_cpu(path->nodes[level], &check.first_key,
+			      path->slots[level]);
+
+	btrfs_tree_unlock(next);
+	if (level == 1)
+		reada_walk_down(trans, root, wc, path);
+	ret = btrfs_read_extent_buffer(next, &check);
+	if (ret) {
+		free_extent_buffer(next);
+		return ret;
+	}
+	btrfs_tree_lock(next);
+	wc->lookup_info = 1;
+	return 0;
+}
+
+
 /*
  * helper to process tree block pointer.
  *
@@ -5431,7 +5476,6 @@ static noinline int do_walk_down(struct btrfs_trans_handle *trans,
 	u64 bytenr;
 	u64 generation;
 	u64 owner_root = 0;
-	struct btrfs_tree_parent_check check = { 0 };
 	struct btrfs_key key;
 	struct extent_buffer *next;
 	int level = wc->level;
@@ -5453,13 +5497,6 @@ static noinline int do_walk_down(struct btrfs_trans_handle *trans,
 
 	bytenr = btrfs_node_blockptr(path->nodes[level], path->slots[level]);
 
-	check.level = level - 1;
-	check.transid = generation;
-	check.owner_root = btrfs_root_id(root);
-	check.has_first_key = true;
-	btrfs_node_key_to_cpu(path->nodes[level], &check.first_key,
-			      path->slots[level]);
-
 	next = btrfs_find_create_tree_block(fs_info, bytenr,
 					    btrfs_root_id(root), level - 1);
 	if (IS_ERR(next))
@@ -5507,18 +5544,9 @@ static noinline int do_walk_down(struct btrfs_trans_handle *trans,
 			goto skip;
 	}
 
-	if (!btrfs_buffer_uptodate(next, generation, 0)) {
-		btrfs_tree_unlock(next);
-		if (level == 1)
-			reada_walk_down(trans, root, wc, path);
-		ret = btrfs_read_extent_buffer(next, &check);
-		if (ret) {
-			free_extent_buffer(next);
-			return ret;
-		}
-		btrfs_tree_lock(next);
-		wc->lookup_info = 1;
-	}
+	ret = check_next_block_uptodate(trans, root, path, wc, next);
+	if (ret)
+		return ret;
 
 	level--;
 	ASSERT(level == btrfs_header_level(next));
-- 
2.43.0


  parent reply	other threads:[~2024-04-19 18:17 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-04-19 18:16 [PATCH 00/15] btrfs: snapshot delete cleanups Josef Bacik
2024-04-19 18:16 ` [PATCH 01/15] btrfs: don't do find_extent_buffer in do_walk_down Josef Bacik
2024-04-23 21:55   ` Qu Wenruo
2024-04-19 18:16 ` [PATCH 02/15] btrfs: push ->owner_root check into btrfs_read_extent_buffer Josef Bacik
2024-04-23 22:09   ` Qu Wenruo
2024-04-19 18:16 ` [PATCH 03/15] btrfs: use btrfs_read_extent_buffer in do_walk_down Josef Bacik
2024-04-19 18:16 ` [PATCH 04/15] btrfs: push lookup_info into walk_control Josef Bacik
2024-04-19 18:17 ` Josef Bacik [this message]
2024-04-19 18:17 ` [PATCH 06/15] btrfs: remove need_account in do_walk_down Josef Bacik
2024-04-19 18:17 ` [PATCH 07/15] btrfs: unify logic to decide if we need to walk down into a node Josef Bacik
2024-04-19 18:17 ` [PATCH 08/15] btrfs: extract the reference dropping code into it's own helper Josef Bacik
2024-04-19 18:17 ` [PATCH 09/15] btrfs: don't BUG_ON ENOMEM in walk_down_proc Josef Bacik
2024-04-19 18:17 ` [PATCH 10/15] btrfs: handle errors from ref mods during UPDATE_BACKREF Josef Bacik
2024-04-19 18:17 ` [PATCH 11/15] btrfs: replace BUG_ON with ASSERT in walk_down_proc Josef Bacik
2024-04-19 18:17 ` [PATCH 12/15] btrfs: clean up our handling of refs == 0 in snapshot delete Josef Bacik
2024-04-24 12:23   ` David Sterba
2024-04-19 18:17 ` [PATCH 13/15] btrfs: convert correctness BUG_ON()'s to ASSERT()'s in walk_up_proc Josef Bacik
2024-04-19 18:17 ` [PATCH 14/15] btrfs: handle errors from btrfs_dec_ref properly Josef Bacik
2024-04-19 18:17 ` [PATCH 15/15] btrfs: add documentation around snapshot delete Josef Bacik
2024-04-24 12:31 ` [PATCH 00/15] btrfs: snapshot delete cleanups David Sterba

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=569ec6a3d78ce12808f515ddc0924bea62733221.1713550368.git.josef@toxicpanda.com \
    --to=josef@toxicpanda.com \
    --cc=kernel-team@fb.com \
    --cc=linux-btrfs@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.