Skip to content

Commit f5fcbc8

Browse files
committed
Merge tag 'bcachefs-2024-05-07.2' of https://evilpiepirate.org/git/bcachefs
Pull bcachefs fixes from Kent Overstreet: - Various syzbot fixes; mainly small gaps in validation - Fix an integer overflow in fiemap() which was preventing filefrag from returning the full list of extents - Fix a refcounting bug on the device refcount, turned up by new assertions in the development branch - Fix a device removal/readd bug; write_super() was repeatedly dropping and retaking bch_dev->io_ref references * tag 'bcachefs-2024-05-07.2' of https://evilpiepirate.org/git/bcachefs: bcachefs: Add missing sched_annotate_sleep() in bch2_journal_flush_seq_async() bcachefs: Fix race in bch2_write_super() bcachefs: BCH_SB_LAYOUT_SIZE_BITS_MAX bcachefs: Add missing skcipher_request_set_callback() call bcachefs: Fix snapshot_t() usage in bch2_fs_quota_read_inode() bcachefs: Fix shift-by-64 in bformat_needs_redo() bcachefs: Guard against unknown k.k->type in __bkey_invalid() bcachefs: Add missing validation for superblock section clean bcachefs: Fix assert in bch2_alloc_v4_invalid() bcachefs: fix overflow in fiemap bcachefs: Add a better limit for maximum number of buckets bcachefs: Fix lifetime issue in device iterator helpers bcachefs: Fix bch2_dev_lookup() refcounting bcachefs: Initialize bch_write_op->failed in inline data path bcachefs: Fix refcount put in sb_field_resize error path bcachefs: Inodes need extra padding for varint_decode_fast() bcachefs: Fix early error path in bch2_fs_btree_key_cache_exit() bcachefs: bucket_pos_to_bp_noerror() bcachefs: don't free error pointers bcachefs: Fix a scheduler splat in __bch2_next_write_buffer_flush_journal_buf()
2 parents 6d7ddd8 + 6e297a7 commit f5fcbc8

20 files changed

+150
-71
lines changed

fs/bcachefs/alloc_background.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -244,10 +244,10 @@ int bch2_alloc_v4_invalid(struct bch_fs *c, struct bkey_s_c k,
244244
struct bkey_s_c_alloc_v4 a = bkey_s_c_to_alloc_v4(k);
245245
int ret = 0;
246246

247-
bkey_fsck_err_on(alloc_v4_u64s(a.v) > bkey_val_u64s(k.k), c, err,
247+
bkey_fsck_err_on(alloc_v4_u64s_noerror(a.v) > bkey_val_u64s(k.k), c, err,
248248
alloc_v4_val_size_bad,
249249
"bad val size (%u > %zu)",
250-
alloc_v4_u64s(a.v), bkey_val_u64s(k.k));
250+
alloc_v4_u64s_noerror(a.v), bkey_val_u64s(k.k));
251251

252252
bkey_fsck_err_on(!BCH_ALLOC_V4_BACKPOINTERS_START(a.v) &&
253253
BCH_ALLOC_V4_NR_BACKPOINTERS(a.v), c, err,

fs/bcachefs/alloc_background.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,13 +126,17 @@ static inline struct bpos alloc_freespace_pos(struct bpos pos, struct bch_alloc_
126126
return pos;
127127
}
128128

129-
static inline unsigned alloc_v4_u64s(const struct bch_alloc_v4 *a)
129+
static inline unsigned alloc_v4_u64s_noerror(const struct bch_alloc_v4 *a)
130130
{
131-
unsigned ret = (BCH_ALLOC_V4_BACKPOINTERS_START(a) ?:
131+
return (BCH_ALLOC_V4_BACKPOINTERS_START(a) ?:
132132
BCH_ALLOC_V4_U64s_V0) +
133133
BCH_ALLOC_V4_NR_BACKPOINTERS(a) *
134134
(sizeof(struct bch_backpointer) / sizeof(u64));
135+
}
135136

137+
static inline unsigned alloc_v4_u64s(const struct bch_alloc_v4 *a)
138+
{
139+
unsigned ret = alloc_v4_u64s_noerror(a);
136140
BUG_ON(ret > U8_MAX - BKEY_U64s);
137141
return ret;
138142
}

fs/bcachefs/backpointers.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ int bch2_backpointer_invalid(struct bch_fs *c, struct bkey_s_c k,
5454
int ret = 0;
5555

5656
bkey_fsck_err_on((bp.v->bucket_offset >> MAX_EXTENT_COMPRESS_RATIO_SHIFT) >= ca->mi.bucket_size ||
57-
!bpos_eq(bp.k->p, bucket_pos_to_bp(c, bucket, bp.v->bucket_offset)),
57+
!bpos_eq(bp.k->p, bucket_pos_to_bp_noerror(ca, bucket, bp.v->bucket_offset)),
5858
c, err,
5959
backpointer_bucket_offset_wrong,
6060
"backpointer bucket_offset wrong");

fs/bcachefs/backpointers.h

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,15 @@ static inline struct bpos bp_pos_to_bucket(const struct bch_fs *c,
4545
return POS(bp_pos.inode, sector_to_bucket(ca, bucket_sector));
4646
}
4747

48+
static inline struct bpos bucket_pos_to_bp_noerror(const struct bch_dev *ca,
49+
struct bpos bucket,
50+
u64 bucket_offset)
51+
{
52+
return POS(bucket.inode,
53+
(bucket_to_sector(ca, bucket.offset) <<
54+
MAX_EXTENT_COMPRESS_RATIO_SHIFT) + bucket_offset);
55+
}
56+
4857
/*
4958
* Convert from pos in alloc btree + bucket offset to pos in backpointer btree:
5059
*/
@@ -53,10 +62,7 @@ static inline struct bpos bucket_pos_to_bp(const struct bch_fs *c,
5362
u64 bucket_offset)
5463
{
5564
struct bch_dev *ca = bch_dev_bkey_exists(c, bucket.inode);
56-
struct bpos ret = POS(bucket.inode,
57-
(bucket_to_sector(ca, bucket.offset) <<
58-
MAX_EXTENT_COMPRESS_RATIO_SHIFT) + bucket_offset);
59-
65+
struct bpos ret = bucket_pos_to_bp_noerror(ca, bucket, bucket_offset);
6066
EBUG_ON(!bkey_eq(bucket, bp_pos_to_bucket(c, ret)));
6167
return ret;
6268
}

fs/bcachefs/bcachefs_format.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -591,6 +591,12 @@ struct bch_member {
591591
__le64 btree_allocated_bitmap;
592592
};
593593

594+
/*
595+
* This limit comes from the bucket_gens array - it's a single allocation, and
596+
* kernel allocation are limited to INT_MAX
597+
*/
598+
#define BCH_MEMBER_NBUCKETS_MAX (INT_MAX - 64)
599+
594600
#define BCH_MEMBER_V1_BYTES 56
595601

596602
LE64_BITMASK(BCH_MEMBER_STATE, struct bch_member, flags, 0, 4)
@@ -897,6 +903,8 @@ unsigned bcachefs_metadata_required_upgrade_below = bcachefs_metadata_version_re
897903
#define BCH_SB_SECTOR 8
898904
#define BCH_SB_MEMBERS_MAX 64 /* XXX kill */
899905

906+
#define BCH_SB_LAYOUT_SIZE_BITS_MAX 16 /* 32 MB */
907+
900908
struct bch_sb_layout {
901909
__uuid_t magic; /* bcachefs superblock UUID */
902910
__u8 layout_type;

fs/bcachefs/bkey_methods.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -171,8 +171,8 @@ int __bch2_bkey_invalid(struct bch_fs *c, struct bkey_s_c k,
171171
if (type >= BKEY_TYPE_NR)
172172
return 0;
173173

174-
bkey_fsck_err_on((type == BKEY_TYPE_btree ||
175-
(flags & BKEY_INVALID_COMMIT)) &&
174+
bkey_fsck_err_on(k.k->type < KEY_TYPE_MAX &&
175+
(type == BKEY_TYPE_btree || (flags & BKEY_INVALID_COMMIT)) &&
176176
!(bch2_key_types_allowed[type] & BIT_ULL(k.k->type)), c, err,
177177
bkey_invalid_type_for_btree,
178178
"invalid key type for btree %s (%s)",

fs/bcachefs/btree_key_cache.c

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -956,13 +956,15 @@ void bch2_fs_btree_key_cache_exit(struct btree_key_cache *bc)
956956
}
957957

958958
#ifdef __KERNEL__
959-
for_each_possible_cpu(cpu) {
960-
struct btree_key_cache_freelist *f =
961-
per_cpu_ptr(bc->pcpu_freed, cpu);
962-
963-
for (i = 0; i < f->nr; i++) {
964-
ck = f->objs[i];
965-
list_add(&ck->list, &items);
959+
if (bc->pcpu_freed) {
960+
for_each_possible_cpu(cpu) {
961+
struct btree_key_cache_freelist *f =
962+
per_cpu_ptr(bc->pcpu_freed, cpu);
963+
964+
for (i = 0; i < f->nr; i++) {
965+
ck = f->objs[i];
966+
list_add(&ck->list, &items);
967+
}
966968
}
967969
}
968970
#endif

fs/bcachefs/checksum.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ static inline int do_encrypt_sg(struct crypto_sync_skcipher *tfm,
102102
int ret;
103103

104104
skcipher_request_set_sync_tfm(req, tfm);
105+
skcipher_request_set_callback(req, 0, NULL, NULL);
105106
skcipher_request_set_crypt(req, sg, sg, len, nonce.d);
106107

107108
ret = crypto_skcipher_encrypt(req);

fs/bcachefs/errcode.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,7 @@
175175
x(EINVAL, block_size_too_small) \
176176
x(EINVAL, bucket_size_too_small) \
177177
x(EINVAL, device_size_too_small) \
178+
x(EINVAL, device_size_too_big) \
178179
x(EINVAL, device_not_a_member_of_filesystem) \
179180
x(EINVAL, device_has_been_removed) \
180181
x(EINVAL, device_splitbrain) \

fs/bcachefs/fs.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -964,7 +964,6 @@ static int bch2_fiemap(struct inode *vinode, struct fiemap_extent_info *info,
964964
struct btree_iter iter;
965965
struct bkey_s_c k;
966966
struct bkey_buf cur, prev;
967-
struct bpos end = POS(ei->v.i_ino, (start + len) >> 9);
968967
unsigned offset_into_extent, sectors;
969968
bool have_extent = false;
970969
u32 snapshot;
@@ -974,6 +973,7 @@ static int bch2_fiemap(struct inode *vinode, struct fiemap_extent_info *info,
974973
if (ret)
975974
return ret;
976975

976+
struct bpos end = POS(ei->v.i_ino, (start + len) >> 9);
977977
if (start + len < start)
978978
return -EINVAL;
979979

0 commit comments

Comments
 (0)