aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTrond Myklebust <Trond.Myklebust@netapp.com>2008-10-09 13:27:55 -0400
committerTrond Myklebust <Trond.Myklebust@netapp.com>2008-10-09 13:34:07 -0400
commit03254e65a60d3113164672dbbadc023c4a56ecd1 (patch)
tree789d1e66b9af896ad113009dd1a4e3ced0c4ca4d
parent19d771f3caccaf66ce2fb539319222139e5b4e88 (diff)
NFS: Fix attribute updates
This fixes a regression seen when running the Connectathon testsuite against an ext3 filesystem. The reason was that the inode was constantly being marked as 'just updated' by the jiffy wraparound test. This again meant that newer GETATTR calls were failing to pass the nfs_inode_attrs_need_update() test unless the changes caused a ctime update on the server, since they were perceived as having been started before the latest inode update. Given that nfs_inode_attrs_need_update() already checks for wraparound of nfsi->last_updated, we can drop the buggy "protection" in nfs_update_inode(). Also make a slight micro-optimisation of nfs_inode_attrs_need_update(): we are more often going to see time_after(fattr->time_start, nfsi->last_updated) be true, rather than seeing an update of ctime/size, so put that test first to ensure that we optimise away the ctime/size tests. Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
-rw-r--r--fs/nfs/inode.c13
1 files changed, 4 insertions, 9 deletions
diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c
index e25009f35cc2..6554281e24a2 100644
--- a/fs/nfs/inode.c
+++ b/fs/nfs/inode.c
@@ -933,10 +933,10 @@ static int nfs_inode_attrs_need_update(const struct inode *inode, const struct n
933{ 933{
934 const struct nfs_inode *nfsi = NFS_I(inode); 934 const struct nfs_inode *nfsi = NFS_I(inode);
935 935
936 return nfs_ctime_need_update(inode, fattr) || 936 return time_after(fattr->time_start, nfsi->last_updated) ||
937 nfs_size_need_update(inode, fattr) || 937 nfs_ctime_need_update(inode, fattr) ||
938 time_after(fattr->time_start, nfsi->last_updated) || 938 nfs_size_need_update(inode, fattr) ||
939 time_after(nfsi->last_updated, jiffies); 939 time_after(nfsi->last_updated, jiffies);
940} 940}
941 941
942static int nfs_refresh_inode_locked(struct inode *inode, struct nfs_fattr *fattr) 942static int nfs_refresh_inode_locked(struct inode *inode, struct nfs_fattr *fattr)
@@ -1167,11 +1167,6 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr)
1167 nfsi->attrtimeo = NFS_MAXATTRTIMEO(inode); 1167 nfsi->attrtimeo = NFS_MAXATTRTIMEO(inode);
1168 nfsi->attrtimeo_timestamp = now; 1168 nfsi->attrtimeo_timestamp = now;
1169 } 1169 }
1170 /*
1171 * Avoid jiffy wraparound issues with nfsi->last_updated
1172 */
1173 if (!time_in_range(nfsi->last_updated, nfsi->read_cache_jiffies, now))
1174 nfsi->last_updated = nfsi->read_cache_jiffies;
1175 } 1170 }
1176 invalid &= ~NFS_INO_INVALID_ATTR; 1171 invalid &= ~NFS_INO_INVALID_ATTR;
1177 /* Don't invalidate the data if we were to blame */ 1172 /* Don't invalidate the data if we were to blame */