Merge branch 'for-linus-4.9' of git://git.kernel.org/pub/scm/linux/kernel/git/mason...
[cascardo/linux.git] / fs / btrfs / relocation.c
index c0c13dc..0ec8ffa 100644 (file)
@@ -337,8 +337,9 @@ static void backref_tree_panic(struct rb_node *rb_node, int errno, u64 bytenr)
                                              rb_node);
        if (bnode->root)
                fs_info = bnode->root->fs_info;
-       btrfs_panic(fs_info, errno, "Inconsistency in backref cache "
-                   "found at offset %llu", bytenr);
+       btrfs_panic(fs_info, errno,
+                   "Inconsistency in backref cache found at offset %llu",
+                   bytenr);
 }
 
 /*
@@ -923,9 +924,16 @@ again:
                        path2->slots[level]--;
 
                eb = path2->nodes[level];
-               WARN_ON(btrfs_node_blockptr(eb, path2->slots[level]) !=
-                       cur->bytenr);
-
+               if (btrfs_node_blockptr(eb, path2->slots[level]) !=
+                   cur->bytenr) {
+                       btrfs_err(root->fs_info,
+       "couldn't find block (%llu) (level %d) in tree (%llu) with key (%llu %u %llu)",
+                                 cur->bytenr, level - 1, root->objectid,
+                                 node_key->objectid, node_key->type,
+                                 node_key->offset);
+                       err = -ENOENT;
+                       goto out;
+               }
                lower = cur;
                need_check = true;
                for (; level < BTRFS_MAX_LEVEL; level++) {
@@ -1296,9 +1304,9 @@ static int __must_check __add_reloc_root(struct btrfs_root *root)
                              node->bytenr, &node->rb_node);
        spin_unlock(&rc->reloc_root_tree.lock);
        if (rb_node) {
-               btrfs_panic(root->fs_info, -EEXIST, "Duplicate root found "
-                           "for start=%llu while inserting into relocation "
-                           "tree", node->bytenr);
+               btrfs_panic(root->fs_info, -EEXIST,
+                           "Duplicate root found for start=%llu while inserting into relocation tree",
+                           node->bytenr);
                kfree(node);
                return -EEXIST;
        }
@@ -2350,6 +2358,10 @@ void free_reloc_roots(struct list_head *list)
        while (!list_empty(list)) {
                reloc_root = list_entry(list->next, struct btrfs_root,
                                        root_list);
+               free_extent_buffer(reloc_root->node);
+               free_extent_buffer(reloc_root->commit_root);
+               reloc_root->node = NULL;
+               reloc_root->commit_root = NULL;
                __del_reloc_root(reloc_root);
        }
 }
@@ -2686,11 +2698,15 @@ 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) {
-                               err = ret;
+                       if (ret) {
+                               if (ret < 0)
+                                       err = ret;
+                               else
+                                       err = -ENOENT;
+
+                               btrfs_release_path(path);
                                break;
                        }
-                       BUG_ON(ret > 0);
 
                        if (!upper->eb) {
                                upper->eb = path->nodes[upper->level];
@@ -3203,7 +3219,7 @@ static int relocate_file_extent_cluster(struct inode *inode,
                        nr++;
                }
 
-               btrfs_set_extent_delalloc(inode, page_start, page_end, NULL);
+               btrfs_set_extent_delalloc(inode, page_start, page_end, NULL, 0);
                set_page_dirty(page);
 
                unlock_extent(&BTRFS_I(inode)->io_tree,
@@ -3952,7 +3968,7 @@ static int qgroup_fix_relocated_data_extents(struct btrfs_trans_handle *trans,
        struct btrfs_key key;
        int ret = 0;
 
-       if (!fs_info->quota_enabled)
+       if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags))
                return 0;
 
        /*
@@ -4365,8 +4381,9 @@ int btrfs_relocate_block_group(struct btrfs_root *extent_root, u64 group_start)
                goto out;
        }
 
-       btrfs_info(extent_root->fs_info, "relocating block group %llu flags %llu",
-              rc->block_group->key.objectid, rc->block_group->flags);
+       btrfs_info(extent_root->fs_info,
+                  "relocating block group %llu flags %llu",
+                  rc->block_group->key.objectid, rc->block_group->flags);
 
        btrfs_wait_block_group_reservations(rc->block_group);
        btrfs_wait_nocow_writers(rc->block_group);