diff options
author | Yan Zheng <zheng.yan@oracle.com> | 2009-01-07 14:57:12 -0500 |
---|---|---|
committer | Chris Mason <chris.mason@oracle.com> | 2009-01-07 14:57:12 -0500 |
commit | 9a6930e9bedb930ac44e540ef7f5633b61d270c2 (patch) | |
tree | 987d231e78c0144e08bbe1fe3b8cc4f69e67d22b /extent-tree.c | |
parent | 50e571e5b7ff95c94803c9668a8550ed68571db5 (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.c | 19 |
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]; |