btrfs: handle btrfs_record_root_in_trans failure in btrfs_recover_log_trees
authorJosef Bacik <josef@toxicpanda.com>
Fri, 12 Mar 2021 20:25:05 +0000 (15:25 -0500)
committerDavid Sterba <dsterba@suse.com>
Mon, 19 Apr 2021 15:25:20 +0000 (17:25 +0200)
btrfs_record_root_in_trans will return errors in the future, so handle
the error properly in btrfs_recover_log_trees.

This appears tricky, however we have a reference count on the
destination root, so if this fails we need to continue on in the loop to
make sure the proper cleanup is done.

Reviewed-by: Qu Wenruo <wqu@suse.com>
Signed-off-by: Josef Bacik <josef@toxicpanda.com>
Reviewed-by: David Sterba <dsterba@suse.com>
[ add comment ]
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/tree-log.c

index 72c4b66..c1353b8 100644 (file)
@@ -6280,8 +6280,13 @@ again:
                }
 
                wc.replay_dest->log_root = log;
-               btrfs_record_root_in_trans(trans, wc.replay_dest);
-               ret = walk_log_tree(trans, log, &wc);
+               ret = btrfs_record_root_in_trans(trans, wc.replay_dest);
+               if (ret)
+                       /* The loop needs to continue due to the root refs */
+                       btrfs_handle_fs_error(fs_info, ret,
+                               "failed to record the log root in transaction");
+               else
+                       ret = walk_log_tree(trans, log, &wc);
 
                if (!ret && wc.stage == LOG_WALK_REPLAY_ALL) {
                        ret = fixup_inode_link_counts(trans, wc.replay_dest,