Merge branch 'for-linus-4.8' of git://git.kernel.org/pub/scm/linux/kernel/git/mason/linux-btrfs
Pull btrfs fixes from Chris Mason: "I'm not proud of how long it took me to track down that one liner in btrfs_sync_log(), but the good news is the patches I was trying to blame for these problems were actually fine (sorry Filipe)" * 'for-linus-4.8' of git://git.kernel.org/pub/scm/linux/kernel/git/mason/linux-btrfs: btrfs: introduce tickets_id to determine whether asynchronous metadata reclaim work makes progress btrfs: remove root_log_ctx from ctx list before btrfs_sync_log returns btrfs: do not decrease bytes_may_use when replaying extents
This commit is contained in:
commit
f4a9c169c2
|
@ -427,6 +427,7 @@ struct btrfs_space_info {
|
|||
struct list_head ro_bgs;
|
||||
struct list_head priority_tickets;
|
||||
struct list_head tickets;
|
||||
u64 tickets_id;
|
||||
|
||||
struct rw_semaphore groups_sem;
|
||||
/* for block groups in our same type */
|
||||
|
|
|
@ -4966,12 +4966,12 @@ static void wake_all_tickets(struct list_head *head)
|
|||
*/
|
||||
static void btrfs_async_reclaim_metadata_space(struct work_struct *work)
|
||||
{
|
||||
struct reserve_ticket *last_ticket = NULL;
|
||||
struct btrfs_fs_info *fs_info;
|
||||
struct btrfs_space_info *space_info;
|
||||
u64 to_reclaim;
|
||||
int flush_state;
|
||||
int commit_cycles = 0;
|
||||
u64 last_tickets_id;
|
||||
|
||||
fs_info = container_of(work, struct btrfs_fs_info, async_reclaim_work);
|
||||
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)
|
|||
spin_unlock(&space_info->lock);
|
||||
return;
|
||||
}
|
||||
last_ticket = list_first_entry(&space_info->tickets,
|
||||
struct reserve_ticket, list);
|
||||
last_tickets_id = space_info->tickets_id;
|
||||
spin_unlock(&space_info->lock);
|
||||
|
||||
flush_state = FLUSH_DELAYED_ITEMS_NR;
|
||||
|
@ -5005,10 +5004,10 @@ static void btrfs_async_reclaim_metadata_space(struct work_struct *work)
|
|||
space_info);
|
||||
ticket = list_first_entry(&space_info->tickets,
|
||||
struct reserve_ticket, list);
|
||||
if (last_ticket == ticket) {
|
||||
if (last_tickets_id == space_info->tickets_id) {
|
||||
flush_state++;
|
||||
} else {
|
||||
last_ticket = ticket;
|
||||
last_tickets_id = space_info->tickets_id;
|
||||
flush_state = FLUSH_DELAYED_ITEMS_NR;
|
||||
if (commit_cycles)
|
||||
commit_cycles--;
|
||||
|
@ -5384,6 +5383,7 @@ again:
|
|||
list_del_init(&ticket->list);
|
||||
num_bytes -= ticket->bytes;
|
||||
ticket->bytes = 0;
|
||||
space_info->tickets_id++;
|
||||
wake_up(&ticket->wait);
|
||||
} else {
|
||||
ticket->bytes -= num_bytes;
|
||||
|
@ -5426,6 +5426,7 @@ again:
|
|||
num_bytes -= ticket->bytes;
|
||||
space_info->bytes_may_use += ticket->bytes;
|
||||
ticket->bytes = 0;
|
||||
space_info->tickets_id++;
|
||||
wake_up(&ticket->wait);
|
||||
} else {
|
||||
trace_btrfs_space_reservation(fs_info, "space_info",
|
||||
|
@ -8216,6 +8217,7 @@ int btrfs_alloc_logged_file_extent(struct btrfs_trans_handle *trans,
|
|||
{
|
||||
int ret;
|
||||
struct btrfs_block_group_cache *block_group;
|
||||
struct btrfs_space_info *space_info;
|
||||
|
||||
/*
|
||||
* 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,
|
|||
if (!block_group)
|
||||
return -EINVAL;
|
||||
|
||||
ret = btrfs_add_reserved_bytes(block_group, ins->offset,
|
||||
ins->offset, 0);
|
||||
BUG_ON(ret); /* logic error */
|
||||
space_info = block_group->space_info;
|
||||
spin_lock(&space_info->lock);
|
||||
spin_lock(&block_group->lock);
|
||||
space_info->bytes_reserved += ins->offset;
|
||||
block_group->reserved += ins->offset;
|
||||
spin_unlock(&block_group->lock);
|
||||
spin_unlock(&space_info->lock);
|
||||
|
||||
ret = alloc_reserved_file_extent(trans, root, 0, root_objectid,
|
||||
0, owner, offset, ins, 1);
|
||||
btrfs_put_block_group(block_group);
|
||||
|
|
|
@ -2867,6 +2867,7 @@ int btrfs_sync_log(struct btrfs_trans_handle *trans,
|
|||
|
||||
if (log_root_tree->log_transid_committed >= root_log_ctx.log_transid) {
|
||||
blk_finish_plug(&plug);
|
||||
list_del_init(&root_log_ctx.list);
|
||||
mutex_unlock(&log_root_tree->log_mutex);
|
||||
ret = root_log_ctx.log_ret;
|
||||
goto out;
|
||||
|
|
Loading…
Reference in New Issue