@@ -3809,22 +3809,6 @@ static int do_allocation_clustered(struct btrfs_block_group *block_group,
3809
3809
return find_free_extent_unclustered (block_group , ffe_ctl );
3810
3810
}
3811
3811
3812
- /*
3813
- * Tree-log block group locking
3814
- * ============================
3815
- *
3816
- * fs_info::treelog_bg_lock protects the fs_info::treelog_bg which
3817
- * indicates the starting address of a block group, which is reserved only
3818
- * for tree-log metadata.
3819
- *
3820
- * Lock nesting
3821
- * ============
3822
- *
3823
- * space_info::lock
3824
- * block_group::lock
3825
- * fs_info::treelog_bg_lock
3826
- */
3827
-
3828
3812
/*
3829
3813
* Simple allocator for sequential-only block group. It only allows sequential
3830
3814
* allocation. No need to play with trees. This function also reserves the
@@ -3841,23 +3825,17 @@ static int do_allocation_zoned(struct btrfs_block_group *block_group,
3841
3825
u64 num_bytes = ffe_ctl -> num_bytes ;
3842
3826
u64 avail ;
3843
3827
u64 bytenr = block_group -> start ;
3844
- u64 log_bytenr ;
3845
3828
int ret = 0 ;
3846
- bool skip = false;
3847
3829
3848
3830
ASSERT (btrfs_is_zoned (block_group -> fs_info ));
3849
3831
3850
3832
/*
3851
3833
* Do not allow non-tree-log blocks in the dedicated tree-log block
3852
3834
* group, and vice versa.
3853
3835
*/
3854
- spin_lock (& fs_info -> treelog_bg_lock );
3855
- log_bytenr = fs_info -> treelog_bg ;
3856
- if (log_bytenr && ((ffe_ctl -> for_treelog && bytenr != log_bytenr ) ||
3857
- (!ffe_ctl -> for_treelog && bytenr == log_bytenr )))
3858
- skip = true;
3859
- spin_unlock (& fs_info -> treelog_bg_lock );
3860
- if (skip )
3836
+ if (READ_ONCE (fs_info -> treelog_bg ) &&
3837
+ ((ffe_ctl -> for_treelog && bytenr != READ_ONCE (fs_info -> treelog_bg )) ||
3838
+ (!ffe_ctl -> for_treelog && bytenr == READ_ONCE (fs_info -> treelog_bg ))))
3861
3839
return 1 ;
3862
3840
3863
3841
/*
@@ -3892,14 +3870,13 @@ static int do_allocation_zoned(struct btrfs_block_group *block_group,
3892
3870
3893
3871
spin_lock (& space_info -> lock );
3894
3872
spin_lock (& block_group -> lock );
3895
- spin_lock (& fs_info -> treelog_bg_lock );
3896
3873
3897
3874
if (ret )
3898
3875
goto out ;
3899
3876
3900
3877
ASSERT (!ffe_ctl -> for_treelog ||
3901
- block_group -> start == fs_info -> treelog_bg ||
3902
- fs_info -> treelog_bg == 0 );
3878
+ block_group -> start == READ_ONCE ( fs_info -> treelog_bg ) ||
3879
+ READ_ONCE ( fs_info -> treelog_bg ) == 0 );
3903
3880
ASSERT (!ffe_ctl -> for_data_reloc ||
3904
3881
block_group -> start == READ_ONCE (fs_info -> data_reloc_bg ) ||
3905
3882
READ_ONCE (fs_info -> data_reloc_bg ) == 0 );
@@ -3915,7 +3892,7 @@ static int do_allocation_zoned(struct btrfs_block_group *block_group,
3915
3892
* Do not allow currently using block group to be tree-log dedicated
3916
3893
* block group.
3917
3894
*/
3918
- if (ffe_ctl -> for_treelog && ! fs_info -> treelog_bg &&
3895
+ if (ffe_ctl -> for_treelog && READ_ONCE ( fs_info -> treelog_bg ) == 0 &&
3919
3896
(block_group -> used || block_group -> reserved )) {
3920
3897
ret = 1 ;
3921
3898
goto out ;
@@ -3946,8 +3923,8 @@ static int do_allocation_zoned(struct btrfs_block_group *block_group,
3946
3923
goto out ;
3947
3924
}
3948
3925
3949
- if (ffe_ctl -> for_treelog && ! fs_info -> treelog_bg )
3950
- fs_info -> treelog_bg = block_group -> start ;
3926
+ if (ffe_ctl -> for_treelog && READ_ONCE ( fs_info -> treelog_bg ) == 0 )
3927
+ WRITE_ONCE ( fs_info -> treelog_bg , block_group -> start ) ;
3951
3928
3952
3929
if (ffe_ctl -> for_data_reloc ) {
3953
3930
if (READ_ONCE (fs_info -> data_reloc_bg ) == 0 )
@@ -3985,10 +3962,9 @@ static int do_allocation_zoned(struct btrfs_block_group *block_group,
3985
3962
3986
3963
out :
3987
3964
if (ret && ffe_ctl -> for_treelog )
3988
- fs_info -> treelog_bg = 0 ;
3965
+ WRITE_ONCE ( fs_info -> treelog_bg , 0 ) ;
3989
3966
if (ret && ffe_ctl -> for_data_reloc )
3990
3967
WRITE_ONCE (fs_info -> data_reloc_bg , 0 );
3991
- spin_unlock (& fs_info -> treelog_bg_lock );
3992
3968
spin_unlock (& block_group -> lock );
3993
3969
spin_unlock (& space_info -> lock );
3994
3970
return ret ;
@@ -4290,11 +4266,8 @@ static int prepare_allocation_clustered(struct btrfs_fs_info *fs_info,
4290
4266
static int prepare_allocation_zoned (struct btrfs_fs_info * fs_info ,
4291
4267
struct find_free_extent_ctl * ffe_ctl )
4292
4268
{
4293
- if (ffe_ctl -> for_treelog ) {
4294
- spin_lock (& fs_info -> treelog_bg_lock );
4295
- if (fs_info -> treelog_bg )
4296
- ffe_ctl -> hint_byte = fs_info -> treelog_bg ;
4297
- spin_unlock (& fs_info -> treelog_bg_lock );
4269
+ if (ffe_ctl -> for_treelog && READ_ONCE (fs_info -> treelog_bg )) {
4270
+ ffe_ctl -> hint_byte = READ_ONCE (fs_info -> treelog_bg );
4298
4271
} else if (ffe_ctl -> for_data_reloc &&
4299
4272
READ_ONCE (fs_info -> data_reloc_bg )) {
4300
4273
ffe_ctl -> hint_byte = READ_ONCE (fs_info -> data_reloc_bg );
0 commit comments