diff options
Diffstat (limited to 'fs/btrfs/inode.c')
| -rw-r--r-- | fs/btrfs/inode.c | 13 | 
1 files changed, 10 insertions, 3 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index f2b281ad7af6..4e024260ad71 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -7059,7 +7059,7 @@ insert:  	write_unlock(&em_tree->lock);  out: -	trace_btrfs_get_extent(root, em); +	trace_btrfs_get_extent(root, inode, em);  	btrfs_free_path(path);  	if (trans) { @@ -7623,11 +7623,18 @@ static void adjust_dio_outstanding_extents(struct inode *inode,  	 * within our reservation, otherwise we need to adjust our inode  	 * counter appropriately.  	 */ -	if (dio_data->outstanding_extents) { +	if (dio_data->outstanding_extents >= num_extents) {  		dio_data->outstanding_extents -= num_extents;  	} else { +		/* +		 * If dio write length has been split due to no large enough +		 * contiguous space, we need to compensate our inode counter +		 * appropriately. +		 */ +		u64 num_needed = num_extents - dio_data->outstanding_extents; +  		spin_lock(&BTRFS_I(inode)->lock); -		BTRFS_I(inode)->outstanding_extents += num_extents; +		BTRFS_I(inode)->outstanding_extents += num_needed;  		spin_unlock(&BTRFS_I(inode)->lock);  	}  }  | 
