| @@ -4966,12 +4966,12 @@ static void wake_all_tickets(struct list_head *head) · 4965 unmodified lines |
| 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) · 6 unmodified lines |
| 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) · 13 unmodified lines |
| 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 @@ again: · 369 unmodified lines |
| 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 @@ again: · 36 unmodified lines |
| 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, · 2784 unmodified lines |
| 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, · 9 unmodified lines |
| 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); |