@@ -4966,12 +4966,12 @@ static void wake_all_tickets(struct list_head *head)
4966
4966
*/
4967
4967
static void btrfs_async_reclaim_metadata_space (struct work_struct * work )
4968
4968
{
4969
- struct reserve_ticket * last_ticket = NULL ;
4970
4969
struct btrfs_fs_info * fs_info ;
4971
4970
struct btrfs_space_info * space_info ;
4972
4971
u64 to_reclaim ;
4973
4972
int flush_state ;
4974
4973
int commit_cycles = 0 ;
4974
+ u64 last_tickets_id ;
4975
4975
4976
4976
fs_info = container_of (work , struct btrfs_fs_info , async_reclaim_work );
4977
4977
space_info = __find_space_info (fs_info , BTRFS_BLOCK_GROUP_METADATA );
@@ -4984,8 +4984,7 @@ static void btrfs_async_reclaim_metadata_space(struct work_struct *work)
4984
4984
spin_unlock (& space_info -> lock );
4985
4985
return ;
4986
4986
}
4987
- last_ticket = list_first_entry (& space_info -> tickets ,
4988
- struct reserve_ticket , list );
4987
+ last_tickets_id = space_info -> tickets_id ;
4989
4988
spin_unlock (& space_info -> lock );
4990
4989
4991
4990
flush_state = FLUSH_DELAYED_ITEMS_NR ;
@@ -5005,10 +5004,10 @@ static void btrfs_async_reclaim_metadata_space(struct work_struct *work)
5005
5004
space_info );
5006
5005
ticket = list_first_entry (& space_info -> tickets ,
5007
5006
struct reserve_ticket , list );
5008
- if (last_ticket == ticket ) {
5007
+ if (last_tickets_id == space_info -> tickets_id ) {
5009
5008
flush_state ++ ;
5010
5009
} else {
5011
- last_ticket = ticket ;
5010
+ last_tickets_id = space_info -> tickets_id ;
5012
5011
flush_state = FLUSH_DELAYED_ITEMS_NR ;
5013
5012
if (commit_cycles )
5014
5013
commit_cycles -- ;
@@ -5384,6 +5383,7 @@ static void space_info_add_old_bytes(struct btrfs_fs_info *fs_info,
5384
5383
list_del_init (& ticket -> list );
5385
5384
num_bytes -= ticket -> bytes ;
5386
5385
ticket -> bytes = 0 ;
5386
+ space_info -> tickets_id ++ ;
5387
5387
wake_up (& ticket -> wait );
5388
5388
} else {
5389
5389
ticket -> bytes -= num_bytes ;
@@ -5426,6 +5426,7 @@ static void space_info_add_new_bytes(struct btrfs_fs_info *fs_info,
5426
5426
num_bytes -= ticket -> bytes ;
5427
5427
space_info -> bytes_may_use += ticket -> bytes ;
5428
5428
ticket -> bytes = 0 ;
5429
+ space_info -> tickets_id ++ ;
5429
5430
wake_up (& ticket -> wait );
5430
5431
} else {
5431
5432
trace_btrfs_space_reservation (fs_info , "space_info" ,
@@ -8216,6 +8217,7 @@ int btrfs_alloc_logged_file_extent(struct btrfs_trans_handle *trans,
8216
8217
{
8217
8218
int ret ;
8218
8219
struct btrfs_block_group_cache * block_group ;
8220
+ struct btrfs_space_info * space_info ;
8219
8221
8220
8222
/*
8221
8223
* Mixed block groups will exclude before processing the log so we only
@@ -8231,9 +8233,14 @@ int btrfs_alloc_logged_file_extent(struct btrfs_trans_handle *trans,
8231
8233
if (!block_group )
8232
8234
return - EINVAL ;
8233
8235
8234
- ret = btrfs_add_reserved_bytes (block_group , ins -> offset ,
8235
- ins -> offset , 0 );
8236
- BUG_ON (ret ); /* logic error */
8236
+ space_info = block_group -> space_info ;
8237
+ spin_lock (& space_info -> lock );
8238
+ spin_lock (& block_group -> lock );
8239
+ space_info -> bytes_reserved += ins -> offset ;
8240
+ block_group -> reserved += ins -> offset ;
8241
+ spin_unlock (& block_group -> lock );
8242
+ spin_unlock (& space_info -> lock );
8243
+
8237
8244
ret = alloc_reserved_file_extent (trans , root , 0 , root_objectid ,
8238
8245
0 , owner , offset , ins , 1 );
8239
8246
btrfs_put_block_group (block_group );
0 commit comments