diff options
author | Josef Bacik <jbacik@fusionio.com> | 2013-01-30 20:17:31 +0100 |
---|---|---|
committer | Josef Bacik <jbacik@fusionio.com> | 2013-02-05 22:09:14 +0100 |
commit | 5d1f40202bad12d4c70a2d40a420b30d23a72b1a (patch) | |
tree | 131c687a9c4dca34d91a98382d876536de28aae6 /fs | |
parent | Btrfs: fix race between snapshot deletion and getting inode (diff) | |
download | linux-5d1f40202bad12d4c70a2d40a420b30d23a72b1a.tar.xz linux-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')
-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 f10731297040..fc6840b53d9d 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. |