diff options
Diffstat (limited to 'fs/xfs/xfs_file.c')
| -rw-r--r-- | fs/xfs/xfs_file.c | 18 | 
1 files changed, 13 insertions, 5 deletions
| diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 79e96ce98733..830c1c937b88 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -155,7 +155,7 @@ xfs_dir_fsync(  	if (!lsn)  		return 0; -	return _xfs_log_force_lsn(mp, lsn, XFS_LOG_SYNC, NULL); +	return -_xfs_log_force_lsn(mp, lsn, XFS_LOG_SYNC, NULL);  }  STATIC int @@ -295,7 +295,7 @@ xfs_file_aio_read(  		xfs_rw_ilock(ip, XFS_IOLOCK_EXCL);  		if (inode->i_mapping->nrpages) { -			ret = -filemap_write_and_wait_range( +			ret = filemap_write_and_wait_range(  							VFS_I(ip)->i_mapping,  							pos, -1);  			if (ret) { @@ -679,7 +679,7 @@ xfs_file_dio_aio_write(  		goto out;  	if (mapping->nrpages) { -		ret = -filemap_write_and_wait_range(VFS_I(ip)->i_mapping, +		ret = filemap_write_and_wait_range(VFS_I(ip)->i_mapping,  						    pos, -1);  		if (ret)  			goto out; @@ -837,11 +837,19 @@ xfs_file_fallocate(  		unsigned blksize_mask = (1 << inode->i_blkbits) - 1;  		if (offset & blksize_mask || len & blksize_mask) { -			error = -EINVAL; +			error = EINVAL; +			goto out_unlock; +		} + +		/* +		 * There is no need to overlap collapse range with EOF, +		 * in which case it is effectively a truncate operation +		 */ +		if (offset + len >= i_size_read(inode)) { +			error = EINVAL;  			goto out_unlock;  		} -		ASSERT(offset + len < i_size_read(inode));  		new_size = i_size_read(inode) - len;  		error = xfs_collapse_file_space(ip, offset, len); | 

