diff options
| author | Christoph Hellwig <hch@sgi.com> | 2004-02-12 10:17:29 +1100 |
|---|---|---|
| committer | Christoph Hellwig <hch@sgi.com> | 2004-02-12 10:17:29 +1100 |
| commit | f5cf34e61ee6b2215ef864d2bb2e3adaf280fbf7 (patch) | |
| tree | 381d0e918efd32546bdf457a03752d7a1d09eaf8 | |
| parent | 7b080b4c1c419e792e286c74de457522e2246335 (diff) | |
[XFS] make sure i_size_write is called under i_sem
SGI Modid: xfs-linux:xfs-kern:166504a
| -rw-r--r-- | fs/xfs/linux/xfs_iops.c | 12 | ||||
| -rw-r--r-- | fs/xfs/linux/xfs_vnode.c | 1 |
2 files changed, 9 insertions, 4 deletions
diff --git a/fs/xfs/linux/xfs_iops.c b/fs/xfs/linux/xfs_iops.c index e9ee4bd0f901..790aff8046ca 100644 --- a/fs/xfs/linux/xfs_iops.c +++ b/fs/xfs/linux/xfs_iops.c @@ -82,9 +82,14 @@ validate_fields( va.va_mask = XFS_AT_NLINK|XFS_AT_SIZE|XFS_AT_NBLOCKS; VOP_GETATTR(vp, &va, ATTR_LAZY, NULL, error); - ip->i_nlink = va.va_nlink; - ip->i_size = va.va_size; - ip->i_blocks = va.va_nblocks; + if (likely(!error)) { + ip->i_nlink = va.va_nlink; + ip->i_blocks = va.va_nblocks; + + /* we're under i_sem so i_size can't change under us */ + if (i_size_read(ip) != va.va_size) + i_size_write(ip, va.va_size); + } } /* @@ -536,6 +541,7 @@ linvfs_setattr( if (error) return(-error); /* Positive error up from XFS */ if (ia_valid & ATTR_SIZE) { + i_size_write(inode, vattr.va_size); error = vmtruncate(inode, attr->ia_size); } diff --git a/fs/xfs/linux/xfs_vnode.c b/fs/xfs/linux/xfs_vnode.c index 7a700ac147c2..9240efb2b862 100644 --- a/fs/xfs/linux/xfs_vnode.c +++ b/fs/xfs/linux/xfs_vnode.c @@ -213,7 +213,6 @@ vn_revalidate( inode->i_mtime = va.va_mtime; inode->i_ctime = va.va_ctime; inode->i_atime = va.va_atime; - i_size_write(inode, va.va_size); if (va.va_xflags & XFS_XFLAG_IMMUTABLE) inode->i_flags |= S_IMMUTABLE; else |
