xfs: factor post-write newsize updates
Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Alex Elder <aelder@sgi.com> Reviewed-by: Christoph Hellwig <hch@lst.de>
This commit is contained in:
parent
edafb6da9a
commit
4c5cfd1b41
@ -345,6 +345,25 @@ xfs_aio_write_isize_update(
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* If this was a direct or synchronous I/O that failed (such as ENOSPC) then
|
||||
* part of the I/O may have been written to disk before the error occured. In
|
||||
* this case the on-disk file size may have been adjusted beyond the in-memory
|
||||
* file size and now needs to be truncated back.
|
||||
*/
|
||||
STATIC void
|
||||
xfs_aio_write_newsize_update(
|
||||
struct xfs_inode *ip)
|
||||
{
|
||||
if (ip->i_new_size) {
|
||||
xfs_ilock(ip, XFS_ILOCK_EXCL);
|
||||
ip->i_new_size = 0;
|
||||
if (ip->i_d.di_size > ip->i_size)
|
||||
ip->i_d.di_size = ip->i_size;
|
||||
xfs_iunlock(ip, XFS_ILOCK_EXCL);
|
||||
}
|
||||
}
|
||||
|
||||
STATIC ssize_t
|
||||
xfs_file_splice_write(
|
||||
struct pipe_inode_info *pipe,
|
||||
@ -381,14 +400,7 @@ xfs_file_splice_write(
|
||||
ret = generic_file_splice_write(pipe, outfilp, ppos, count, flags);
|
||||
|
||||
xfs_aio_write_isize_update(inode, ppos, ret);
|
||||
|
||||
if (ip->i_new_size) {
|
||||
xfs_ilock(ip, XFS_ILOCK_EXCL);
|
||||
ip->i_new_size = 0;
|
||||
if (ip->i_d.di_size > ip->i_size)
|
||||
ip->i_d.di_size = ip->i_size;
|
||||
xfs_iunlock(ip, XFS_ILOCK_EXCL);
|
||||
}
|
||||
xfs_aio_write_newsize_update(ip);
|
||||
xfs_iunlock(ip, XFS_IOLOCK_EXCL);
|
||||
return ret;
|
||||
}
|
||||
@ -781,20 +793,7 @@ write_retry:
|
||||
}
|
||||
|
||||
out_unlock_internal:
|
||||
if (ip->i_new_size) {
|
||||
xfs_ilock(ip, XFS_ILOCK_EXCL);
|
||||
ip->i_new_size = 0;
|
||||
/*
|
||||
* If this was a direct or synchronous I/O that failed (such
|
||||
* as ENOSPC) then part of the I/O may have been written to
|
||||
* disk before the error occured. In this case the on-disk
|
||||
* file size may have been adjusted beyond the in-memory file
|
||||
* size and now needs to be truncated back.
|
||||
*/
|
||||
if (ip->i_d.di_size > ip->i_size)
|
||||
ip->i_d.di_size = ip->i_size;
|
||||
xfs_iunlock(ip, XFS_ILOCK_EXCL);
|
||||
}
|
||||
xfs_aio_write_newsize_update(ip);
|
||||
xfs_iunlock(ip, iolock);
|
||||
out_unlock_mutex:
|
||||
if (need_i_mutex)
|
||||
|
Loading…
Reference in New Issue
Block a user