mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-11 05:17:10 +09:00
Btrfs: read inode size after acquiring the mutex when punching a hole
commita1a50f60a6upstream. In a previous change, commit12870f1c9b, I accidentally moved the roundup of inode->i_size to outside of the critical section delimited by the inode mutex, which is not atomic and not correct since the size can be changed by other task before we acquire the mutex. Therefore fix it. Signed-off-by: Filipe David Borba Manana <fdmanana@gmail.com> Signed-off-by: Chris Mason <clm@fb.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
bddf0faccf
commit
2501c4a066
@@ -2200,13 +2200,14 @@ static int btrfs_punch_hole(struct inode *inode, loff_t offset, loff_t len)
|
||||
bool same_page = ((offset >> PAGE_CACHE_SHIFT) ==
|
||||
((offset + len - 1) >> PAGE_CACHE_SHIFT));
|
||||
bool no_holes = btrfs_fs_incompat(root->fs_info, NO_HOLES);
|
||||
u64 ino_size = round_up(inode->i_size, PAGE_CACHE_SIZE);
|
||||
u64 ino_size;
|
||||
|
||||
ret = btrfs_wait_ordered_range(inode, offset, len);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
mutex_lock(&inode->i_mutex);
|
||||
ino_size = round_up(inode->i_size, PAGE_CACHE_SIZE);
|
||||
/*
|
||||
* We needn't truncate any page which is beyond the end of the file
|
||||
* because we are sure there is no data there.
|
||||
|
||||
Reference in New Issue
Block a user