btrfs filesystem balance sometimes fails on corrupted filesystems, but
without any information that explains what the failure was to help
track down the problem.  This patch adds logging for nearly all error
conditions that may cause relocation to fail.

Signed-off-by: Alexandre Oliva <ol...@lsd.ic.unicamp.br>
---
 fs/btrfs/relocation.c |    8 ++++++++
 1 files changed, 8 insertions(+), 0 deletions(-)

diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c
index dff29d5..15a2270 100644
--- a/fs/btrfs/relocation.c
+++ b/fs/btrfs/relocation.c
@@ -2496,6 +2496,7 @@ static int do_relocation(struct btrfs_trans_handle *trans,
                if (!upper->eb) {
                        ret = btrfs_search_slot(trans, root, key, path, 0, 1);
                        if (ret < 0) {
+                               printk(KERN_INFO "btrfs: searching slot %llu 
failed: %i\n", key->objectid, -ret);
                                err = ret;
                                break;
                        }
@@ -2543,6 +2544,7 @@ static int do_relocation(struct btrfs_trans_handle *trans,
                        btrfs_tree_unlock(eb);
                        free_extent_buffer(eb);
                        if (ret < 0) {
+                               printk(KERN_INFO "btrfs: cow slot failed: 
%i\n", -ret);
                                err = ret;
                                goto next;
                        }
@@ -2730,6 +2732,7 @@ static int relocate_tree_block(struct btrfs_trans_handle 
*trans,
        BUG_ON(node->processed);
        root = select_one_root(trans, node);
        if (root == ERR_PTR(-ENOENT)) {
+               printk(KERN_INFO "btrfs: could not find a root to update\n");
                update_processed_blocks(rc, node);
                goto out;
        }
@@ -2756,6 +2759,8 @@ static int relocate_tree_block(struct btrfs_trans_handle 
*trans,
                        btrfs_release_path(path);
                        if (ret > 0)
                                ret = 0;
+                       if (ret < 0)
+                               printk(KERN_INFO "btrfs: failed to search slot 
%llu: %i\n", key->objectid, -ret);
                }
                if (!ret)
                        update_processed_blocks(rc, node);
@@ -2813,12 +2818,14 @@ int relocate_tree_blocks(struct btrfs_trans_handle 
*trans,
                                          block->level, block->bytenr);
                if (IS_ERR(node)) {
                        err = PTR_ERR(node);
+                       printk(KERN_INFO "btrfs: failed to build backref tree 
for key %llu byte %llu: %i\n", block->key.objectid, block->bytenr, -err);
                        goto out;
                }
 
                ret = relocate_tree_block(trans, rc, node, &block->key,
                                          path);
                if (ret < 0) {
+                       printk(KERN_INFO "btrfs: failed to relocate tree block: 
%i\n", -ret);
                        if (ret != -EAGAIN || rb_node == rb_first(blocks))
                                err = ret;
                        goto out;
@@ -3770,6 +3777,7 @@ restart:
                        ret = relocate_tree_blocks(trans, rc, &blocks);
                        if (ret < 0) {
                                if (ret != -EAGAIN) {
+                                       printk(KERN_INFO "btrfs: failed to 
relocate blocks for key %llu: %i\n", key.objectid, -ret);
                                        err = ret;
                                        break;
                                }
-- 
1.7.4.4

--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to