Commit 0ef6447a authored by Feifei Xu's avatar Feifei Xu Committed by David Sterba

Btrfs: Fix integer overflow when calculating bytes_per_bitmap

On ppc64, bytes_per_bitmap will be (65536*8*65536). Hence append UL to
fix integer overflow.
Reviewed-by: default avatarJosef Bacik <jbacik@fb.com>
Reviewed-by: default avatarChandan Rajendra <chandan@linux.vnet.ibm.com>
Signed-off-by: default avatarFeifei Xu <xufeifei@linux.vnet.ibm.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent 5473e0c4
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
#include "inode-map.h" #include "inode-map.h"
#include "volumes.h" #include "volumes.h"
#define BITS_PER_BITMAP (PAGE_SIZE * 8) #define BITS_PER_BITMAP (PAGE_SIZE * 8UL)
#define MAX_CACHE_BYTES_PER_GIG SZ_32K #define MAX_CACHE_BYTES_PER_GIG SZ_32K
struct btrfs_trim_range { struct btrfs_trim_range {
...@@ -1415,11 +1415,11 @@ static inline u64 offset_to_bitmap(struct btrfs_free_space_ctl *ctl, ...@@ -1415,11 +1415,11 @@ static inline u64 offset_to_bitmap(struct btrfs_free_space_ctl *ctl,
u64 offset) u64 offset)
{ {
u64 bitmap_start; u64 bitmap_start;
u32 bytes_per_bitmap; u64 bytes_per_bitmap;
bytes_per_bitmap = BITS_PER_BITMAP * ctl->unit; bytes_per_bitmap = BITS_PER_BITMAP * ctl->unit;
bitmap_start = offset - ctl->start; bitmap_start = offset - ctl->start;
bitmap_start = div_u64(bitmap_start, bytes_per_bitmap); bitmap_start = div64_u64(bitmap_start, bytes_per_bitmap);
bitmap_start *= bytes_per_bitmap; bitmap_start *= bytes_per_bitmap;
bitmap_start += ctl->start; bitmap_start += ctl->start;
...@@ -1638,10 +1638,10 @@ static void recalculate_thresholds(struct btrfs_free_space_ctl *ctl) ...@@ -1638,10 +1638,10 @@ static void recalculate_thresholds(struct btrfs_free_space_ctl *ctl)
u64 bitmap_bytes; u64 bitmap_bytes;
u64 extent_bytes; u64 extent_bytes;
u64 size = block_group->key.offset; u64 size = block_group->key.offset;
u32 bytes_per_bg = BITS_PER_BITMAP * ctl->unit; u64 bytes_per_bg = BITS_PER_BITMAP * ctl->unit;
u32 max_bitmaps = div_u64(size + bytes_per_bg - 1, bytes_per_bg); u64 max_bitmaps = div64_u64(size + bytes_per_bg - 1, bytes_per_bg);
max_bitmaps = max_t(u32, max_bitmaps, 1); max_bitmaps = max_t(u64, max_bitmaps, 1);
ASSERT(ctl->total_bitmaps <= max_bitmaps); ASSERT(ctl->total_bitmaps <= max_bitmaps);
......
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
#include "../disk-io.h" #include "../disk-io.h"
#include "../free-space-cache.h" #include "../free-space-cache.h"
#define BITS_PER_BITMAP (PAGE_SIZE * 8) #define BITS_PER_BITMAP (PAGE_SIZE * 8UL)
/* /*
* This test just does basic sanity checking, making sure we can add an extent * This test just does basic sanity checking, making sure we can add an extent
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment