diff options
| author | Josef Bacik <jbacik@fusionio.com> | 2013-01-30 14:17:31 -0500 | 
|---|---|---|
| committer | Josef Bacik <jbacik@fusionio.com> | 2013-02-05 16:09:14 -0500 | 
| commit | 5d1f40202bad12d4c70a2d40a420b30d23a72b1a (patch) | |
| tree | 131c687a9c4dca34d91a98382d876536de28aae6 /fs/btrfs/ordered-data.c | |
| parent | 6f1c36055f96e80031c7fdda3fd5be826b8d7782 (diff) | |
| download | olio-linux-3.10-5d1f40202bad12d4c70a2d40a420b30d23a72b1a.tar.xz olio-linux-3.10-5d1f40202bad12d4c70a2d40a420b30d23a72b1a.zip  | |
Btrfs: fix missing i_size update
If we have an ordered extent before the ordered extent we are currently
completing that is after the current disk_i_size we will put our i_size
update into that ordered extent so that we do not expose stale data.  The
problem is that if our disk i_size is updated past the previous ordered
extent we won't update the i_size with the pending i_size update.  So check
the pending i_size update and if its above the current disk i_size we need
to go ahead and try to update.  Thanks,
Signed-off-by: Josef Bacik <jbacik@fusionio.com>
Diffstat (limited to 'fs/btrfs/ordered-data.c')
| -rw-r--r-- | fs/btrfs/ordered-data.c | 11 | 
1 files changed, 9 insertions, 2 deletions
diff --git a/fs/btrfs/ordered-data.c b/fs/btrfs/ordered-data.c index f1073129704..fc6840b53d9 100644 --- a/fs/btrfs/ordered-data.c +++ b/fs/btrfs/ordered-data.c @@ -836,9 +836,16 @@ int btrfs_ordered_update_i_size(struct inode *inode, u64 offset,  	 * if the disk i_size is already at the inode->i_size, or  	 * this ordered extent is inside the disk i_size, we're done  	 */ -	if (disk_i_size == i_size || offset <= disk_i_size) { +	if (disk_i_size == i_size) +		goto out; + +	/* +	 * We still need to update disk_i_size if outstanding_isize is greater +	 * than disk_i_size. +	 */ +	if (offset <= disk_i_size && +	    (!ordered || ordered->outstanding_isize <= disk_i_size))  		goto out; -	}  	/*  	 * walk backward from this ordered extent to disk_i_size.  |