|
@@ -391,6 +391,8 @@ xfs_splice_write(
|
|
xfs_inode_t *ip = XFS_BHVTOI(bdp);
|
|
xfs_inode_t *ip = XFS_BHVTOI(bdp);
|
|
xfs_mount_t *mp = ip->i_mount;
|
|
xfs_mount_t *mp = ip->i_mount;
|
|
ssize_t ret;
|
|
ssize_t ret;
|
|
|
|
+ struct inode *inode = outfilp->f_mapping->host;
|
|
|
|
+ xfs_fsize_t isize;
|
|
|
|
|
|
XFS_STATS_INC(xs_write_calls);
|
|
XFS_STATS_INC(xs_write_calls);
|
|
if (XFS_FORCED_SHUTDOWN(ip->i_mount))
|
|
if (XFS_FORCED_SHUTDOWN(ip->i_mount))
|
|
@@ -417,6 +419,20 @@ xfs_splice_write(
|
|
if (ret > 0)
|
|
if (ret > 0)
|
|
XFS_STATS_ADD(xs_write_bytes, ret);
|
|
XFS_STATS_ADD(xs_write_bytes, ret);
|
|
|
|
|
|
|
|
+ isize = i_size_read(inode);
|
|
|
|
+ if (unlikely(ret < 0 && ret != -EFAULT && *ppos > isize))
|
|
|
|
+ *ppos = isize;
|
|
|
|
+
|
|
|
|
+ if (*ppos > ip->i_d.di_size) {
|
|
|
|
+ xfs_ilock(ip, XFS_ILOCK_EXCL);
|
|
|
|
+ if (*ppos > ip->i_d.di_size) {
|
|
|
|
+ ip->i_d.di_size = *ppos;
|
|
|
|
+ i_size_write(inode, *ppos);
|
|
|
|
+ ip->i_update_core = 1;
|
|
|
|
+ ip->i_update_size = 1;
|
|
|
|
+ }
|
|
|
|
+ xfs_iunlock(ip, XFS_ILOCK_EXCL);
|
|
|
|
+ }
|
|
xfs_iunlock(ip, XFS_IOLOCK_EXCL);
|
|
xfs_iunlock(ip, XFS_IOLOCK_EXCL);
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|