]> git.neil.brown.name Git - history.git/commitdiff
[XFS] make sure i_size_write is called under i_sem
authorChristoph Hellwig <hch@sgi.com>
Wed, 11 Feb 2004 23:17:29 +0000 (10:17 +1100)
committerChristoph Hellwig <hch@sgi.com>
Wed, 11 Feb 2004 23:17:29 +0000 (10:17 +1100)
SGI Modid: xfs-linux:xfs-kern:166504a

fs/xfs/linux/xfs_iops.c
fs/xfs/linux/xfs_vnode.c

index e9ee4bd0f901e8e77242aff5dd17fd6282dc13b7..790aff8046ca6320b10c3104491c7f31368d3a3c 100644 (file)
@@ -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);
        }
 
index 7a700ac147c27c4631ca35a32bd2af2d2d140284..9240efb2b86249b7d906432f802bf7f53f190f2e 100644 (file)
@@ -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