summaryrefslogtreecommitdiff
path: root/extent-tree.c
diff options
context:
space:
mode:
authorYan Zheng <zheng.yan@oracle.com>2009-01-07 14:57:12 -0500
committerChris Mason <chris.mason@oracle.com>2009-01-07 14:57:12 -0500
commit9a6930e9bedb930ac44e540ef7f5633b61d270c2 (patch)
tree987d231e78c0144e08bbe1fe3b8cc4f69e67d22b /extent-tree.c
parent50e571e5b7ff95c94803c9668a8550ed68571db5 (diff)
Add semantic checks to btrfsck for files and directories
This patch makes btrfsck check more things, including directory items, file extents, checksumming, inode link counts etc. The code for these checks is similar to the code verifies extent back references. The main difference is that shared tree blocks are treated specially. The partial checking results(unresolved references and/or errors) of shared sub-trees are cached. This avoids scanning the shared blocks several times. Thank you, Signed-off-by: Yan Zheng <zheng.yan@oracle.com>
Diffstat (limited to 'extent-tree.c')
-rw-r--r--extent-tree.c19
1 files changed, 10 insertions, 9 deletions
diff --git a/extent-tree.c b/extent-tree.c
index 5dc353a1..cc8d1d78 100644
--- a/extent-tree.c
+++ b/extent-tree.c
@@ -801,9 +801,9 @@ int btrfs_extent_post_op(struct btrfs_trans_handle *trans,
return 0;
}
-int lookup_extent_ref(struct btrfs_trans_handle *trans,
- struct btrfs_root *root, u64 bytenr,
- u64 num_bytes, u32 *refs)
+int btrfs_lookup_extent_ref(struct btrfs_trans_handle *trans,
+ struct btrfs_root *root, u64 bytenr,
+ u64 num_bytes, u32 *refs)
{
struct btrfs_path *path;
int ret;
@@ -2110,8 +2110,8 @@ static void noinline reada_walk_down(struct btrfs_root *root,
}
blocksize = btrfs_level_size(root, level - 1);
if (i != slot) {
- ret = lookup_extent_ref(NULL, root, bytenr,
- blocksize, &refs);
+ ret = btrfs_lookup_extent_ref(NULL, root, bytenr,
+ blocksize, &refs);
BUG_ON(ret);
if (refs != 1) {
skipped++;
@@ -2150,9 +2150,9 @@ static int noinline walk_down_tree(struct btrfs_trans_handle *trans,
WARN_ON(*level < 0);
WARN_ON(*level >= BTRFS_MAX_LEVEL);
- ret = lookup_extent_ref(trans, root,
- path->nodes[*level]->start,
- path->nodes[*level]->len, &refs);
+ ret = btrfs_lookup_extent_ref(trans, root,
+ path->nodes[*level]->start,
+ path->nodes[*level]->len, &refs);
BUG_ON(ret);
if (refs > 1)
goto out;
@@ -2179,7 +2179,8 @@ static int noinline walk_down_tree(struct btrfs_trans_handle *trans,
bytenr = btrfs_node_blockptr(cur, path->slots[*level]);
ptr_gen = btrfs_node_ptr_generation(cur, path->slots[*level]);
blocksize = btrfs_level_size(root, *level - 1);
- ret = lookup_extent_ref(trans, root, bytenr, blocksize, &refs);
+ ret = btrfs_lookup_extent_ref(trans, root, bytenr, blocksize,
+ &refs);
BUG_ON(ret);
if (refs != 1) {
parent = path->nodes[*level];