Skip to content

Commit 56770e2

Browse files
committed
Merge tag 'bcachefs-2025-04-03' of git://evilpiepirate.org/bcachefs
Pull more bcachefs updates from Kent Overstreet: "More notable fixes: - Fix for striping behaviour on tiering filesystems where replicas exceeds durability on destination target - Fix a race in device removal where deleting alloc info races with the discard worker - Some small stack usage improvements: this is just enough for KMSAN builds to not blow the stack, more is queued up for 6.16" * tag 'bcachefs-2025-04-03' of git://evilpiepirate.org/bcachefs: bcachefs: Fix "journal stuck" during recovery bcachefs: backpointer_get_key: check for null from peek_slot() bcachefs: Fix null ptr deref in invalidate_one_bucket() bcachefs: Fix check_snapshot_exists() restart handling bcachefs: use nonblocking variant of print_string_as_lines in error path bcachefs: Fix scheduling while atomic from logging changes bcachefs: Add error handling for zlib_deflateInit2() bcachefs: add missing selection of XARRAY_MULTI bcachefs: bch_dev_usage_full bcachefs: Kill btree_iter.trans bcachefs: do_trace_key_cache_fill() bcachefs: Split up bch_dev.io_ref bcachefs: fix ref leak in btree_node_read_all_replicas bcachefs: Fix null ptr deref in bch2_write_endio() bcachefs: Fix field spanning write warning bcachefs: Fix striping behaviour
2 parents bdafff6 + 77ad1df commit 56770e2

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

58 files changed

+710
-549
lines changed

fs/bcachefs/Kconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ config BCACHEFS_FS
2626
select SRCU
2727
select SYMBOLIC_ERRNAME
2828
select MIN_HEAP
29+
select XARRAY_MULTI
2930
help
3031
The bcachefs filesystem - a modern, copy on write filesystem, with
3132
support for multiple devices, compression, checksumming, etc.

fs/bcachefs/acl.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,7 @@ struct posix_acl *bch2_get_acl(struct inode *vinode, int type, bool rcu)
273273
struct bch_fs *c = inode->v.i_sb->s_fs_info;
274274
struct bch_hash_info hash = bch2_hash_info_init(c, &inode->ei_inode);
275275
struct xattr_search_key search = X_SEARCH(acl_to_xattr_type(type), "", 0);
276-
struct btree_iter iter = { NULL };
276+
struct btree_iter iter = {};
277277
struct posix_acl *acl = NULL;
278278

279279
if (rcu)
@@ -344,7 +344,7 @@ int bch2_set_acl(struct mnt_idmap *idmap,
344344
{
345345
struct bch_inode_info *inode = to_bch_ei(dentry->d_inode);
346346
struct bch_fs *c = inode->v.i_sb->s_fs_info;
347-
struct btree_iter inode_iter = { NULL };
347+
struct btree_iter inode_iter = {};
348348
struct bch_inode_unpacked inode_u;
349349
struct posix_acl *acl;
350350
umode_t mode;

fs/bcachefs/alloc_background.c

Lines changed: 50 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -610,7 +610,7 @@ int bch2_alloc_read(struct bch_fs *c)
610610
* bch2_check_alloc_key() which runs later:
611611
*/
612612
if (!ca) {
613-
bch2_btree_iter_set_pos(&iter, POS(k.k->p.inode + 1, 0));
613+
bch2_btree_iter_set_pos(trans, &iter, POS(k.k->p.inode + 1, 0));
614614
continue;
615615
}
616616

@@ -631,17 +631,17 @@ int bch2_alloc_read(struct bch_fs *c)
631631
* bch2_check_alloc_key() which runs later:
632632
*/
633633
if (!ca) {
634-
bch2_btree_iter_set_pos(&iter, POS(k.k->p.inode + 1, 0));
634+
bch2_btree_iter_set_pos(trans, &iter, POS(k.k->p.inode + 1, 0));
635635
continue;
636636
}
637637

638638
if (k.k->p.offset < ca->mi.first_bucket) {
639-
bch2_btree_iter_set_pos(&iter, POS(k.k->p.inode, ca->mi.first_bucket));
639+
bch2_btree_iter_set_pos(trans, &iter, POS(k.k->p.inode, ca->mi.first_bucket));
640640
continue;
641641
}
642642

643643
if (k.k->p.offset >= ca->mi.nbuckets) {
644-
bch2_btree_iter_set_pos(&iter, POS(k.k->p.inode + 1, 0));
644+
bch2_btree_iter_set_pos(trans, &iter, POS(k.k->p.inode + 1, 0));
645645
continue;
646646
}
647647

@@ -1039,9 +1039,10 @@ int bch2_trigger_alloc(struct btree_trans *trans,
10391039
* This synthesizes deleted extents for holes, similar to BTREE_ITER_slots for
10401040
* extents style btrees, but works on non-extents btrees:
10411041
*/
1042-
static struct bkey_s_c bch2_get_key_or_hole(struct btree_iter *iter, struct bpos end, struct bkey *hole)
1042+
static struct bkey_s_c bch2_get_key_or_hole(struct btree_trans *trans, struct btree_iter *iter,
1043+
struct bpos end, struct bkey *hole)
10431044
{
1044-
struct bkey_s_c k = bch2_btree_iter_peek_slot(iter);
1045+
struct bkey_s_c k = bch2_btree_iter_peek_slot(trans, iter);
10451046

10461047
if (bkey_err(k))
10471048
return k;
@@ -1052,9 +1053,9 @@ static struct bkey_s_c bch2_get_key_or_hole(struct btree_iter *iter, struct bpos
10521053
struct btree_iter iter2;
10531054
struct bpos next;
10541055

1055-
bch2_trans_copy_iter(&iter2, iter);
1056+
bch2_trans_copy_iter(trans, &iter2, iter);
10561057

1057-
struct btree_path *path = btree_iter_path(iter->trans, iter);
1058+
struct btree_path *path = btree_iter_path(trans, iter);
10581059
if (!bpos_eq(path->l[0].b->key.k.p, SPOS_MAX))
10591060
end = bkey_min(end, bpos_nosnap_successor(path->l[0].b->key.k.p));
10601061

@@ -1064,9 +1065,9 @@ static struct bkey_s_c bch2_get_key_or_hole(struct btree_iter *iter, struct bpos
10641065
* btree node min/max is a closed interval, upto takes a half
10651066
* open interval:
10661067
*/
1067-
k = bch2_btree_iter_peek_max(&iter2, end);
1068+
k = bch2_btree_iter_peek_max(trans, &iter2, end);
10681069
next = iter2.pos;
1069-
bch2_trans_iter_exit(iter->trans, &iter2);
1070+
bch2_trans_iter_exit(trans, &iter2);
10701071

10711072
BUG_ON(next.offset >= iter->pos.offset + U32_MAX);
10721073

@@ -1107,13 +1108,14 @@ static bool next_bucket(struct bch_fs *c, struct bch_dev **ca, struct bpos *buck
11071108
return *ca != NULL;
11081109
}
11091110

1110-
static struct bkey_s_c bch2_get_key_or_real_bucket_hole(struct btree_iter *iter,
1111-
struct bch_dev **ca, struct bkey *hole)
1111+
static struct bkey_s_c bch2_get_key_or_real_bucket_hole(struct btree_trans *trans,
1112+
struct btree_iter *iter,
1113+
struct bch_dev **ca, struct bkey *hole)
11121114
{
1113-
struct bch_fs *c = iter->trans->c;
1115+
struct bch_fs *c = trans->c;
11141116
struct bkey_s_c k;
11151117
again:
1116-
k = bch2_get_key_or_hole(iter, POS_MAX, hole);
1118+
k = bch2_get_key_or_hole(trans, iter, POS_MAX, hole);
11171119
if (bkey_err(k))
11181120
return k;
11191121

@@ -1126,7 +1128,7 @@ static struct bkey_s_c bch2_get_key_or_real_bucket_hole(struct btree_iter *iter,
11261128
if (!next_bucket(c, ca, &hole_start))
11271129
return bkey_s_c_null;
11281130

1129-
bch2_btree_iter_set_pos(iter, hole_start);
1131+
bch2_btree_iter_set_pos(trans, iter, hole_start);
11301132
goto again;
11311133
}
11321134

@@ -1167,8 +1169,8 @@ int bch2_check_alloc_key(struct btree_trans *trans,
11671169

11681170
a = bch2_alloc_to_v4(alloc_k, &a_convert);
11691171

1170-
bch2_btree_iter_set_pos(discard_iter, alloc_k.k->p);
1171-
k = bch2_btree_iter_peek_slot(discard_iter);
1172+
bch2_btree_iter_set_pos(trans, discard_iter, alloc_k.k->p);
1173+
k = bch2_btree_iter_peek_slot(trans, discard_iter);
11721174
ret = bkey_err(k);
11731175
if (ret)
11741176
goto err;
@@ -1181,8 +1183,8 @@ int bch2_check_alloc_key(struct btree_trans *trans,
11811183
goto err;
11821184
}
11831185

1184-
bch2_btree_iter_set_pos(freespace_iter, alloc_freespace_pos(alloc_k.k->p, *a));
1185-
k = bch2_btree_iter_peek_slot(freespace_iter);
1186+
bch2_btree_iter_set_pos(trans, freespace_iter, alloc_freespace_pos(alloc_k.k->p, *a));
1187+
k = bch2_btree_iter_peek_slot(trans, freespace_iter);
11861188
ret = bkey_err(k);
11871189
if (ret)
11881190
goto err;
@@ -1195,8 +1197,8 @@ int bch2_check_alloc_key(struct btree_trans *trans,
11951197
goto err;
11961198
}
11971199

1198-
bch2_btree_iter_set_pos(bucket_gens_iter, alloc_gens_pos(alloc_k.k->p, &gens_offset));
1199-
k = bch2_btree_iter_peek_slot(bucket_gens_iter);
1200+
bch2_btree_iter_set_pos(trans, bucket_gens_iter, alloc_gens_pos(alloc_k.k->p, &gens_offset));
1201+
k = bch2_btree_iter_peek_slot(trans, bucket_gens_iter);
12001202
ret = bkey_err(k);
12011203
if (ret)
12021204
goto err;
@@ -1249,9 +1251,9 @@ int bch2_check_alloc_hole_freespace(struct btree_trans *trans,
12491251
if (!ca->mi.freespace_initialized)
12501252
return 0;
12511253

1252-
bch2_btree_iter_set_pos(freespace_iter, start);
1254+
bch2_btree_iter_set_pos(trans, freespace_iter, start);
12531255

1254-
k = bch2_btree_iter_peek_slot(freespace_iter);
1256+
k = bch2_btree_iter_peek_slot(trans, freespace_iter);
12551257
ret = bkey_err(k);
12561258
if (ret)
12571259
goto err;
@@ -1300,9 +1302,9 @@ int bch2_check_alloc_hole_bucket_gens(struct btree_trans *trans,
13001302
unsigned i, gens_offset, gens_end_offset;
13011303
int ret;
13021304

1303-
bch2_btree_iter_set_pos(bucket_gens_iter, alloc_gens_pos(start, &gens_offset));
1305+
bch2_btree_iter_set_pos(trans, bucket_gens_iter, alloc_gens_pos(start, &gens_offset));
13041306

1305-
k = bch2_btree_iter_peek_slot(bucket_gens_iter);
1307+
k = bch2_btree_iter_peek_slot(trans, bucket_gens_iter);
13061308
ret = bkey_err(k);
13071309
if (ret)
13081310
goto err;
@@ -1435,7 +1437,7 @@ int bch2_check_discard_freespace_key(struct btree_trans *trans, struct btree_ite
14351437
*gen = a->gen;
14361438
out:
14371439
fsck_err:
1438-
bch2_set_btree_iter_dontneed(&alloc_iter);
1440+
bch2_set_btree_iter_dontneed(trans, &alloc_iter);
14391441
bch2_trans_iter_exit(trans, &alloc_iter);
14401442
printbuf_exit(&buf);
14411443
return ret;
@@ -1572,7 +1574,7 @@ int bch2_check_alloc_info(struct bch_fs *c)
15721574

15731575
bch2_trans_begin(trans);
15741576

1575-
k = bch2_get_key_or_real_bucket_hole(&iter, &ca, &hole);
1577+
k = bch2_get_key_or_real_bucket_hole(trans, &iter, &ca, &hole);
15761578
ret = bkey_err(k);
15771579
if (ret)
15781580
goto bkey_err;
@@ -1610,7 +1612,7 @@ int bch2_check_alloc_info(struct bch_fs *c)
16101612
if (ret)
16111613
goto bkey_err;
16121614

1613-
bch2_btree_iter_set_pos(&iter, next);
1615+
bch2_btree_iter_set_pos(trans, &iter, next);
16141616
bkey_err:
16151617
if (bch2_err_matches(ret, BCH_ERR_transaction_restart))
16161618
continue;
@@ -1638,7 +1640,7 @@ int bch2_check_alloc_info(struct bch_fs *c)
16381640
BTREE_ITER_prefetch);
16391641
while (1) {
16401642
bch2_trans_begin(trans);
1641-
k = bch2_btree_iter_peek(&iter);
1643+
k = bch2_btree_iter_peek(trans, &iter);
16421644
if (!k.k)
16431645
break;
16441646

@@ -1657,7 +1659,7 @@ int bch2_check_alloc_info(struct bch_fs *c)
16571659
break;
16581660
}
16591661

1660-
bch2_btree_iter_set_pos(&iter, bpos_nosnap_successor(iter.pos));
1662+
bch2_btree_iter_set_pos(trans, &iter, bpos_nosnap_successor(iter.pos));
16611663
}
16621664
bch2_trans_iter_exit(trans, &iter);
16631665
if (ret)
@@ -1685,7 +1687,7 @@ static int bch2_check_alloc_to_lru_ref(struct btree_trans *trans,
16851687
struct printbuf buf = PRINTBUF;
16861688
int ret;
16871689

1688-
alloc_k = bch2_btree_iter_peek(alloc_iter);
1690+
alloc_k = bch2_btree_iter_peek(trans, alloc_iter);
16891691
if (!alloc_k.k)
16901692
return 0;
16911693

@@ -1826,7 +1828,7 @@ static int bch2_discard_one_bucket(struct btree_trans *trans,
18261828
{
18271829
struct bch_fs *c = trans->c;
18281830
struct bpos pos = need_discard_iter->pos;
1829-
struct btree_iter iter = { NULL };
1831+
struct btree_iter iter = {};
18301832
struct bkey_s_c k;
18311833
struct bkey_i_alloc_v4 *a;
18321834
struct printbuf buf = PRINTBUF;
@@ -1950,7 +1952,7 @@ static void bch2_do_discards_work(struct work_struct *work)
19501952
trace_discard_buckets(c, s.seen, s.open, s.need_journal_commit, s.discarded,
19511953
bch2_err_str(ret));
19521954

1953-
percpu_ref_put(&ca->io_ref);
1955+
percpu_ref_put(&ca->io_ref[WRITE]);
19541956
bch2_write_ref_put(c, BCH_WRITE_REF_discard);
19551957
}
19561958

@@ -1967,7 +1969,7 @@ void bch2_dev_do_discards(struct bch_dev *ca)
19671969
if (queue_work(c->write_ref_wq, &ca->discard_work))
19681970
return;
19691971

1970-
percpu_ref_put(&ca->io_ref);
1972+
percpu_ref_put(&ca->io_ref[WRITE]);
19711973
put_write_ref:
19721974
bch2_write_ref_put(c, BCH_WRITE_REF_discard);
19731975
}
@@ -2045,7 +2047,7 @@ static void bch2_do_discards_fast_work(struct work_struct *work)
20452047
trace_discard_buckets_fast(c, s.seen, s.open, s.need_journal_commit, s.discarded, bch2_err_str(ret));
20462048

20472049
bch2_trans_put(trans);
2048-
percpu_ref_put(&ca->io_ref);
2050+
percpu_ref_put(&ca->io_ref[WRITE]);
20492051
bch2_write_ref_put(c, BCH_WRITE_REF_discard_fast);
20502052
}
20512053

@@ -2065,7 +2067,7 @@ static void bch2_discard_one_bucket_fast(struct bch_dev *ca, u64 bucket)
20652067
if (queue_work(c->write_ref_wq, &ca->discard_fast_work))
20662068
return;
20672069

2068-
percpu_ref_put(&ca->io_ref);
2070+
percpu_ref_put(&ca->io_ref[WRITE]);
20692071
put_ref:
20702072
bch2_write_ref_put(c, BCH_WRITE_REF_discard_fast);
20712073
}
@@ -2082,6 +2084,9 @@ static int invalidate_one_bp(struct btree_trans *trans,
20822084
if (ret)
20832085
return ret;
20842086

2087+
if (!extent_k.k)
2088+
return 0;
2089+
20852090
struct bkey_i *n =
20862091
bch2_bkey_make_mut(trans, &extent_iter, &extent_k,
20872092
BTREE_UPDATE_internal_snapshot_node);
@@ -2199,9 +2204,9 @@ static struct bkey_s_c next_lru_key(struct btree_trans *trans, struct btree_iter
21992204
{
22002205
struct bkey_s_c k;
22012206
again:
2202-
k = bch2_btree_iter_peek_max(iter, lru_pos(ca->dev_idx, U64_MAX, LRU_TIME_MAX));
2207+
k = bch2_btree_iter_peek_max(trans, iter, lru_pos(ca->dev_idx, U64_MAX, LRU_TIME_MAX));
22032208
if (!k.k && !*wrapped) {
2204-
bch2_btree_iter_set_pos(iter, lru_pos(ca->dev_idx, 0, 0));
2209+
bch2_btree_iter_set_pos(trans, iter, lru_pos(ca->dev_idx, 0, 0));
22052210
*wrapped = true;
22062211
goto again;
22072212
}
@@ -2251,12 +2256,12 @@ static void bch2_do_invalidates_work(struct work_struct *work)
22512256
if (ret)
22522257
break;
22532258

2254-
bch2_btree_iter_advance(&iter);
2259+
bch2_btree_iter_advance(trans, &iter);
22552260
}
22562261
bch2_trans_iter_exit(trans, &iter);
22572262
err:
22582263
bch2_trans_put(trans);
2259-
percpu_ref_put(&ca->io_ref);
2264+
percpu_ref_put(&ca->io_ref[WRITE]);
22602265
bch2_bkey_buf_exit(&last_flushed, c);
22612266
bch2_write_ref_put(c, BCH_WRITE_REF_invalidate);
22622267
}
@@ -2274,7 +2279,7 @@ void bch2_dev_do_invalidates(struct bch_dev *ca)
22742279
if (queue_work(c->write_ref_wq, &ca->invalidate_work))
22752280
return;
22762281

2277-
percpu_ref_put(&ca->io_ref);
2282+
percpu_ref_put(&ca->io_ref[WRITE]);
22782283
put_ref:
22792284
bch2_write_ref_put(c, BCH_WRITE_REF_invalidate);
22802285
}
@@ -2321,7 +2326,7 @@ int bch2_dev_freespace_init(struct bch_fs *c, struct bch_dev *ca,
23212326
break;
23222327
}
23232328

2324-
k = bch2_get_key_or_hole(&iter, end, &hole);
2329+
k = bch2_get_key_or_hole(trans, &iter, end, &hole);
23252330
ret = bkey_err(k);
23262331
if (ret)
23272332
goto bkey_err;
@@ -2340,7 +2345,7 @@ int bch2_dev_freespace_init(struct bch_fs *c, struct bch_dev *ca,
23402345
if (ret)
23412346
goto bkey_err;
23422347

2343-
bch2_btree_iter_advance(&iter);
2348+
bch2_btree_iter_advance(trans, &iter);
23442349
} else {
23452350
struct bkey_i *freespace;
23462351

@@ -2360,7 +2365,7 @@ int bch2_dev_freespace_init(struct bch_fs *c, struct bch_dev *ca,
23602365
if (ret)
23612366
goto bkey_err;
23622367

2363-
bch2_btree_iter_set_pos(&iter, k.k->p);
2368+
bch2_btree_iter_set_pos(trans, &iter, k.k->p);
23642369
}
23652370
bkey_err:
23662371
if (bch2_err_matches(ret, BCH_ERR_transaction_restart))
@@ -2506,7 +2511,7 @@ void bch2_recalc_capacity(struct bch_fs *c)
25062511

25072512
bch2_set_ra_pages(c, ra_pages);
25082513

2509-
for_each_rw_member(c, ca) {
2514+
__for_each_online_member(c, ca, BIT(BCH_MEMBER_STATE_rw), READ) {
25102515
u64 dev_reserve = 0;
25112516

25122517
/*

fs/bcachefs/alloc_background.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -321,11 +321,11 @@ static inline u64 should_invalidate_buckets(struct bch_dev *ca,
321321
{
322322
u64 want_free = ca->mi.nbuckets >> 7;
323323
u64 free = max_t(s64, 0,
324-
u.d[BCH_DATA_free].buckets
325-
+ u.d[BCH_DATA_need_discard].buckets
324+
u.buckets[BCH_DATA_free]
325+
+ u.buckets[BCH_DATA_need_discard]
326326
- bch2_dev_buckets_reserved(ca, BCH_WATERMARK_stripe));
327327

328-
return clamp_t(s64, want_free - free, 0, u.d[BCH_DATA_cached].buckets);
328+
return clamp_t(s64, want_free - free, 0, u.buckets[BCH_DATA_cached]);
329329
}
330330

331331
void bch2_dev_do_invalidates(struct bch_dev *);

0 commit comments

Comments
 (0)