btrfs: fix lost error handling when replaying directory deletes
authorFilipe Manana <fdmanana@suse.com>
Thu, 14 Oct 2021 16:26:04 +0000 (17:26 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 18 Nov 2021 18:15:56 +0000 (19:15 +0100)
commit 10adb1152d957a4d570ad630f93a88bb961616c1 upstream.

At replay_dir_deletes(), if find_dir_range() returns an error we break out
of the main while loop and then assign a value of 0 (success) to the 'ret'
variable, resulting in completely ignoring that an error happened. Fix
that by jumping to the 'out' label when find_dir_range() returns an error
(negative value).

CC: stable@vger.kernel.org # 4.4+
Reviewed-by: Josef Bacik <josef@toxicpanda.com>
Signed-off-by: Filipe Manana <fdmanana@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
fs/btrfs/tree-log.c

index b415c5e..ca33f10 100644 (file)
@@ -2500,7 +2500,9 @@ again:
                else {
                        ret = find_dir_range(log, path, dirid, key_type,
                                             &range_start, &range_end);
-                       if (ret != 0)
+                       if (ret < 0)
+                               goto out;
+                       else if (ret > 0)
                                break;
                }