@@ -993,19 +993,25 @@ static int bch2_gc_alloc_start(struct bch_fs *c)
993
993
rcu_assign_pointer (ca -> buckets_gc , buckets );
994
994
}
995
995
996
+ struct bch_dev * ca = NULL ;
996
997
int ret = bch2_trans_run (c ,
997
998
for_each_btree_key (trans , iter , BTREE_ID_alloc , POS_MIN ,
998
999
BTREE_ITER_prefetch , k , ({
999
- struct bch_dev * ca = bch2_dev_bkey_exists (c , k .k -> p .inode );
1000
- struct bucket * g = gc_bucket (ca , k .k -> p .offset );
1000
+ ca = bch2_dev_iterate (c , ca , k .k -> p .inode );
1001
+ if (!ca ) {
1002
+ bch2_btree_iter_set_pos (& iter , POS (k .k -> p .inode + 1 , 0 ));
1003
+ continue ;
1004
+ }
1001
1005
1002
1006
struct bch_alloc_v4 a_convert ;
1003
1007
const struct bch_alloc_v4 * a = bch2_alloc_to_v4 (k , & a_convert );
1004
1008
1009
+ struct bucket * g = gc_bucket (ca , k .k -> p .offset );
1005
1010
g -> gen_valid = 1 ;
1006
1011
g -> gen = a -> gen ;
1007
1012
0 ;
1008
1013
})));
1014
+ bch2_dev_put (ca );
1009
1015
bch_err_fn (c , ret );
1010
1016
return ret ;
1011
1017
}
@@ -1254,22 +1260,29 @@ static int gc_btree_gens_key(struct btree_trans *trans,
1254
1260
return - EROFS ;
1255
1261
1256
1262
percpu_down_read (& c -> mark_lock );
1263
+ rcu_read_lock ();
1257
1264
bkey_for_each_ptr (ptrs , ptr ) {
1258
- struct bch_dev * ca = bch2_dev_bkey_exists (c , ptr -> dev );
1265
+ struct bch_dev * ca = bch2_dev_rcu (c , ptr -> dev );
1266
+ if (!ca )
1267
+ continue ;
1259
1268
1260
1269
if (dev_ptr_stale (ca , ptr ) > 16 ) {
1270
+ rcu_read_unlock ();
1261
1271
percpu_up_read (& c -> mark_lock );
1262
1272
goto update ;
1263
1273
}
1264
1274
}
1265
1275
1266
1276
bkey_for_each_ptr (ptrs , ptr ) {
1267
- struct bch_dev * ca = bch2_dev_bkey_exists (c , ptr -> dev );
1268
- u8 * gen = & ca -> oldest_gen [PTR_BUCKET_NR (ca , ptr )];
1277
+ struct bch_dev * ca = bch2_dev_rcu (c , ptr -> dev );
1278
+ if (!ca )
1279
+ continue ;
1269
1280
1281
+ u8 * gen = & ca -> oldest_gen [PTR_BUCKET_NR (ca , ptr )];
1270
1282
if (gen_after (* gen , ptr -> gen ))
1271
1283
* gen = ptr -> gen ;
1272
1284
}
1285
+ rcu_read_unlock ();
1273
1286
percpu_up_read (& c -> mark_lock );
1274
1287
return 0 ;
1275
1288
update :
@@ -1282,10 +1295,9 @@ static int gc_btree_gens_key(struct btree_trans *trans,
1282
1295
return 0 ;
1283
1296
}
1284
1297
1285
- static int bch2_alloc_write_oldest_gen (struct btree_trans * trans , struct btree_iter * iter ,
1286
- struct bkey_s_c k )
1298
+ static int bch2_alloc_write_oldest_gen (struct btree_trans * trans , struct bch_dev * ca ,
1299
+ struct btree_iter * iter , struct bkey_s_c k )
1287
1300
{
1288
- struct bch_dev * ca = bch2_dev_bkey_exists (trans -> c , iter -> pos .inode );
1289
1301
struct bch_alloc_v4 a_convert ;
1290
1302
const struct bch_alloc_v4 * a = bch2_alloc_to_v4 (k , & a_convert );
1291
1303
struct bkey_i_alloc_v4 * a_mut ;
@@ -1355,14 +1367,23 @@ int bch2_gc_gens(struct bch_fs *c)
1355
1367
goto err ;
1356
1368
}
1357
1369
1370
+ struct bch_dev * ca = NULL ;
1358
1371
ret = bch2_trans_run (c ,
1359
1372
for_each_btree_key_commit (trans , iter , BTREE_ID_alloc ,
1360
1373
POS_MIN ,
1361
1374
BTREE_ITER_prefetch ,
1362
1375
k ,
1363
1376
NULL , NULL ,
1364
- BCH_TRANS_COMMIT_no_enospc ,
1365
- bch2_alloc_write_oldest_gen (trans , & iter , k )));
1377
+ BCH_TRANS_COMMIT_no_enospc , ({
1378
+ ca = bch2_dev_iterate (c , ca , k .k -> p .inode );
1379
+ if (!ca ) {
1380
+ bch2_btree_iter_set_pos (& iter , POS (k .k -> p .inode + 1 , 0 ));
1381
+ continue ;
1382
+ }
1383
+ bch2_alloc_write_oldest_gen (trans , ca , & iter , k );
1384
+ })));
1385
+ bch2_dev_put (ca );
1386
+
1366
1387
if (ret )
1367
1388
goto err ;
1368
1389
0 commit comments