Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=412c77cee6d6e73fbe1dc3d67f52163efed33fc4
Commit:     412c77cee6d6e73fbe1dc3d67f52163efed33fc4
Parent:     8383e4602c89857ef926f29ca61ac0a83a614443
Author:     Trond Myklebust <[EMAIL PROTECTED]>
AuthorDate: Tue Jul 3 16:10:55 2007 -0400
Committer:  Trond Myklebust <[EMAIL PROTECTED]>
CommitDate: Tue Jul 10 23:40:41 2007 -0400

    NFSv4: Defer inode revalidation when setting up a delegation
    
    Currently we force a synchronous call to __nfs_revalidate_inode() in
    nfs_inode_set_delegation(). This not only ensures that we cannot call
    nfs_inode_set_delegation from an asynchronous context, but it also slows
    down any call to open().
    
    Signed-off-by: Trond Myklebust <[EMAIL PROTECTED]>
---
 fs/nfs/delegation.c    |   10 ++++++----
 fs/nfs/inode.c         |    4 +++-
 include/linux/nfs_fs.h |    1 +
 3 files changed, 10 insertions(+), 5 deletions(-)

diff --git a/fs/nfs/delegation.c b/fs/nfs/delegation.c
index 56f4f6a..20ac403 100644
--- a/fs/nfs/delegation.c
+++ b/fs/nfs/delegation.c
@@ -124,10 +124,6 @@ int nfs_inode_set_delegation(struct inode *inode, struct 
rpc_cred *cred, struct
        struct nfs_delegation *delegation;
        int status = 0;
 
-       /* Ensure we first revalidate the attributes and page cache! */
-       if ((nfsi->cache_validity & 
(NFS_INO_REVAL_PAGECACHE|NFS_INO_INVALID_ATTR)))
-               __nfs_revalidate_inode(NFS_SERVER(inode), inode);
-
        delegation = kmalloc(sizeof(*delegation), GFP_KERNEL);
        if (delegation == NULL)
                return -ENOMEM;
@@ -154,6 +150,12 @@ int nfs_inode_set_delegation(struct inode *inode, struct 
rpc_cred *cred, struct
                        status = -EIO;
                }
        }
+
+       /* Ensure we revalidate the attributes and page cache! */
+       spin_lock(&inode->i_lock);
+       nfsi->cache_validity |= NFS_INO_REVAL_FORCED;
+       spin_unlock(&inode->i_lock);
+
        spin_unlock(&clp->cl_lock);
        kfree(delegation);
        return status;
diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c
index 9d51241..3d9fccf 100644
--- a/fs/nfs/inode.c
+++ b/fs/nfs/inode.c
@@ -1072,8 +1072,10 @@ static int nfs_update_inode(struct inode *inode, struct 
nfs_fattr *fattr)
                invalid &= ~NFS_INO_INVALID_DATA;
        if (data_stable)
                invalid &= 
~(NFS_INO_INVALID_ATTR|NFS_INO_INVALID_ATIME|NFS_INO_REVAL_PAGECACHE);
-       if (!nfs_have_delegation(inode, FMODE_READ))
+       if (!nfs_have_delegation(inode, FMODE_READ) ||
+                       (nfsi->cache_validity & NFS_INO_REVAL_FORCED))
                nfsi->cache_validity |= invalid;
+       nfsi->cache_validity &= ~NFS_INO_REVAL_FORCED;
 
        return 0;
  out_changed:
diff --git a/include/linux/nfs_fs.h b/include/linux/nfs_fs.h
index cf39535..e949710 100644
--- a/include/linux/nfs_fs.h
+++ b/include/linux/nfs_fs.h
@@ -184,6 +184,7 @@ struct nfs_inode {
 #define NFS_INO_INVALID_ACCESS 0x0008          /* cached access cred invalid */
 #define NFS_INO_INVALID_ACL    0x0010          /* cached acls are invalid */
 #define NFS_INO_REVAL_PAGECACHE        0x0020          /* must revalidate 
pagecache */
+#define NFS_INO_REVAL_FORCED   0x0040          /* force revalidation ignoring 
a delegation */
 
 /*
  * Bit offsets in flags field
-
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