@@ -1657,9 +1657,8 @@ static void discard_buckets_next_dev(struct bch_fs *c, struct discard_buckets_st
1657
1657
bch2_dev_usage_read (s -> ca ).d [BCH_DATA_free ].buckets )
1658
1658
bch2_journal_flush_async (& c -> journal , NULL );
1659
1659
1660
- bch2_dev_put (s -> ca );
1661
- if (ca )
1662
- bch2_dev_get (ca );
1660
+ if (s -> ca )
1661
+ percpu_ref_put (& s -> ca -> io_ref );
1663
1662
s -> ca = ca ;
1664
1663
s -> need_journal_commit_this_dev = 0 ;
1665
1664
}
@@ -1673,15 +1672,15 @@ static int bch2_discard_one_bucket(struct btree_trans *trans,
1673
1672
struct bpos pos = need_discard_iter -> pos ;
1674
1673
struct btree_iter iter = { NULL };
1675
1674
struct bkey_s_c k ;
1676
- struct bch_dev * ca ;
1677
1675
struct bkey_i_alloc_v4 * a ;
1678
1676
struct printbuf buf = PRINTBUF ;
1679
1677
bool discard_locked = false;
1680
1678
int ret = 0 ;
1681
1679
1682
- ca = bch2_dev_bkey_exists (c , pos .inode );
1683
-
1684
- if (!percpu_ref_tryget (& ca -> io_ref )) {
1680
+ struct bch_dev * ca = s -> ca && s -> ca -> dev_idx == pos .inode
1681
+ ? s -> ca
1682
+ : bch2_dev_get_ioref2 (c , pos .inode , WRITE );
1683
+ if (!ca ) {
1685
1684
bch2_btree_iter_set_pos (need_discard_iter , POS (pos .inode + 1 , 0 ));
1686
1685
return 0 ;
1687
1686
}
@@ -1787,7 +1786,6 @@ static int bch2_discard_one_bucket(struct btree_trans *trans,
1787
1786
discard_in_flight_remove (c , iter .pos );
1788
1787
s -> seen ++ ;
1789
1788
bch2_trans_iter_exit (trans , & iter );
1790
- percpu_ref_put (& ca -> io_ref );
1791
1789
printbuf_exit (& buf );
1792
1790
return ret ;
1793
1791
}
@@ -1862,9 +1860,8 @@ static void bch2_do_discards_fast_work(struct work_struct *work)
1862
1860
if (i -> snapshot )
1863
1861
continue ;
1864
1862
1865
- ca = bch2_dev_bkey_exists (c , i -> inode );
1866
-
1867
- if (!percpu_ref_tryget (& ca -> io_ref )) {
1863
+ ca = bch2_dev_get_ioref2 (c , i -> inode , WRITE );
1864
+ if (!ca ) {
1868
1865
darray_remove_item (& c -> discard_buckets_in_flight , i );
1869
1866
continue ;
1870
1867
}
0 commit comments