@@ -3842,7 +3842,6 @@ static int do_allocation_zoned(struct btrfs_block_group *block_group,
3842
3842
u64 avail ;
3843
3843
u64 bytenr = block_group -> start ;
3844
3844
u64 log_bytenr ;
3845
- u64 data_reloc_bytenr ;
3846
3845
int ret = 0 ;
3847
3846
bool skip = false;
3848
3847
@@ -3865,14 +3864,9 @@ static int do_allocation_zoned(struct btrfs_block_group *block_group,
3865
3864
* Do not allow non-relocation blocks in the dedicated relocation block
3866
3865
* group, and vice versa.
3867
3866
*/
3868
- spin_lock (& fs_info -> relocation_bg_lock );
3869
- data_reloc_bytenr = fs_info -> data_reloc_bg ;
3870
- if (data_reloc_bytenr &&
3871
- ((ffe_ctl -> for_data_reloc && bytenr != data_reloc_bytenr ) ||
3872
- (!ffe_ctl -> for_data_reloc && bytenr == data_reloc_bytenr )))
3873
- skip = true;
3874
- spin_unlock (& fs_info -> relocation_bg_lock );
3875
- if (skip )
3867
+ if (READ_ONCE (fs_info -> data_reloc_bg ) &&
3868
+ ((ffe_ctl -> for_data_reloc && bytenr != READ_ONCE (fs_info -> data_reloc_bg )) ||
3869
+ (!ffe_ctl -> for_data_reloc && bytenr == READ_ONCE (fs_info -> data_reloc_bg ))))
3876
3870
return 1 ;
3877
3871
3878
3872
/* Check RO and no space case before trying to activate it */
@@ -3899,7 +3893,6 @@ static int do_allocation_zoned(struct btrfs_block_group *block_group,
3899
3893
spin_lock (& space_info -> lock );
3900
3894
spin_lock (& block_group -> lock );
3901
3895
spin_lock (& fs_info -> treelog_bg_lock );
3902
- spin_lock (& fs_info -> relocation_bg_lock );
3903
3896
3904
3897
if (ret )
3905
3898
goto out ;
@@ -3908,8 +3901,8 @@ static int do_allocation_zoned(struct btrfs_block_group *block_group,
3908
3901
block_group -> start == fs_info -> treelog_bg ||
3909
3902
fs_info -> treelog_bg == 0 );
3910
3903
ASSERT (!ffe_ctl -> for_data_reloc ||
3911
- block_group -> start == fs_info -> data_reloc_bg ||
3912
- fs_info -> data_reloc_bg == 0 );
3904
+ block_group -> start == READ_ONCE ( fs_info -> data_reloc_bg ) ||
3905
+ READ_ONCE ( fs_info -> data_reloc_bg ) == 0 );
3913
3906
3914
3907
if (block_group -> ro ||
3915
3908
(!ffe_ctl -> for_data_reloc &&
@@ -3932,7 +3925,7 @@ static int do_allocation_zoned(struct btrfs_block_group *block_group,
3932
3925
* Do not allow currently used block group to be the data relocation
3933
3926
* dedicated block group.
3934
3927
*/
3935
- if (ffe_ctl -> for_data_reloc && ! fs_info -> data_reloc_bg &&
3928
+ if (ffe_ctl -> for_data_reloc && READ_ONCE ( fs_info -> data_reloc_bg ) == 0 &&
3936
3929
(block_group -> used || block_group -> reserved )) {
3937
3930
ret = 1 ;
3938
3931
goto out ;
@@ -3957,8 +3950,8 @@ static int do_allocation_zoned(struct btrfs_block_group *block_group,
3957
3950
fs_info -> treelog_bg = block_group -> start ;
3958
3951
3959
3952
if (ffe_ctl -> for_data_reloc ) {
3960
- if (! fs_info -> data_reloc_bg )
3961
- fs_info -> data_reloc_bg = block_group -> start ;
3953
+ if (READ_ONCE ( fs_info -> data_reloc_bg ) == 0 )
3954
+ WRITE_ONCE ( fs_info -> data_reloc_bg , block_group -> start ) ;
3962
3955
/*
3963
3956
* Do not allow allocations from this block group, unless it is
3964
3957
* for data relocation. Compared to increasing the ->ro, setting
@@ -3994,8 +3987,7 @@ static int do_allocation_zoned(struct btrfs_block_group *block_group,
3994
3987
if (ret && ffe_ctl -> for_treelog )
3995
3988
fs_info -> treelog_bg = 0 ;
3996
3989
if (ret && ffe_ctl -> for_data_reloc )
3997
- fs_info -> data_reloc_bg = 0 ;
3998
- spin_unlock (& fs_info -> relocation_bg_lock );
3990
+ WRITE_ONCE (fs_info -> data_reloc_bg , 0 );
3999
3991
spin_unlock (& fs_info -> treelog_bg_lock );
4000
3992
spin_unlock (& block_group -> lock );
4001
3993
spin_unlock (& space_info -> lock );
@@ -4303,11 +4295,9 @@ static int prepare_allocation_zoned(struct btrfs_fs_info *fs_info,
4303
4295
if (fs_info -> treelog_bg )
4304
4296
ffe_ctl -> hint_byte = fs_info -> treelog_bg ;
4305
4297
spin_unlock (& fs_info -> treelog_bg_lock );
4306
- } else if (ffe_ctl -> for_data_reloc ) {
4307
- spin_lock (& fs_info -> relocation_bg_lock );
4308
- if (fs_info -> data_reloc_bg )
4309
- ffe_ctl -> hint_byte = fs_info -> data_reloc_bg ;
4310
- spin_unlock (& fs_info -> relocation_bg_lock );
4298
+ } else if (ffe_ctl -> for_data_reloc &&
4299
+ READ_ONCE (fs_info -> data_reloc_bg )) {
4300
+ ffe_ctl -> hint_byte = READ_ONCE (fs_info -> data_reloc_bg );
4311
4301
} else if (ffe_ctl -> flags & BTRFS_BLOCK_GROUP_DATA ) {
4312
4302
struct btrfs_block_group * block_group ;
4313
4303
0 commit comments