@@ -610,7 +610,7 @@ int bch2_alloc_read(struct bch_fs *c)
610
610
* bch2_check_alloc_key() which runs later:
611
611
*/
612
612
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 ));
614
614
continue ;
615
615
}
616
616
@@ -631,17 +631,17 @@ int bch2_alloc_read(struct bch_fs *c)
631
631
* bch2_check_alloc_key() which runs later:
632
632
*/
633
633
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 ));
635
635
continue ;
636
636
}
637
637
638
638
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 ));
640
640
continue ;
641
641
}
642
642
643
643
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 ));
645
645
continue ;
646
646
}
647
647
@@ -1039,9 +1039,10 @@ int bch2_trigger_alloc(struct btree_trans *trans,
1039
1039
* This synthesizes deleted extents for holes, similar to BTREE_ITER_slots for
1040
1040
* extents style btrees, but works on non-extents btrees:
1041
1041
*/
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 )
1043
1044
{
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 );
1045
1046
1046
1047
if (bkey_err (k ))
1047
1048
return k ;
@@ -1052,9 +1053,9 @@ static struct bkey_s_c bch2_get_key_or_hole(struct btree_iter *iter, struct bpos
1052
1053
struct btree_iter iter2 ;
1053
1054
struct bpos next ;
1054
1055
1055
- bch2_trans_copy_iter (& iter2 , iter );
1056
+ bch2_trans_copy_iter (trans , & iter2 , iter );
1056
1057
1057
- struct btree_path * path = btree_iter_path (iter -> trans , iter );
1058
+ struct btree_path * path = btree_iter_path (trans , iter );
1058
1059
if (!bpos_eq (path -> l [0 ].b -> key .k .p , SPOS_MAX ))
1059
1060
end = bkey_min (end , bpos_nosnap_successor (path -> l [0 ].b -> key .k .p ));
1060
1061
@@ -1064,9 +1065,9 @@ static struct bkey_s_c bch2_get_key_or_hole(struct btree_iter *iter, struct bpos
1064
1065
* btree node min/max is a closed interval, upto takes a half
1065
1066
* open interval:
1066
1067
*/
1067
- k = bch2_btree_iter_peek_max (& iter2 , end );
1068
+ k = bch2_btree_iter_peek_max (trans , & iter2 , end );
1068
1069
next = iter2 .pos ;
1069
- bch2_trans_iter_exit (iter -> trans , & iter2 );
1070
+ bch2_trans_iter_exit (trans , & iter2 );
1070
1071
1071
1072
BUG_ON (next .offset >= iter -> pos .offset + U32_MAX );
1072
1073
@@ -1107,13 +1108,14 @@ static bool next_bucket(struct bch_fs *c, struct bch_dev **ca, struct bpos *buck
1107
1108
return * ca != NULL ;
1108
1109
}
1109
1110
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 )
1112
1114
{
1113
- struct bch_fs * c = iter -> trans -> c ;
1115
+ struct bch_fs * c = trans -> c ;
1114
1116
struct bkey_s_c k ;
1115
1117
again :
1116
- k = bch2_get_key_or_hole (iter , POS_MAX , hole );
1118
+ k = bch2_get_key_or_hole (trans , iter , POS_MAX , hole );
1117
1119
if (bkey_err (k ))
1118
1120
return k ;
1119
1121
@@ -1126,7 +1128,7 @@ static struct bkey_s_c bch2_get_key_or_real_bucket_hole(struct btree_iter *iter,
1126
1128
if (!next_bucket (c , ca , & hole_start ))
1127
1129
return bkey_s_c_null ;
1128
1130
1129
- bch2_btree_iter_set_pos (iter , hole_start );
1131
+ bch2_btree_iter_set_pos (trans , iter , hole_start );
1130
1132
goto again ;
1131
1133
}
1132
1134
@@ -1167,8 +1169,8 @@ int bch2_check_alloc_key(struct btree_trans *trans,
1167
1169
1168
1170
a = bch2_alloc_to_v4 (alloc_k , & a_convert );
1169
1171
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 );
1172
1174
ret = bkey_err (k );
1173
1175
if (ret )
1174
1176
goto err ;
@@ -1181,8 +1183,8 @@ int bch2_check_alloc_key(struct btree_trans *trans,
1181
1183
goto err ;
1182
1184
}
1183
1185
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 );
1186
1188
ret = bkey_err (k );
1187
1189
if (ret )
1188
1190
goto err ;
@@ -1195,8 +1197,8 @@ int bch2_check_alloc_key(struct btree_trans *trans,
1195
1197
goto err ;
1196
1198
}
1197
1199
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 );
1200
1202
ret = bkey_err (k );
1201
1203
if (ret )
1202
1204
goto err ;
@@ -1249,9 +1251,9 @@ int bch2_check_alloc_hole_freespace(struct btree_trans *trans,
1249
1251
if (!ca -> mi .freespace_initialized )
1250
1252
return 0 ;
1251
1253
1252
- bch2_btree_iter_set_pos (freespace_iter , start );
1254
+ bch2_btree_iter_set_pos (trans , freespace_iter , start );
1253
1255
1254
- k = bch2_btree_iter_peek_slot (freespace_iter );
1256
+ k = bch2_btree_iter_peek_slot (trans , freespace_iter );
1255
1257
ret = bkey_err (k );
1256
1258
if (ret )
1257
1259
goto err ;
@@ -1300,9 +1302,9 @@ int bch2_check_alloc_hole_bucket_gens(struct btree_trans *trans,
1300
1302
unsigned i , gens_offset , gens_end_offset ;
1301
1303
int ret ;
1302
1304
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 ));
1304
1306
1305
- k = bch2_btree_iter_peek_slot (bucket_gens_iter );
1307
+ k = bch2_btree_iter_peek_slot (trans , bucket_gens_iter );
1306
1308
ret = bkey_err (k );
1307
1309
if (ret )
1308
1310
goto err ;
@@ -1435,7 +1437,7 @@ int bch2_check_discard_freespace_key(struct btree_trans *trans, struct btree_ite
1435
1437
* gen = a -> gen ;
1436
1438
out :
1437
1439
fsck_err :
1438
- bch2_set_btree_iter_dontneed (& alloc_iter );
1440
+ bch2_set_btree_iter_dontneed (trans , & alloc_iter );
1439
1441
bch2_trans_iter_exit (trans , & alloc_iter );
1440
1442
printbuf_exit (& buf );
1441
1443
return ret ;
@@ -1572,7 +1574,7 @@ int bch2_check_alloc_info(struct bch_fs *c)
1572
1574
1573
1575
bch2_trans_begin (trans );
1574
1576
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 );
1576
1578
ret = bkey_err (k );
1577
1579
if (ret )
1578
1580
goto bkey_err ;
@@ -1610,7 +1612,7 @@ int bch2_check_alloc_info(struct bch_fs *c)
1610
1612
if (ret )
1611
1613
goto bkey_err ;
1612
1614
1613
- bch2_btree_iter_set_pos (& iter , next );
1615
+ bch2_btree_iter_set_pos (trans , & iter , next );
1614
1616
bkey_err :
1615
1617
if (bch2_err_matches (ret , BCH_ERR_transaction_restart ))
1616
1618
continue ;
@@ -1638,7 +1640,7 @@ int bch2_check_alloc_info(struct bch_fs *c)
1638
1640
BTREE_ITER_prefetch );
1639
1641
while (1 ) {
1640
1642
bch2_trans_begin (trans );
1641
- k = bch2_btree_iter_peek (& iter );
1643
+ k = bch2_btree_iter_peek (trans , & iter );
1642
1644
if (!k .k )
1643
1645
break ;
1644
1646
@@ -1657,7 +1659,7 @@ int bch2_check_alloc_info(struct bch_fs *c)
1657
1659
break ;
1658
1660
}
1659
1661
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 ));
1661
1663
}
1662
1664
bch2_trans_iter_exit (trans , & iter );
1663
1665
if (ret )
@@ -1685,7 +1687,7 @@ static int bch2_check_alloc_to_lru_ref(struct btree_trans *trans,
1685
1687
struct printbuf buf = PRINTBUF ;
1686
1688
int ret ;
1687
1689
1688
- alloc_k = bch2_btree_iter_peek (alloc_iter );
1690
+ alloc_k = bch2_btree_iter_peek (trans , alloc_iter );
1689
1691
if (!alloc_k .k )
1690
1692
return 0 ;
1691
1693
@@ -1826,7 +1828,7 @@ static int bch2_discard_one_bucket(struct btree_trans *trans,
1826
1828
{
1827
1829
struct bch_fs * c = trans -> c ;
1828
1830
struct bpos pos = need_discard_iter -> pos ;
1829
- struct btree_iter iter = { NULL };
1831
+ struct btree_iter iter = {};
1830
1832
struct bkey_s_c k ;
1831
1833
struct bkey_i_alloc_v4 * a ;
1832
1834
struct printbuf buf = PRINTBUF ;
@@ -1950,7 +1952,7 @@ static void bch2_do_discards_work(struct work_struct *work)
1950
1952
trace_discard_buckets (c , s .seen , s .open , s .need_journal_commit , s .discarded ,
1951
1953
bch2_err_str (ret ));
1952
1954
1953
- percpu_ref_put (& ca -> io_ref );
1955
+ percpu_ref_put (& ca -> io_ref [ WRITE ] );
1954
1956
bch2_write_ref_put (c , BCH_WRITE_REF_discard );
1955
1957
}
1956
1958
@@ -1967,7 +1969,7 @@ void bch2_dev_do_discards(struct bch_dev *ca)
1967
1969
if (queue_work (c -> write_ref_wq , & ca -> discard_work ))
1968
1970
return ;
1969
1971
1970
- percpu_ref_put (& ca -> io_ref );
1972
+ percpu_ref_put (& ca -> io_ref [ WRITE ] );
1971
1973
put_write_ref :
1972
1974
bch2_write_ref_put (c , BCH_WRITE_REF_discard );
1973
1975
}
@@ -2045,7 +2047,7 @@ static void bch2_do_discards_fast_work(struct work_struct *work)
2045
2047
trace_discard_buckets_fast (c , s .seen , s .open , s .need_journal_commit , s .discarded , bch2_err_str (ret ));
2046
2048
2047
2049
bch2_trans_put (trans );
2048
- percpu_ref_put (& ca -> io_ref );
2050
+ percpu_ref_put (& ca -> io_ref [ WRITE ] );
2049
2051
bch2_write_ref_put (c , BCH_WRITE_REF_discard_fast );
2050
2052
}
2051
2053
@@ -2065,7 +2067,7 @@ static void bch2_discard_one_bucket_fast(struct bch_dev *ca, u64 bucket)
2065
2067
if (queue_work (c -> write_ref_wq , & ca -> discard_fast_work ))
2066
2068
return ;
2067
2069
2068
- percpu_ref_put (& ca -> io_ref );
2070
+ percpu_ref_put (& ca -> io_ref [ WRITE ] );
2069
2071
put_ref :
2070
2072
bch2_write_ref_put (c , BCH_WRITE_REF_discard_fast );
2071
2073
}
@@ -2082,6 +2084,9 @@ static int invalidate_one_bp(struct btree_trans *trans,
2082
2084
if (ret )
2083
2085
return ret ;
2084
2086
2087
+ if (!extent_k .k )
2088
+ return 0 ;
2089
+
2085
2090
struct bkey_i * n =
2086
2091
bch2_bkey_make_mut (trans , & extent_iter , & extent_k ,
2087
2092
BTREE_UPDATE_internal_snapshot_node );
@@ -2199,9 +2204,9 @@ static struct bkey_s_c next_lru_key(struct btree_trans *trans, struct btree_iter
2199
2204
{
2200
2205
struct bkey_s_c k ;
2201
2206
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 ));
2203
2208
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 ));
2205
2210
* wrapped = true;
2206
2211
goto again ;
2207
2212
}
@@ -2251,12 +2256,12 @@ static void bch2_do_invalidates_work(struct work_struct *work)
2251
2256
if (ret )
2252
2257
break ;
2253
2258
2254
- bch2_btree_iter_advance (& iter );
2259
+ bch2_btree_iter_advance (trans , & iter );
2255
2260
}
2256
2261
bch2_trans_iter_exit (trans , & iter );
2257
2262
err :
2258
2263
bch2_trans_put (trans );
2259
- percpu_ref_put (& ca -> io_ref );
2264
+ percpu_ref_put (& ca -> io_ref [ WRITE ] );
2260
2265
bch2_bkey_buf_exit (& last_flushed , c );
2261
2266
bch2_write_ref_put (c , BCH_WRITE_REF_invalidate );
2262
2267
}
@@ -2274,7 +2279,7 @@ void bch2_dev_do_invalidates(struct bch_dev *ca)
2274
2279
if (queue_work (c -> write_ref_wq , & ca -> invalidate_work ))
2275
2280
return ;
2276
2281
2277
- percpu_ref_put (& ca -> io_ref );
2282
+ percpu_ref_put (& ca -> io_ref [ WRITE ] );
2278
2283
put_ref :
2279
2284
bch2_write_ref_put (c , BCH_WRITE_REF_invalidate );
2280
2285
}
@@ -2321,7 +2326,7 @@ int bch2_dev_freespace_init(struct bch_fs *c, struct bch_dev *ca,
2321
2326
break ;
2322
2327
}
2323
2328
2324
- k = bch2_get_key_or_hole (& iter , end , & hole );
2329
+ k = bch2_get_key_or_hole (trans , & iter , end , & hole );
2325
2330
ret = bkey_err (k );
2326
2331
if (ret )
2327
2332
goto bkey_err ;
@@ -2340,7 +2345,7 @@ int bch2_dev_freespace_init(struct bch_fs *c, struct bch_dev *ca,
2340
2345
if (ret )
2341
2346
goto bkey_err ;
2342
2347
2343
- bch2_btree_iter_advance (& iter );
2348
+ bch2_btree_iter_advance (trans , & iter );
2344
2349
} else {
2345
2350
struct bkey_i * freespace ;
2346
2351
@@ -2360,7 +2365,7 @@ int bch2_dev_freespace_init(struct bch_fs *c, struct bch_dev *ca,
2360
2365
if (ret )
2361
2366
goto bkey_err ;
2362
2367
2363
- bch2_btree_iter_set_pos (& iter , k .k -> p );
2368
+ bch2_btree_iter_set_pos (trans , & iter , k .k -> p );
2364
2369
}
2365
2370
bkey_err :
2366
2371
if (bch2_err_matches (ret , BCH_ERR_transaction_restart ))
@@ -2506,7 +2511,7 @@ void bch2_recalc_capacity(struct bch_fs *c)
2506
2511
2507
2512
bch2_set_ra_pages (c , ra_pages );
2508
2513
2509
- for_each_rw_member (c , ca ) {
2514
+ __for_each_online_member (c , ca , BIT ( BCH_MEMBER_STATE_rw ), READ ) {
2510
2515
u64 dev_reserve = 0 ;
2511
2516
2512
2517
/*
0 commit comments