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

bcachefs: Don't BUG_ON() sector count overflow

Return an error instead (still work in progress...)
Signed-off-by: default avatarKent Overstreet <kent.overstreet@gmail.com>
Signed-off-by: default avatarKent Overstreet <kent.overstreet@linux.dev>
parent 677fc056
...@@ -1464,7 +1464,7 @@ static int bch2_trans_mark_pointer(struct btree_trans *trans, ...@@ -1464,7 +1464,7 @@ static int bch2_trans_mark_pointer(struct btree_trans *trans,
struct bkey_s_c k; struct bkey_s_c k;
struct bkey_alloc_unpacked u; struct bkey_alloc_unpacked u;
struct bkey_i_alloc *a; struct bkey_i_alloc *a;
unsigned old; u16 *dst_sectors;
bool overflow; bool overflow;
int ret; int ret;
...@@ -1519,22 +1519,24 @@ static int bch2_trans_mark_pointer(struct btree_trans *trans, ...@@ -1519,22 +1519,24 @@ static int bch2_trans_mark_pointer(struct btree_trans *trans,
goto out; goto out;
} }
if (!p.ptr.cached) { dst_sectors = !p.ptr.cached
old = u.dirty_sectors; ? &u.dirty_sectors
overflow = checked_add(u.dirty_sectors, sectors); : &u.cached_sectors;
} else {
old = u.cached_sectors; overflow = checked_add(*dst_sectors, sectors);
overflow = checked_add(u.cached_sectors, sectors);
if (overflow) {
bch2_fs_inconsistent(c,
"bucket sector count overflow: %u + %lli > U16_MAX",
*dst_sectors, sectors);
/* return an error indicating that we need full fsck */
ret = -EIO;
goto out;
} }
u.data_type = u.dirty_sectors || u.cached_sectors u.data_type = u.dirty_sectors || u.cached_sectors
? data_type : 0; ? data_type : 0;
bch2_fs_inconsistent_on(overflow, c,
"bucket sector count overflow: %u + %lli > U16_MAX",
old, sectors);
BUG_ON(overflow);
a = trans_update_key(trans, iter, BKEY_ALLOC_U64s_MAX); a = trans_update_key(trans, iter, BKEY_ALLOC_U64s_MAX);
ret = PTR_ERR_OR_ZERO(a); ret = PTR_ERR_OR_ZERO(a);
if (ret) if (ret)
......
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