From: Qu Wenruo <quwenruo@cn.fujitsu.com>
To: <linux-btrfs@vger.kernel.org>
Subject: [PATCH 1/7] btrfs-progs: Add btrfs_(prev/next)_tree_block() to keep search result in the same level of path->lowest_level.
Date: Wed, 4 Feb 2015 15:16:45 +0800 [thread overview]
Message-ID: <1423034213-14018-2-git-send-email-quwenruo@cn.fujitsu.com> (raw)
In-Reply-To: <1423034213-14018-1-git-send-email-quwenruo@cn.fujitsu.com>
Before this patch, btrfs_(prev/next)_leaf() will search for the leaf
even path->lowest_level is set.
This is OK since nobody needs such function.
But later patches to clean up the csum in tree block needs to iterate
tree blocks level by level, which such function will be very handy.
This patch just modify the original btrfs_(prev/next)_leaf() to stop at
path->lowest_level, and alias btrfs_(prev/next)_tree_block() to them.
Since caller of btrfs_(prev/next)_leaf() don't set path->lowest_level,
there is no difference for them.
Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com>
---
ctree.c | 18 +++++++++++-------
ctree.h | 12 ++++++++++++
2 files changed, 23 insertions(+), 7 deletions(-)
diff --git a/ctree.c b/ctree.c
index 130c61f..2d1da1c 100644
--- a/ctree.c
+++ b/ctree.c
@@ -2750,13 +2750,15 @@ int btrfs_del_items(struct btrfs_trans_handle *trans, struct btrfs_root *root,
/*
* walk up the tree as far as required to find the previous leaf.
+ * result will be at the same level of path->lowest_level.
+ *
* returns 0 if it found something or 1 if there are no lesser leaves.
* returns < 0 on io errors.
*/
int btrfs_prev_leaf(struct btrfs_root *root, struct btrfs_path *path)
{
- int slot;
- int level = 1;
+ int slot = 0;
+ int level = path->lowest_level + 1;
struct extent_buffer *c;
struct extent_buffer *next = NULL;
@@ -2792,7 +2794,7 @@ int btrfs_prev_leaf(struct btrfs_root *root, struct btrfs_path *path)
slot--;
path->nodes[level] = next;
path->slots[level] = slot;
- if (!level)
+ if (level == path->lowest_level)
break;
next = read_node_slot(root, next, slot);
if (!extent_buffer_uptodate(next)) {
@@ -2805,14 +2807,16 @@ int btrfs_prev_leaf(struct btrfs_root *root, struct btrfs_path *path)
}
/*
- * walk up the tree as far as required to find the next leaf.
+ * walk up the tree as far as required to find the next node/leaf.
+ * result will be at the same level of path->lowest_level.
+ *
* returns 0 if it found something or 1 if there are no greater leaves.
* returns < 0 on io errors.
*/
int btrfs_next_leaf(struct btrfs_root *root, struct btrfs_path *path)
{
- int slot;
- int level = 1;
+ int slot = 0;
+ int level = path->lowest_level + 1;
struct extent_buffer *c;
struct extent_buffer *next = NULL;
@@ -2844,7 +2848,7 @@ int btrfs_next_leaf(struct btrfs_root *root, struct btrfs_path *path)
free_extent_buffer(c);
path->nodes[level] = next;
path->slots[level] = 0;
- if (!level)
+ if (level == path->lowest_level)
break;
if (path->reada)
reada_for_search(root, path, level, 0, 0);
diff --git a/ctree.h b/ctree.h
index 2a678a9..c52d3de 100644
--- a/ctree.h
+++ b/ctree.h
@@ -2334,6 +2334,12 @@ static inline int btrfs_insert_empty_item(struct btrfs_trans_handle *trans,
}
int btrfs_next_leaf(struct btrfs_root *root, struct btrfs_path *path);
+static inline int btrfs_next_tree_block(struct btrfs_root *root,
+ struct btrfs_path *path)
+{
+ return btrfs_next_leaf(root, path);
+}
+
static inline int btrfs_next_item(struct btrfs_root *root,
struct btrfs_path *p)
{
@@ -2344,6 +2350,12 @@ static inline int btrfs_next_item(struct btrfs_root *root,
}
int btrfs_prev_leaf(struct btrfs_root *root, struct btrfs_path *path);
+static inline int btrfs_prev_tree_block(struct btrfs_root *root,
+ struct btrfs_path *path)
+{
+ return btrfs_prev_leaf(root, path);
+}
+
int btrfs_leaf_free_space(struct btrfs_root *root, struct extent_buffer *leaf);
void btrfs_fixup_low_keys(struct btrfs_root *root, struct btrfs_path *path,
struct btrfs_disk_key *key, int level);
--
2.2.2
next prev parent reply other threads:[~2015-02-04 7:19 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-02-04 7:16 [PATCH 0/7] Allow btrfsck to reset csum of all tree blocks, AKA dangerous mode Qu Wenruo
2015-02-04 7:16 ` Qu Wenruo [this message]
2015-02-04 7:16 ` [PATCH 2/7] btrfs-progs: Introduce btrfs_next_slot() function to iterate to next slot in given level Qu Wenruo
2015-02-04 7:16 ` [PATCH 3/7] btrfs-progs: Allow btrfs_read_fs_root() to re-read the tree node Qu Wenruo
2015-02-04 7:16 ` [PATCH 4/7] btrfs-progs: Export write_tree_block() and allow it to do nocow write Qu Wenruo
2015-02-04 7:16 ` [PATCH 4/5] btrfs-progs: Introduce new function reset_tree_block_csum() for later tree block csum reset Qu Wenruo
2015-02-04 7:16 ` [PATCH 5/5] btrfs-progs: Introduce new function reset_(one_root/roots)_csum() to reset one/all tree's csum in tree root Qu Wenruo
2015-02-04 7:16 ` [PATCH 5/7] btrfs-progs: Introduce new function reset_tree_block_csum() for later tree block csum reset Qu Wenruo
2015-02-04 7:16 ` [PATCH 6/7] btrfs-progs: Introduce new function reset_(one_root/roots)_csum() to reset one/all tree's csum in tree root Qu Wenruo
2015-02-04 7:16 ` [PATCH 7/7] btrfs-progs: Introduce "--dangerous" option to reset all tree block csum Qu Wenruo
2015-02-04 9:16 ` [PATCH 0/7] Allow btrfsck to reset csum of all tree blocks, AKA dangerous mode Martin Steigerwald
2015-02-04 10:07 ` Paul Jones
2015-02-05 1:43 ` Qu Wenruo
2015-02-05 1:35 ` Qu Wenruo
2015-02-05 8:31 ` Martin Steigerwald
2015-02-05 8:45 ` Qu Wenruo
2015-02-05 8:59 ` BTRFS wiki: page about recovery (was: Re: [PATCH 0/7] Allow btrfsck to reset csum of all tree blocks, AKA dangerous mode.) Martin Steigerwald
2015-04-22 5:55 ` [PATCH 0/7] Allow btrfsck to reset csum of all tree blocks, AKA dangerous mode Qu Wenruo
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=1423034213-14018-2-git-send-email-quwenruo@cn.fujitsu.com \
--to=quwenruo@cn.fujitsu.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).