diff options
author | Trond Myklebust <Trond.Myklebust@netapp.com> | 2008-07-15 17:58:13 -0400 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2008-10-07 17:22:20 -0400 |
commit | 4eec952e42314b53e48fef1f54dd89cbf9789734 (patch) | |
tree | 6c0e407472224954987021a815036fe561f88c5a | |
parent | 1daef0a868370c5a96d031b9202e3354bea060e6 (diff) |
NFS: Add options for finer control of the lookup cache
Add the flag NFS_MOUNT_LOOKUP_CACHE_NONEG to turn off the caching of
negative dentries. In reality what we do is to force
nfs_lookup_revalidate() to always discard negative dentries.
Add the flag NFS_MOUNT_LOOKUP_CACHE_NONE for enforcing stricter
revalidation of dentries. It forces the revalidate code to always do a
lookup instead of just checking the cached mtime of the parent directory.
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
-rw-r--r-- | fs/nfs/dir.c | 4 | ||||
-rw-r--r-- | include/linux/nfs_mount.h | 4 |
2 files changed, 8 insertions, 0 deletions
diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c index 74f92b717f78..49d565412827 100644 --- a/fs/nfs/dir.c +++ b/fs/nfs/dir.c | |||
@@ -667,6 +667,8 @@ static int nfs_check_verifier(struct inode *dir, struct dentry *dentry) | |||
667 | { | 667 | { |
668 | if (IS_ROOT(dentry)) | 668 | if (IS_ROOT(dentry)) |
669 | return 1; | 669 | return 1; |
670 | if (NFS_SERVER(dir)->flags & NFS_MOUNT_LOOKUP_CACHE_NONE) | ||
671 | return 0; | ||
670 | if (!nfs_verify_change_attribute(dir, dentry->d_time)) | 672 | if (!nfs_verify_change_attribute(dir, dentry->d_time)) |
671 | return 0; | 673 | return 0; |
672 | /* Revalidate nfsi->cache_change_attribute before we declare a match */ | 674 | /* Revalidate nfsi->cache_change_attribute before we declare a match */ |
@@ -750,6 +752,8 @@ int nfs_neg_need_reval(struct inode *dir, struct dentry *dentry, | |||
750 | /* Don't revalidate a negative dentry if we're creating a new file */ | 752 | /* Don't revalidate a negative dentry if we're creating a new file */ |
751 | if (nd != NULL && nfs_lookup_check_intent(nd, LOOKUP_CREATE) != 0) | 753 | if (nd != NULL && nfs_lookup_check_intent(nd, LOOKUP_CREATE) != 0) |
752 | return 0; | 754 | return 0; |
755 | if (NFS_SERVER(dir)->flags & NFS_MOUNT_LOOKUP_CACHE_NONEG) | ||
756 | return 1; | ||
753 | return !nfs_check_verifier(dir, dentry); | 757 | return !nfs_check_verifier(dir, dentry); |
754 | } | 758 | } |
755 | 759 | ||
diff --git a/include/linux/nfs_mount.h b/include/linux/nfs_mount.h index df7c6b7a7ebb..6549a06ac16e 100644 --- a/include/linux/nfs_mount.h +++ b/include/linux/nfs_mount.h | |||
@@ -65,4 +65,8 @@ struct nfs_mount_data { | |||
65 | #define NFS_MOUNT_UNSHARED 0x8000 /* 5 */ | 65 | #define NFS_MOUNT_UNSHARED 0x8000 /* 5 */ |
66 | #define NFS_MOUNT_FLAGMASK 0xFFFF | 66 | #define NFS_MOUNT_FLAGMASK 0xFFFF |
67 | 67 | ||
68 | /* The following are for internal use only */ | ||
69 | #define NFS_MOUNT_LOOKUP_CACHE_NONEG 0x10000 | ||
70 | #define NFS_MOUNT_LOOKUP_CACHE_NONE 0x20000 | ||
71 | |||
68 | #endif | 72 | #endif |