bcachefs: Check for backpointer bucket_offset >= bucket size
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
parent
27c15ed297
commit
f0a73d4fde
|
@ -49,13 +49,15 @@ int bch2_backpointer_invalid(struct bch_fs *c, struct bkey_s_c k,
|
||||||
if (!bch2_dev_exists2(c, bp.k->p.inode))
|
if (!bch2_dev_exists2(c, bp.k->p.inode))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
struct bch_dev *ca = bch_dev_bkey_exists(c, bp.k->p.inode);
|
||||||
struct bpos bucket = bp_pos_to_bucket(c, bp.k->p);
|
struct bpos bucket = bp_pos_to_bucket(c, bp.k->p);
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
bkey_fsck_err_on(!bpos_eq(bp.k->p, bucket_pos_to_bp(c, bucket, bp.v->bucket_offset)),
|
bkey_fsck_err_on((bp.v->bucket_offset >> MAX_EXTENT_COMPRESS_RATIO_SHIFT) >= ca->mi.bucket_size ||
|
||||||
|
!bpos_eq(bp.k->p, bucket_pos_to_bp(c, bucket, bp.v->bucket_offset)),
|
||||||
c, err,
|
c, err,
|
||||||
backpointer_pos_wrong,
|
backpointer_bucket_offset_wrong,
|
||||||
"backpointer at wrong pos");
|
"backpointer bucket_offset wrong");
|
||||||
fsck_err:
|
fsck_err:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -53,14 +53,11 @@ static inline struct bpos bucket_pos_to_bp(const struct bch_fs *c,
|
||||||
u64 bucket_offset)
|
u64 bucket_offset)
|
||||||
{
|
{
|
||||||
struct bch_dev *ca = bch_dev_bkey_exists(c, bucket.inode);
|
struct bch_dev *ca = bch_dev_bkey_exists(c, bucket.inode);
|
||||||
struct bpos ret;
|
struct bpos ret = POS(bucket.inode,
|
||||||
|
(bucket_to_sector(ca, bucket.offset) <<
|
||||||
ret = POS(bucket.inode,
|
MAX_EXTENT_COMPRESS_RATIO_SHIFT) + bucket_offset);
|
||||||
(bucket_to_sector(ca, bucket.offset) <<
|
|
||||||
MAX_EXTENT_COMPRESS_RATIO_SHIFT) + bucket_offset);
|
|
||||||
|
|
||||||
EBUG_ON(!bkey_eq(bucket, bp_pos_to_bucket(c, ret)));
|
EBUG_ON(!bkey_eq(bucket, bp_pos_to_bucket(c, ret)));
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -130,7 +130,7 @@
|
||||||
x(bucket_gens_nonzero_for_invalid_buckets, 122) \
|
x(bucket_gens_nonzero_for_invalid_buckets, 122) \
|
||||||
x(need_discard_freespace_key_to_invalid_dev_bucket, 123) \
|
x(need_discard_freespace_key_to_invalid_dev_bucket, 123) \
|
||||||
x(need_discard_freespace_key_bad, 124) \
|
x(need_discard_freespace_key_bad, 124) \
|
||||||
x(backpointer_pos_wrong, 125) \
|
x(backpointer_bucket_offset_wrong, 125) \
|
||||||
x(backpointer_to_missing_device, 126) \
|
x(backpointer_to_missing_device, 126) \
|
||||||
x(backpointer_to_missing_alloc, 127) \
|
x(backpointer_to_missing_alloc, 127) \
|
||||||
x(backpointer_to_missing_ptr, 128) \
|
x(backpointer_to_missing_ptr, 128) \
|
||||||
|
|
Loading…
Reference in New Issue