]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
btrfs: return real error when failing tickets in maybe_fail_all_tickets()
authorFilipe Manana <fdmanana@suse.com>
Fri, 17 Oct 2025 15:41:05 +0000 (16:41 +0100)
committerDavid Sterba <dsterba@suse.com>
Mon, 24 Nov 2025 21:04:30 +0000 (22:04 +0100)
In case we had a transaction abort we set a ticket's error to -EIO, but we
have the real error that caused the transaction to be aborted returned by
the macro BTRFS_FS_ERROR(). So use that real error instead of -EIO.

Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.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/space-info.c

index 69237f5d6078c01ff79d4a63cd222c7a0ddfe40e..8b1cf7f6c22311e2e1cc711194a411f042688b2f 100644 (file)
@@ -1082,7 +1082,7 @@ static bool maybe_fail_all_tickets(struct btrfs_space_info *space_info)
        struct btrfs_fs_info *fs_info = space_info->fs_info;
        struct reserve_ticket *ticket;
        u64 tickets_id = space_info->tickets_id;
-       const bool aborted = BTRFS_FS_ERROR(fs_info);
+       const int abort_error = BTRFS_FS_ERROR(fs_info);
 
        trace_btrfs_fail_all_tickets(fs_info, space_info);
 
@@ -1096,16 +1096,16 @@ static bool maybe_fail_all_tickets(struct btrfs_space_info *space_info)
                ticket = list_first_entry(&space_info->tickets,
                                          struct reserve_ticket, list);
 
-               if (!aborted && steal_from_global_rsv(space_info, ticket))
+               if (!abort_error && steal_from_global_rsv(space_info, ticket))
                        return true;
 
-               if (!aborted && btrfs_test_opt(fs_info, ENOSPC_DEBUG))
+               if (!abort_error && btrfs_test_opt(fs_info, ENOSPC_DEBUG))
                        btrfs_info(fs_info, "failing ticket with %llu bytes",
                                   ticket->bytes);
 
                remove_ticket(space_info, ticket);
-               if (aborted)
-                       ticket->error = -EIO;
+               if (abort_error)
+                       ticket->error = abort_error;
                else
                        ticket->error = -ENOSPC;
                wake_up(&ticket->wait);
@@ -1116,7 +1116,7 @@ static bool maybe_fail_all_tickets(struct btrfs_space_info *space_info)
                 * here to see if we can make progress with the next ticket in
                 * the list.
                 */
-               if (!aborted)
+               if (!abort_error)
                        btrfs_try_granting_tickets(space_info);
        }
        return (tickets_id != space_info->tickets_id);