@@ -700,15 +700,14 @@ int bch2_check_fix_ptrs(struct btree_trans *trans,
700
700
return ret ;
701
701
}
702
702
703
- int bch2_bucket_ref_update (struct btree_trans * trans ,
704
- struct bkey_s_c k ,
705
- const struct bch_extent_ptr * ptr ,
706
- s64 sectors , enum bch_data_type ptr_data_type ,
707
- u8 b_gen , u8 bucket_data_type ,
708
- u32 * bucket_sectors )
703
+ int bch2_bucket_ref_update (struct btree_trans * trans , struct bch_dev * ca ,
704
+ struct bkey_s_c k ,
705
+ const struct bch_extent_ptr * ptr ,
706
+ s64 sectors , enum bch_data_type ptr_data_type ,
707
+ u8 b_gen , u8 bucket_data_type ,
708
+ u32 * bucket_sectors )
709
709
{
710
710
struct bch_fs * c = trans -> c ;
711
- struct bch_dev * ca = bch2_dev_bkey_exists (c , ptr -> dev );
712
711
size_t bucket_nr = PTR_BUCKET_NR (ca , ptr );
713
712
struct printbuf buf = PRINTBUF ;
714
713
bool inserting = sectors > 0 ;
@@ -939,7 +938,7 @@ int bch2_trans_fs_usage_apply(struct btree_trans *trans,
939
938
940
939
/* KEY_TYPE_extent: */
941
940
942
- static int __mark_pointer (struct btree_trans * trans ,
941
+ static int __mark_pointer (struct btree_trans * trans , struct bch_dev * ca ,
943
942
struct bkey_s_c k ,
944
943
const struct bch_extent_ptr * ptr ,
945
944
s64 sectors , enum bch_data_type ptr_data_type ,
@@ -948,7 +947,7 @@ static int __mark_pointer(struct btree_trans *trans,
948
947
u32 * dst_sectors = !ptr -> cached
949
948
? & a -> dirty_sectors
950
949
: & a -> cached_sectors ;
951
- int ret = bch2_bucket_ref_update (trans , k , ptr , sectors , ptr_data_type ,
950
+ int ret = bch2_bucket_ref_update (trans , ca , k , ptr , sectors , ptr_data_type ,
952
951
a -> gen , a -> data_type , dst_sectors );
953
952
954
953
if (ret )
@@ -966,45 +965,51 @@ static int bch2_trigger_pointer(struct btree_trans *trans,
966
965
enum btree_iter_update_trigger_flags flags )
967
966
{
968
967
bool insert = !(flags & BTREE_TRIGGER_overwrite );
968
+ int ret = 0 ;
969
+
970
+ struct bch_fs * c = trans -> c ;
971
+ struct bch_dev * ca = bch2_dev_tryget (c , p .ptr .dev );
972
+ if (unlikely (!ca )) {
973
+ if (insert )
974
+ ret = - EIO ;
975
+ goto err ;
976
+ }
977
+
969
978
struct bpos bucket ;
970
979
struct bch_backpointer bp ;
971
-
972
980
bch2_extent_ptr_to_bp (trans -> c , btree_id , level , k , p , entry , & bucket , & bp );
973
981
* sectors = insert ? bp .bucket_len : - ((s64 ) bp .bucket_len );
974
982
975
983
if (flags & BTREE_TRIGGER_transactional ) {
976
984
struct bkey_i_alloc_v4 * a = bch2_trans_start_alloc_update (trans , bucket );
977
- int ret = PTR_ERR_OR_ZERO (a ) ?:
978
- __mark_pointer (trans , k , & p .ptr , * sectors , bp .data_type , & a -> v );
985
+ ret = PTR_ERR_OR_ZERO (a ) ?:
986
+ __mark_pointer (trans , ca , k , & p .ptr , * sectors , bp .data_type , & a -> v );
979
987
if (ret )
980
- return ret ;
988
+ goto err ;
981
989
982
990
if (!p .ptr .cached ) {
983
991
ret = bch2_bucket_backpointer_mod (trans , bucket , bp , k , insert );
984
992
if (ret )
985
- return ret ;
993
+ goto err ;
986
994
}
987
995
}
988
996
989
997
if (flags & BTREE_TRIGGER_gc ) {
990
- struct bch_fs * c = trans -> c ;
991
- struct bch_dev * ca = bch2_dev_bkey_exists (c , p .ptr .dev );
992
-
993
998
percpu_down_read (& c -> mark_lock );
994
999
struct bucket * g = gc_bucket (ca , bucket .offset );
995
1000
bucket_lock (g );
996
1001
struct bch_alloc_v4 old = bucket_m_to_alloc (* g ), new = old ;
997
- int ret = __mark_pointer (trans , k , & p .ptr , * sectors , bp .data_type , & new );
1002
+ ret = __mark_pointer (trans , ca , k , & p .ptr , * sectors , bp .data_type , & new );
998
1003
if (!ret ) {
999
1004
alloc_to_bucket (g , new );
1000
1005
bch2_dev_usage_update (c , ca , & old , & new , 0 , true);
1001
1006
}
1002
1007
bucket_unlock (g );
1003
1008
percpu_up_read (& c -> mark_lock );
1004
- return ret ;
1005
1009
}
1006
-
1007
- return 0 ;
1010
+ err :
1011
+ bch2_dev_put (ca );
1012
+ return ret ;
1008
1013
}
1009
1014
1010
1015
static int bch2_trigger_stripe_ptr (struct btree_trans * trans ,
0 commit comments