diff options
Diffstat (limited to 'fs/btrfs/extent-tree.c')
| -rw-r--r-- | fs/btrfs/extent-tree.c | 21 | 
1 files changed, 14 insertions, 7 deletions
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index b15afeae16df..d81035b7ea7d 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c @@ -2456,12 +2456,10 @@ static int run_and_cleanup_extent_op(struct btrfs_trans_handle *trans,  	return ret ? ret : 1;  } -static void cleanup_ref_head_accounting(struct btrfs_trans_handle *trans, -					struct btrfs_delayed_ref_head *head) +void btrfs_cleanup_ref_head_accounting(struct btrfs_fs_info *fs_info, +				  struct btrfs_delayed_ref_root *delayed_refs, +				  struct btrfs_delayed_ref_head *head)  { -	struct btrfs_fs_info *fs_info = trans->fs_info; -	struct btrfs_delayed_ref_root *delayed_refs = -		&trans->transaction->delayed_refs;  	int nr_items = 1;	/* Dropping this ref head update. */  	if (head->total_ref_mod < 0) { @@ -2544,7 +2542,7 @@ static int cleanup_ref_head(struct btrfs_trans_handle *trans,  		}  	} -	cleanup_ref_head_accounting(trans, head); +	btrfs_cleanup_ref_head_accounting(fs_info, delayed_refs, head);  	trace_run_delayed_ref_head(fs_info, head, 0);  	btrfs_delayed_ref_unlock(head); @@ -4954,6 +4952,15 @@ static void flush_space(struct btrfs_fs_info *fs_info,  			ret = 0;  		break;  	case COMMIT_TRANS: +		/* +		 * If we have pending delayed iputs then we could free up a +		 * bunch of pinned space, so make sure we run the iputs before +		 * we do our pinned bytes check below. +		 */ +		mutex_lock(&fs_info->cleaner_delayed_iput_mutex); +		btrfs_run_delayed_iputs(fs_info); +		mutex_unlock(&fs_info->cleaner_delayed_iput_mutex); +  		ret = may_commit_transaction(fs_info, space_info);  		break;  	default: @@ -7188,7 +7195,7 @@ static noinline int check_ref_cleanup(struct btrfs_trans_handle *trans,  	if (head->must_insert_reserved)  		ret = 1; -	cleanup_ref_head_accounting(trans, head); +	btrfs_cleanup_ref_head_accounting(trans->fs_info, delayed_refs, head);  	mutex_unlock(&head->mutex);  	btrfs_put_delayed_ref_head(head);  	return ret;  | 
