diff options
Diffstat (limited to 'fs/btrfs/inode.c')
| -rw-r--r-- | fs/btrfs/inode.c | 13 | 
1 files changed, 9 insertions, 4 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 2b790bda7998..8e3a5a266917 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -4605,8 +4605,8 @@ delete:  			BUG_ON(ret);  			if (btrfs_should_throttle_delayed_refs(trans, root))  				btrfs_async_run_delayed_refs(root, -							     trans->transid, -					trans->delayed_ref_updates * 2, 0); +					trans->delayed_ref_updates * 2, +					trans->transid, 0);  			if (be_nice) {  				if (truncate_space_check(trans, root,  							 extent_num_bytes)) { @@ -8931,9 +8931,14 @@ again:  	 *    So even we call qgroup_free_data(), it won't decrease reserved  	 *    space.  	 * 2) Not written to disk -	 *    This means the reserved space should be freed here. +	 *    This means the reserved space should be freed here. However, +	 *    if a truncate invalidates the page (by clearing PageDirty) +	 *    and the page is accounted for while allocating extent +	 *    in btrfs_check_data_free_space() we let delayed_ref to +	 *    free the entire extent.  	 */ -	btrfs_qgroup_free_data(inode, page_start, PAGE_SIZE); +	if (PageDirty(page)) +		btrfs_qgroup_free_data(inode, page_start, PAGE_SIZE);  	if (!inode_evicting) {  		clear_extent_bit(tree, page_start, page_end,  				 EXTENT_LOCKED | EXTENT_DIRTY |  | 
