]> git.hungrycats.org Git - linux/commitdiff
btrfs: hold a ref on the root in btrfs_recover_log_trees
authorJosef Bacik <josef@toxicpanda.com>
Wed, 20 Nov 2019 20:34:12 +0000 (12:34 -0800)
committerJosef Bacik <josef@toxicpanda.com>
Fri, 6 Dec 2019 16:34:48 +0000 (08:34 -0800)
We replay the log into arbitrary fs roots, hold a ref on the root while
we're doing this.

Signed-off-by: Josef Bacik <josef@toxicpanda.com>
fs/btrfs/tree-log.c

index a4321bdcbf3e6eb6202bf981fc010799e38f3533..07e7fd5082139e83d8ffbc8ae811bcf6cea33346 100644 (file)
@@ -6292,6 +6292,10 @@ again:
                tmp_key.offset = (u64)-1;
 
                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);
 
@@ -6348,6 +6352,7 @@ 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);