@@ -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 ;
11151117again :
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 ;
14361438out :
14371439fsck_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 );
16141616bkey_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 ] );
19711973put_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 ] );
20692071put_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 ;
22012206again :
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 );
22572262err :
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 ] );
22782283put_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 }
23652370bkey_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 /*
0 commit comments