btrfs: do not ignore error from btrfs_next_leaf() when inserting checksums
authorFilipe Manana <fdmanana@suse.com>
Mon, 18 May 2020 11:15:09 +0000 (12:15 +0100)
committerDavid Sterba <dsterba@suse.com>
Mon, 25 May 2020 09:25:37 +0000 (11:25 +0200)
We are currently treating any non-zero return value from btrfs_next_leaf()
the same way, by going to the code that inserts a new checksum item in the
tree. However if btrfs_next_leaf() returns an error (a value < 0), we
should just stop and return the error, and not behave as if nothing has
happened, since in that case we do not have a way to know if there is a
next leaf or we are currently at the last leaf already.

So fix that by returning the error from btrfs_next_leaf().

Signed-off-by: Filipe Manana <fdmanana@suse.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/file-item.c

index 687529c61d13d645b8e6cebdbe0e8b3ffd97b3d6..c3f3c25dda385c7ba320399fdfb281be97fa609f 100644 (file)
@@ -889,10 +889,12 @@ again:
                nritems = btrfs_header_nritems(path->nodes[0]);
                if (!nritems || (path->slots[0] >= nritems - 1)) {
                        ret = btrfs_next_leaf(root, path);
-                       if (ret == 1)
+                       if (ret < 0) {
+                               goto out;
+                       } else if (ret > 0) {
                                found_next = 1;
-                       if (ret != 0)
                                goto insert;
+                       }
                        slot = path->slots[0];
                }
                btrfs_item_key_to_cpu(path->nodes[0], &found_key, slot);