|
@@ -161,10 +161,12 @@ static void nfs_zap_caches_locked(struct inode *inode)
|
|
|
nfsi->attrtimeo_timestamp = jiffies;
|
|
|
|
|
|
memset(NFS_I(inode)->cookieverf, 0, sizeof(NFS_I(inode)->cookieverf));
|
|
|
- if (S_ISREG(mode) || S_ISDIR(mode) || S_ISLNK(mode))
|
|
|
+ if (S_ISREG(mode) || S_ISDIR(mode) || S_ISLNK(mode)) {
|
|
|
nfsi->cache_validity |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA|NFS_INO_INVALID_ACCESS|NFS_INO_INVALID_ACL|NFS_INO_REVAL_PAGECACHE;
|
|
|
- else
|
|
|
+ nfs_fscache_invalidate(inode);
|
|
|
+ } else {
|
|
|
nfsi->cache_validity |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_ACCESS|NFS_INO_INVALID_ACL|NFS_INO_REVAL_PAGECACHE;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
void nfs_zap_caches(struct inode *inode)
|
|
@@ -179,6 +181,7 @@ void nfs_zap_mapping(struct inode *inode, struct address_space *mapping)
|
|
|
if (mapping->nrpages != 0) {
|
|
|
spin_lock(&inode->i_lock);
|
|
|
NFS_I(inode)->cache_validity |= NFS_INO_INVALID_DATA;
|
|
|
+ nfs_fscache_invalidate(inode);
|
|
|
spin_unlock(&inode->i_lock);
|
|
|
}
|
|
|
}
|
|
@@ -881,7 +884,7 @@ static int nfs_invalidate_mapping(struct inode *inode, struct address_space *map
|
|
|
memset(nfsi->cookieverf, 0, sizeof(nfsi->cookieverf));
|
|
|
spin_unlock(&inode->i_lock);
|
|
|
nfs_inc_stats(inode, NFSIOS_DATAINVALIDATE);
|
|
|
- nfs_fscache_reset_inode_cookie(inode);
|
|
|
+ nfs_fscache_wait_on_invalidate(inode);
|
|
|
dfprintk(PAGECACHE, "NFS: (%s/%Ld) data cache invalidated\n",
|
|
|
inode->i_sb->s_id, (long long)NFS_FILEID(inode));
|
|
|
return 0;
|
|
@@ -957,6 +960,10 @@ static unsigned long nfs_wcc_update_inode(struct inode *inode, struct nfs_fattr
|
|
|
i_size_write(inode, nfs_size_to_loff_t(fattr->size));
|
|
|
ret |= NFS_INO_INVALID_ATTR;
|
|
|
}
|
|
|
+
|
|
|
+ if (nfsi->cache_validity & NFS_INO_INVALID_DATA)
|
|
|
+ nfs_fscache_invalidate(inode);
|
|
|
+
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
@@ -1205,8 +1212,10 @@ static int nfs_post_op_update_inode_locked(struct inode *inode, struct nfs_fattr
|
|
|
struct nfs_inode *nfsi = NFS_I(inode);
|
|
|
|
|
|
nfsi->cache_validity |= NFS_INO_INVALID_ATTR|NFS_INO_REVAL_PAGECACHE;
|
|
|
- if (S_ISDIR(inode->i_mode))
|
|
|
+ if (S_ISDIR(inode->i_mode)) {
|
|
|
nfsi->cache_validity |= NFS_INO_INVALID_DATA;
|
|
|
+ nfs_fscache_invalidate(inode);
|
|
|
+ }
|
|
|
if ((fattr->valid & NFS_ATTR_FATTR) == 0)
|
|
|
return 0;
|
|
|
return nfs_refresh_inode_locked(inode, fattr);
|
|
@@ -1494,6 +1503,9 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr)
|
|
|
(save_cache_validity & NFS_INO_REVAL_FORCED))
|
|
|
nfsi->cache_validity |= invalid;
|
|
|
|
|
|
+ if (invalid & NFS_INO_INVALID_DATA)
|
|
|
+ nfs_fscache_invalidate(inode);
|
|
|
+
|
|
|
return 0;
|
|
|
out_err:
|
|
|
/*
|