diff options
| author | Trond Myklebust <Trond.Myklebust@netapp.com> | 2007-10-08 14:26:13 -0400 |
|---|---|---|
| committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2007-10-09 17:20:50 -0400 |
| commit | 2a3f5fd45938bd86ce8faf4cb26be4f7e9ae2941 (patch) | |
| tree | 84ed5c302b9a126fae440faa6cda0494ce4ca36b /fs | |
| parent | 40d24704091c8a29a4c99d25670f1996749aea6f (diff) | |
NFS: nfs_refresh_inode should clear cache_validity flags on success
If the cached attributes match the ones supplied in the fattr, then assume
we've revalidated the inode.
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'fs')
| -rw-r--r-- | fs/nfs/inode.c | 35 |
1 files changed, 17 insertions, 18 deletions
diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c index c44cd02e5181..cad1246bf575 100644 --- a/fs/nfs/inode.c +++ b/fs/nfs/inode.c | |||
| @@ -790,6 +790,7 @@ static int nfs_check_inode_attributes(struct inode *inode, struct nfs_fattr *fat | |||
| 790 | { | 790 | { |
| 791 | struct nfs_inode *nfsi = NFS_I(inode); | 791 | struct nfs_inode *nfsi = NFS_I(inode); |
| 792 | loff_t cur_size, new_isize; | 792 | loff_t cur_size, new_isize; |
| 793 | unsigned long invalid = 0; | ||
| 793 | 794 | ||
| 794 | 795 | ||
| 795 | /* Has the inode gone and changed behind our back? */ | 796 | /* Has the inode gone and changed behind our back? */ |
| @@ -803,29 +804,36 @@ static int nfs_check_inode_attributes(struct inode *inode, struct nfs_fattr *fat | |||
| 803 | 804 | ||
| 804 | if ((fattr->valid & NFS_ATTR_FATTR_V4) != 0 && | 805 | if ((fattr->valid & NFS_ATTR_FATTR_V4) != 0 && |
| 805 | nfsi->change_attr != fattr->change_attr) | 806 | nfsi->change_attr != fattr->change_attr) |
| 806 | nfsi->cache_validity |= NFS_INO_INVALID_ATTR|NFS_INO_REVAL_PAGECACHE; | 807 | invalid |= NFS_INO_INVALID_ATTR|NFS_INO_REVAL_PAGECACHE; |
| 807 | 808 | ||
| 808 | /* Verify a few of the more important attributes */ | 809 | /* Verify a few of the more important attributes */ |
| 809 | if (!timespec_equal(&inode->i_mtime, &fattr->mtime)) | 810 | if (!timespec_equal(&inode->i_mtime, &fattr->mtime)) |
| 810 | nfsi->cache_validity |= NFS_INO_INVALID_ATTR|NFS_INO_REVAL_PAGECACHE; | 811 | invalid |= NFS_INO_INVALID_ATTR|NFS_INO_REVAL_PAGECACHE; |
| 811 | 812 | ||
| 812 | cur_size = i_size_read(inode); | 813 | cur_size = i_size_read(inode); |
| 813 | new_isize = nfs_size_to_loff_t(fattr->size); | 814 | new_isize = nfs_size_to_loff_t(fattr->size); |
| 814 | if (cur_size != new_isize && nfsi->npages == 0) | 815 | if (cur_size != new_isize && nfsi->npages == 0) |
| 815 | nfsi->cache_validity |= NFS_INO_INVALID_ATTR|NFS_INO_REVAL_PAGECACHE; | 816 | invalid |= NFS_INO_INVALID_ATTR|NFS_INO_REVAL_PAGECACHE; |
| 816 | 817 | ||
| 817 | /* Have any file permissions changed? */ | 818 | /* Have any file permissions changed? */ |
| 818 | if ((inode->i_mode & S_IALLUGO) != (fattr->mode & S_IALLUGO) | 819 | if ((inode->i_mode & S_IALLUGO) != (fattr->mode & S_IALLUGO) |
| 819 | || inode->i_uid != fattr->uid | 820 | || inode->i_uid != fattr->uid |
| 820 | || inode->i_gid != fattr->gid) | 821 | || inode->i_gid != fattr->gid) |
| 821 | nfsi->cache_validity |= NFS_INO_INVALID_ATTR | NFS_INO_INVALID_ACCESS | NFS_INO_INVALID_ACL; | 822 | invalid |= NFS_INO_INVALID_ATTR | NFS_INO_INVALID_ACCESS | NFS_INO_INVALID_ACL; |
| 822 | 823 | ||
| 823 | /* Has the link count changed? */ | 824 | /* Has the link count changed? */ |
| 824 | if (inode->i_nlink != fattr->nlink) | 825 | if (inode->i_nlink != fattr->nlink) |
| 825 | nfsi->cache_validity |= NFS_INO_INVALID_ATTR; | 826 | invalid |= NFS_INO_INVALID_ATTR; |
| 826 | 827 | ||
| 827 | if (!timespec_equal(&inode->i_atime, &fattr->atime)) | 828 | if (!timespec_equal(&inode->i_atime, &fattr->atime)) |
| 828 | nfsi->cache_validity |= NFS_INO_INVALID_ATIME; | 829 | invalid |= NFS_INO_INVALID_ATIME; |
| 830 | |||
| 831 | if (invalid != 0) | ||
| 832 | nfsi->cache_validity |= invalid; | ||
| 833 | else | ||
| 834 | nfsi->cache_validity &= ~(NFS_INO_INVALID_ATTR | ||
| 835 | | NFS_INO_INVALID_ATIME | ||
| 836 | | NFS_INO_REVAL_PAGECACHE); | ||
| 829 | 837 | ||
| 830 | nfsi->read_cache_jiffies = fattr->time_start; | 838 | nfsi->read_cache_jiffies = fattr->time_start; |
| 831 | return 0; | 839 | return 0; |
| @@ -876,21 +884,12 @@ int nfs_post_op_update_inode(struct inode *inode, struct nfs_fattr *fattr) | |||
| 876 | { | 884 | { |
| 877 | struct nfs_inode *nfsi = NFS_I(inode); | 885 | struct nfs_inode *nfsi = NFS_I(inode); |
| 878 | 886 | ||
| 879 | if (fattr->valid & NFS_ATTR_FATTR) { | ||
| 880 | if (S_ISDIR(inode->i_mode)) { | ||
| 881 | spin_lock(&inode->i_lock); | ||
| 882 | nfsi->cache_validity |= NFS_INO_INVALID_DATA; | ||
| 883 | spin_unlock(&inode->i_lock); | ||
| 884 | } | ||
| 885 | return nfs_refresh_inode(inode, fattr); | ||
| 886 | } | ||
| 887 | |||
| 888 | spin_lock(&inode->i_lock); | 887 | spin_lock(&inode->i_lock); |
| 889 | nfsi->cache_validity |= NFS_INO_INVALID_ACCESS|NFS_INO_INVALID_ATTR|NFS_INO_REVAL_PAGECACHE; | 888 | nfsi->cache_validity |= NFS_INO_INVALID_ATTR|NFS_INO_REVAL_PAGECACHE; |
| 890 | if (S_ISDIR(inode->i_mode)) | 889 | if (S_ISDIR(inode->i_mode)) |
| 891 | nfsi->cache_validity |= NFS_INO_INVALID_DATA; | 890 | nfsi->cache_validity |= NFS_INO_INVALID_DATA; |
| 892 | spin_unlock(&inode->i_lock); | 891 | spin_unlock(&inode->i_lock); |
| 893 | return 0; | 892 | return nfs_refresh_inode(inode, fattr); |
| 894 | } | 893 | } |
| 895 | 894 | ||
| 896 | /** | 895 | /** |
| @@ -938,7 +937,7 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr) | |||
| 938 | struct nfs_server *server; | 937 | struct nfs_server *server; |
| 939 | struct nfs_inode *nfsi = NFS_I(inode); | 938 | struct nfs_inode *nfsi = NFS_I(inode); |
| 940 | loff_t cur_isize, new_isize; | 939 | loff_t cur_isize, new_isize; |
| 941 | unsigned int invalid = 0; | 940 | unsigned long invalid = 0; |
| 942 | unsigned long now = jiffies; | 941 | unsigned long now = jiffies; |
| 943 | 942 | ||
| 944 | dfprintk(VFS, "NFS: %s(%s/%ld ct=%d info=0x%x)\n", | 943 | dfprintk(VFS, "NFS: %s(%s/%ld ct=%d info=0x%x)\n", |
