Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 61876
b: refs/heads/master
c: c32676e
h: refs/heads/master
v: v3
  • Loading branch information
David Chinner authored and Tim Shimmin committed Jul 19, 2007
1 parent 4add77d commit a75b4d6
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 2 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 91ebecc74eeeeea0a2aa50bf1964ec2214a229c9
refs/heads/master: c32676eea19ce29cb74dba0f97b085e83f6b8915
25 changes: 24 additions & 1 deletion trunk/fs/xfs/xfs_vnodeops.c
Original file line number Diff line number Diff line change
Expand Up @@ -589,7 +589,30 @@ xfs_setattr(
code = xfs_igrow_start(ip, vap->va_size, credp);
}
xfs_iunlock(ip, XFS_ILOCK_EXCL);
vn_iowait(vp); /* wait for the completion of any pending DIOs */

/*
* We are going to log the inode size change in this
* transaction so any previous writes that are beyond the on
* disk EOF and the new EOF that have not been written out need
* to be written here. If we do not write the data out, we
* expose ourselves to the null files problem.
*
* Only flush from the on disk size to the smaller of the in
* memory file size or the new size as that's the range we
* really care about here and prevents waiting for other data
* not within the range we care about here.
*/
if (!code &&
(ip->i_size != ip->i_d.di_size) &&
(vap->va_size > ip->i_d.di_size)) {
code = bhv_vop_flush_pages(XFS_ITOV(ip),
ip->i_d.di_size, vap->va_size,
XFS_B_ASYNC, FI_NONE);
}

/* wait for all I/O to complete */
vn_iowait(vp);

if (!code)
code = xfs_itruncate_data(ip, vap->va_size);
if (code) {
Expand Down

0 comments on commit a75b4d6

Please sign in to comment.