diff options
Diffstat (limited to 'fs/btrfs/file.c')
| -rw-r--r-- | fs/btrfs/file.c | 13 | 
1 files changed, 11 insertions, 2 deletions
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c index 9f455c96c974..380054c94e4b 100644 --- a/fs/btrfs/file.c +++ b/fs/btrfs/file.c @@ -2957,8 +2957,9 @@ out:  	return ret;  } -static int btrfs_punch_hole(struct inode *inode, loff_t offset, loff_t len) +static int btrfs_punch_hole(struct file *file, loff_t offset, loff_t len)  { +	struct inode *inode = file_inode(file);  	struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb);  	struct btrfs_root *root = BTRFS_I(inode)->root;  	struct extent_state *cached_state = NULL; @@ -2990,6 +2991,10 @@ static int btrfs_punch_hole(struct inode *inode, loff_t offset, loff_t len)  		goto out_only_mutex;  	} +	ret = file_modified(file); +	if (ret) +		goto out_only_mutex; +  	lockstart = round_up(offset, btrfs_inode_sectorsize(BTRFS_I(inode)));  	lockend = round_down(offset + len,  			     btrfs_inode_sectorsize(BTRFS_I(inode))) - 1; @@ -3430,7 +3435,7 @@ static long btrfs_fallocate(struct file *file, int mode,  		return -EOPNOTSUPP;  	if (mode & FALLOC_FL_PUNCH_HOLE) -		return btrfs_punch_hole(inode, offset, len); +		return btrfs_punch_hole(file, offset, len);  	/*  	 * Only trigger disk allocation, don't trigger qgroup reserve @@ -3452,6 +3457,10 @@ static long btrfs_fallocate(struct file *file, int mode,  			goto out;  	} +	ret = file_modified(file); +	if (ret) +		goto out; +  	/*  	 * TODO: Move these two operations after we have checked  	 * accurate reserved space, or fallocate can still fail but  | 
