Commit cd9f3dfe authored by Kent Overstreet's avatar Kent Overstreet Committed by Kent Overstreet

bcachefs: Fix integer overflow in bch2_disk_reservation_get()

The sectors argument shouldn't have been a u32 - it can be up to U32_MAX
(i.e. fallocate creating persistent reservations), and if replication is
enabled we'll overflow when we calculate the real number of sectors to
reserve. Oops.
Signed-off-by: default avatarKent Overstreet <kent.overstreet@gmail.com>
Signed-off-by: default avatarKent Overstreet <kent.overstreet@linux.dev>
parent 280249b9
...@@ -2109,7 +2109,7 @@ int bch2_trans_mark_update(struct btree_trans *trans, ...@@ -2109,7 +2109,7 @@ int bch2_trans_mark_update(struct btree_trans *trans,
#define SECTORS_CACHE 1024 #define SECTORS_CACHE 1024
int bch2_disk_reservation_add(struct bch_fs *c, struct disk_reservation *res, int bch2_disk_reservation_add(struct bch_fs *c, struct disk_reservation *res,
unsigned sectors, int flags) u64 sectors, int flags)
{ {
struct bch_fs_pcpu *pcpu; struct bch_fs_pcpu *pcpu;
u64 old, v, get; u64 old, v, get;
......
...@@ -282,8 +282,8 @@ static inline void bch2_disk_reservation_put(struct bch_fs *c, ...@@ -282,8 +282,8 @@ static inline void bch2_disk_reservation_put(struct bch_fs *c,
#define BCH_DISK_RESERVATION_NOFAIL (1 << 0) #define BCH_DISK_RESERVATION_NOFAIL (1 << 0)
int bch2_disk_reservation_add(struct bch_fs *, int bch2_disk_reservation_add(struct bch_fs *,
struct disk_reservation *, struct disk_reservation *,
unsigned, int); u64, int);
static inline struct disk_reservation static inline struct disk_reservation
bch2_disk_reservation_init(struct bch_fs *c, unsigned nr_replicas) bch2_disk_reservation_init(struct bch_fs *c, unsigned nr_replicas)
...@@ -300,8 +300,7 @@ bch2_disk_reservation_init(struct bch_fs *c, unsigned nr_replicas) ...@@ -300,8 +300,7 @@ bch2_disk_reservation_init(struct bch_fs *c, unsigned nr_replicas)
static inline int bch2_disk_reservation_get(struct bch_fs *c, static inline int bch2_disk_reservation_get(struct bch_fs *c,
struct disk_reservation *res, struct disk_reservation *res,
unsigned sectors, u64 sectors, unsigned nr_replicas,
unsigned nr_replicas,
int flags) int flags)
{ {
*res = bch2_disk_reservation_init(c, nr_replicas); *res = bch2_disk_reservation_init(c, nr_replicas);
......
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