]> www.infradead.org Git - nvme.git/commitdiff
btrfs: abort transaction on errors in btrfs_free_chunk()
authorDavid Sterba <dsterba@suse.com>
Wed, 22 May 2024 15:52:38 +0000 (17:52 +0200)
committerDavid Sterba <dsterba@suse.com>
Thu, 11 Jul 2024 13:33:27 +0000 (15:33 +0200)
The errors during removing a chunk item are fatal, we expect to have a
matching item in the chunk map from which the chunk_offset is taken.
Handle that by transaction abort.

Reviewed-by: Qu Wenruo <wqu@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/volumes.c

index ac6056072ee8422955703aafb816ac6750bb3ab9..fcedc43ef291a208128da00409219faf0e390984 100644 (file)
@@ -2989,16 +2989,19 @@ static int btrfs_free_chunk(struct btrfs_trans_handle *trans, u64 chunk_offset)
        if (ret < 0)
                goto out;
        else if (ret > 0) { /* Logic error or corruption */
-               btrfs_handle_fs_error(fs_info, -ENOENT,
-                                     "Failed lookup while freeing chunk.");
-               ret = -ENOENT;
+               btrfs_err(fs_info, "failed to lookup chunk %llu when freeing",
+                         chunk_offset);
+               btrfs_abort_transaction(trans, -ENOENT);
+               ret = -EUCLEAN;
                goto out;
        }
 
        ret = btrfs_del_item(trans, root, path);
-       if (ret < 0)
-               btrfs_handle_fs_error(fs_info, ret,
-                                     "Failed to delete chunk item.");
+       if (ret < 0) {
+               btrfs_err(fs_info, "failed to delete chunk %llu item", chunk_offset);
+               btrfs_abort_transaction(trans, ret);
+               goto out;
+       }
 out:
        btrfs_free_path(path);
        return ret;