]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
btrfs: scrub: replace max_t()/min_t() with clamp() in scrub_throttle_dev_io()
authorThorsten Blum <thorsten.blum@linux.dev>
Mon, 1 Sep 2025 15:01:44 +0000 (17:01 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 2 Nov 2025 13:18:04 +0000 (22:18 +0900)
[ Upstream commit a7f3dfb8293c4cee99743132d69863a92e8f4875 ]

Replace max_t() followed by min_t() with a single clamp().

As was pointed by David Laight in
https://lore.kernel.org/linux-btrfs/20250906122458.75dfc8f0@pumpkin/
the calculation may overflow u32 when the input value is too large, so
clamp_t() is not used.  In practice the expected values are in range of
megabytes to gigabytes (throughput limit) so the bug would not happen.

Signed-off-by: Thorsten Blum <thorsten.blum@linux.dev>
Reviewed-by: David Sterba <dsterba@suse.com>
[ Use clamp() and add explanation. ]
Signed-off-by: David Sterba <dsterba@suse.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
fs/btrfs/scrub.c

index 6776e6ab8d108055b0961a5996e5ea9f889c5845..fd4c1ca34b5e4731158f6b87c3a6d192f3d69226 100644 (file)
@@ -1369,8 +1369,7 @@ static void scrub_throttle_dev_io(struct scrub_ctx *sctx, struct btrfs_device *d
         * Slice is divided into intervals when the IO is submitted, adjust by
         * bwlimit and maximum of 64 intervals.
         */
-       div = max_t(u32, 1, (u32)(bwlimit / (16 * 1024 * 1024)));
-       div = min_t(u32, 64, div);
+       div = clamp(bwlimit / (16 * 1024 * 1024), 1, 64);
 
        /* Start new epoch, set deadline */
        now = ktime_get();