]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
btrfs: fix lost error when running device stats on multiple devices fs
authorFilipe Manana <fdmanana@suse.com>
Wed, 18 Mar 2026 16:17:59 +0000 (16:17 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 2 Apr 2026 11:09:53 +0000 (13:09 +0200)
[ Upstream commit 1c37d896b12dfd0d4c96e310b0033c6676933917 ]

Whenever we get an error updating the device stats item for a device in
btrfs_run_dev_stats() we allow the loop to go to the next device, and if
updating the stats item for the next device succeeds, we end up losing
the error we had from the previous device.

Fix this by breaking out of the loop once we get an error and make sure
it's returned to the caller. Since we are in the transaction commit path
(and in the critical section actually), returning the error will result
in a transaction abort.

Fixes: 733f4fbbc108 ("Btrfs: read device stats on mount, write modified ones during commit")
Signed-off-by: Filipe Manana <fdmanana@suse.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
fs/btrfs/volumes.c

index b723e860e4e9ed954ea8a01da187b7b75a9f64b8..c53e7e5c9d42622d0fa2022e5db618073958c0d1 100644 (file)
@@ -7738,8 +7738,9 @@ int btrfs_run_dev_stats(struct btrfs_trans_handle *trans)
                smp_rmb();
 
                ret = update_dev_stat_item(trans, device);
-               if (!ret)
-                       atomic_sub(stats_cnt, &device->dev_stats_ccnt);
+               if (ret)
+                       break;
+               atomic_sub(stats_cnt, &device->dev_stats_ccnt);
        }
        mutex_unlock(&fs_devices->device_list_mutex);