Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=17cadc95372e28024be0874e67329c1862912c5d
Commit:     17cadc95372e28024be0874e67329c1862912c5d
Parent:     e323ea46d95d7f8c789effd1194dfc120284dbbd
Author:     Trond Myklebust <[EMAIL PROTECTED]>
AuthorDate: Thu Sep 27 10:07:31 2007 -0400
Committer:  Trond Myklebust <[EMAIL PROTECTED]>
CommitDate: Tue Oct 9 17:18:55 2007 -0400

    NFS: Don't force a dcache revalidation if nfs_wcc_update_inode succeeds
    
    The reason is that if the weak cache consistency update was successful,
    then we know that our client must be the only one that changed the
    directory, and we've already updated the dcache to reflect the change.
    
    Signed-off-by: Trond Myklebust <[EMAIL PROTECTED]>
---
 fs/nfs/inode.c         |   11 +++--------
 fs/nfs/nfs4proc.c      |    7 +++++--
 include/linux/nfs_fs.h |    4 +++-
 3 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c
index f1f6639..7e73edc 100644
--- a/fs/nfs/inode.c
+++ b/fs/nfs/inode.c
@@ -791,24 +791,18 @@ void nfs_end_data_update(struct inode *inode)
 static void nfs_wcc_update_inode(struct inode *inode, struct nfs_fattr *fattr)
 {
        struct nfs_inode *nfsi = NFS_I(inode);
-       unsigned long now = jiffies;
 
        /* If we have atomic WCC data, we may update some attributes */
        if ((fattr->valid & NFS_ATTR_WCC) != 0) {
-               if (timespec_equal(&inode->i_ctime, &fattr->pre_ctime)) {
+               if (timespec_equal(&inode->i_ctime, &fattr->pre_ctime))
                        memcpy(&inode->i_ctime, &fattr->ctime, 
sizeof(inode->i_ctime));
-                       nfsi->cache_change_attribute = now;
-               }
                if (timespec_equal(&inode->i_mtime, &fattr->pre_mtime)) {
                        memcpy(&inode->i_mtime, &fattr->mtime, 
sizeof(inode->i_mtime));
                        if (S_ISDIR(inode->i_mode))
                                nfsi->cache_validity |= NFS_INO_INVALID_DATA;
-                       nfsi->cache_change_attribute = now;
                }
-               if (inode->i_size == fattr->pre_size && nfsi->npages == 0) {
+               if (inode->i_size == fattr->pre_size && nfsi->npages == 0)
                        inode->i_size = fattr->size;
-                       nfsi->cache_change_attribute = now;
-               }
        }
 }
 
@@ -919,6 +913,7 @@ int nfs_post_op_update_inode(struct inode *inode, struct 
nfs_fattr *fattr)
        if (unlikely((fattr->valid & NFS_ATTR_FATTR) == 0)) {
                spin_lock(&inode->i_lock);
                nfsi->cache_validity |= 
NFS_INO_INVALID_ACCESS|NFS_INO_INVALID_ATTR|NFS_INO_REVAL_PAGECACHE;
+               nfsi->cache_change_attribute = jiffies;
                spin_unlock(&inode->i_lock);
                goto out;
        }
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index 0e366a3..871c102 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -208,9 +208,12 @@ static void update_changeattr(struct inode *dir, struct 
nfs4_change_info *cinfo)
        struct nfs_inode *nfsi = NFS_I(dir);
 
        spin_lock(&dir->i_lock);
-       nfsi->cache_validity |= 
NFS_INO_INVALID_ATTR|NFS_INO_REVAL_PAGECACHE|NFS_INO_INVALID_DATA;
-       if (cinfo->before == nfsi->change_attr && cinfo->atomic)
+       if (cinfo->after != nfsi->change_attr) {
+               nfsi->cache_validity |= 
NFS_INO_INVALID_ATTR|NFS_INO_REVAL_PAGECACHE|NFS_INO_INVALID_DATA;
+               if (!cinfo->atomic || cinfo->before != nfsi->change_attr)
+                       nfsi->cache_change_attribute = jiffies;
                nfsi->change_attr = cinfo->after;
+       }
        spin_unlock(&dir->i_lock);
 }
 
diff --git a/include/linux/nfs_fs.h b/include/linux/nfs_fs.h
index f451613..fd2c5c8 100644
--- a/include/linux/nfs_fs.h
+++ b/include/linux/nfs_fs.h
@@ -235,8 +235,10 @@ static inline void nfs_mark_for_revalidate(struct inode 
*inode)
 
        spin_lock(&inode->i_lock);
        nfsi->cache_validity |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_ACCESS;
-       if (S_ISDIR(inode->i_mode))
+       if (S_ISDIR(inode->i_mode)) {
                nfsi->cache_validity |= 
NFS_INO_REVAL_PAGECACHE|NFS_INO_INVALID_DATA;
+               nfsi->cache_change_attribute = jiffies;
+       }
        spin_unlock(&inode->i_lock);
 }
 
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to