btrfs: use btrfs_put_fs_root to free roots always
[linux-2.6-microblaze.git] / fs / btrfs / tree-log.c
index 7dd7552..1776ac4 100644 (file)
@@ -830,6 +830,11 @@ static noinline int replay_one_extent(struct btrfs_trans_handle *trans,
                        goto out;
        }
 
+       ret = btrfs_inode_set_file_extent_range(BTRFS_I(inode), start,
+                                               extent_end - start);
+       if (ret)
+               goto out;
+
        inode_add_bytes(inode, nbytes);
 update_inode:
        ret = btrfs_update_inode(trans, root, inode);
@@ -3284,7 +3289,7 @@ static void free_log_tree(struct btrfs_trans_handle *trans,
        clear_extent_bits(&log->dirty_log_pages, 0, (u64)-1,
                          EXTENT_DIRTY | EXTENT_NEW | EXTENT_NEED_WAIT);
        free_extent_buffer(log->node);
-       kfree(log);
+       btrfs_put_fs_root(log);
 }
 
 /*
@@ -6145,7 +6150,7 @@ again:
                if (found_key.objectid != BTRFS_TREE_LOG_OBJECTID)
                        break;
 
-               log = btrfs_read_fs_root(log_root_tree, &found_key);
+               log = btrfs_read_tree_root(log_root_tree, &found_key);
                if (IS_ERR(log)) {
                        ret = PTR_ERR(log);
                        btrfs_handle_fs_error(fs_info, ret,
@@ -6157,7 +6162,11 @@ again:
                tmp_key.type = BTRFS_ROOT_ITEM_KEY;
                tmp_key.offset = (u64)-1;
 
-               wc.replay_dest = btrfs_read_fs_root_no_name(fs_info, &tmp_key);
+               wc.replay_dest = btrfs_get_fs_root(fs_info, &tmp_key, true);
+               if (!IS_ERR(wc.replay_dest)) {
+                       if (!btrfs_grab_fs_root(wc.replay_dest))
+                               wc.replay_dest = ERR_PTR(-ENOENT);
+               }
                if (IS_ERR(wc.replay_dest)) {
                        ret = PTR_ERR(wc.replay_dest);
 
@@ -6178,7 +6187,7 @@ again:
                                                        log->node->len);
                        free_extent_buffer(log->node);
                        free_extent_buffer(log->commit_root);
-                       kfree(log);
+                       btrfs_put_fs_root(log);
 
                        if (!ret)
                                goto next;
@@ -6214,9 +6223,10 @@ again:
                }
 
                wc.replay_dest->log_root = NULL;
+               btrfs_put_fs_root(wc.replay_dest);
                free_extent_buffer(log->node);
                free_extent_buffer(log->commit_root);
-               kfree(log);
+               btrfs_put_fs_root(log);
 
                if (ret)
                        goto error;
@@ -6250,7 +6260,7 @@ next:
        free_extent_buffer(log_root_tree->node);
        log_root_tree->log_root = NULL;
        clear_bit(BTRFS_FS_LOG_RECOVERING, &fs_info->flags);
-       kfree(log_root_tree);
+       btrfs_put_fs_root(log_root_tree);
 
        return 0;
 error: