summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@sgi.com>2004-02-12 10:17:29 +1100
committerChristoph Hellwig <hch@sgi.com>2004-02-12 10:17:29 +1100
commitf5cf34e61ee6b2215ef864d2bb2e3adaf280fbf7 (patch)
tree381d0e918efd32546bdf457a03752d7a1d09eaf8
parent7b080b4c1c419e792e286c74de457522e2246335 (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.c12
-rw-r--r--fs/xfs/linux/xfs_vnode.c1
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