]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
btrfs: abort transaction on error in write_all_supers()
authorFilipe Manana <fdmanana@suse.com>
Tue, 3 Feb 2026 17:31:58 +0000 (17:31 +0000)
committerDavid Sterba <dsterba@suse.com>
Tue, 7 Apr 2026 16:55:54 +0000 (18:55 +0200)
We are in a transaction context and have an handle, so instead of using
the less preferred btrfs_handle_fs_error(), abort the transaction and
log an error to give some context information.

Reviewed-by: Qu Wenruo <wqu@suse.com>
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/disk-io.c

index cc89672694887e8f5e4ff3a2e7165f34eaacbac5..177b211dfa05242012710781acd0ddd84d52323b 100644 (file)
@@ -4071,8 +4071,8 @@ int write_all_supers(struct btrfs_trans_handle *trans, int max_mirrors)
                if (ret) {
                        mutex_unlock(
                                &fs_info->fs_devices->device_list_mutex);
-                       btrfs_handle_fs_error(fs_info, ret,
-                                             "errors while submitting device barriers.");
+                       btrfs_abort_transaction(trans, ret);
+                       btrfs_err(fs_info, "error while submitting device barriers");
                        return ret;
                }
        }
@@ -4106,9 +4106,10 @@ int write_all_supers(struct btrfs_trans_handle *trans, int max_mirrors)
                ret = btrfs_validate_write_super(fs_info, sb);
                if (unlikely(ret < 0)) {
                        mutex_unlock(&fs_info->fs_devices->device_list_mutex);
-                       btrfs_handle_fs_error(fs_info, -EUCLEAN,
-                               "unexpected superblock corruption detected");
-                       return -EUCLEAN;
+                       btrfs_abort_transaction(trans, ret);
+                       btrfs_err(fs_info,
+                         "unexpected superblock corruption before writing it");
+                       return ret;
                }
 
                ret = write_dev_supers(dev, sb, max_mirrors);
@@ -4121,9 +4122,8 @@ int write_all_supers(struct btrfs_trans_handle *trans, int max_mirrors)
                mutex_unlock(&fs_info->fs_devices->device_list_mutex);
 
                /* FUA is masked off if unsupported and can't be the reason */
-               btrfs_handle_fs_error(fs_info, -EIO,
-                                     "%d errors while writing supers",
-                                     total_errors);
+               btrfs_abort_transaction(trans, -EIO);
+               btrfs_err(fs_info, "%d errors while writing supers", total_errors);
                return -EIO;
        }
 
@@ -4141,9 +4141,8 @@ int write_all_supers(struct btrfs_trans_handle *trans, int max_mirrors)
        }
        mutex_unlock(&fs_info->fs_devices->device_list_mutex);
        if (unlikely(total_errors > max_errors)) {
-               btrfs_handle_fs_error(fs_info, -EIO,
-                                     "%d errors while writing supers",
-                                     total_errors);
+               btrfs_abort_transaction(trans, -EIO);
+               btrfs_err(fs_info, "%d errors while writing supers", total_errors);
                return -EIO;
        }
        return 0;