summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTrond Myklebust <trond.myklebust@hammerspace.com>2019-08-28 11:26:13 -0400
committerTrond Myklebust <trond.myklebust@hammerspace.com>2019-09-02 13:10:19 -0400
commiteb3d8f42231aec65b64b079dd17bd6c008a3fe29 (patch)
tree13ec7187d0b1bdc3c01ed59af91528b434ce9b13
parent089cf7f6ecb266b6a4164919a2e69bd2f938374a (diff)
NFS: Fix inode fileid checks in attribute revalidation code
We want to throw out the attrbute if it refers to the mounted on fileid, and not the real fileid. However we do not want to block cache consistency updates from NFSv4 writes. Reported-by: Murphy Zhou <jencce.kernel@gmail.com> Fixes: 7e10cc25bfa0 ("NFS: Don't refresh attributes with mounted-on-file...") Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
-rw-r--r--fs/nfs/inode.c18
1 files changed, 10 insertions, 8 deletions
diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c
index c764cfe456e5..2a03bfeec10a 100644
--- a/fs/nfs/inode.c
+++ b/fs/nfs/inode.c
@@ -1403,11 +1403,12 @@ static int nfs_check_inode_attributes(struct inode *inode, struct nfs_fattr *fat
1403 if (NFS_PROTO(inode)->have_delegation(inode, FMODE_READ)) 1403 if (NFS_PROTO(inode)->have_delegation(inode, FMODE_READ))
1404 return 0; 1404 return 0;
1405 1405
1406 /* No fileid? Just exit */ 1406 if (!(fattr->valid & NFS_ATTR_FATTR_FILEID)) {
1407 if (!(fattr->valid & NFS_ATTR_FATTR_FILEID)) 1407 /* Only a mounted-on-fileid? Just exit */
1408 return 0; 1408 if (fattr->valid & NFS_ATTR_FATTR_MOUNTED_ON_FILEID)
1409 return 0;
1409 /* Has the inode gone and changed behind our back? */ 1410 /* Has the inode gone and changed behind our back? */
1410 if (nfsi->fileid != fattr->fileid) { 1411 } else if (nfsi->fileid != fattr->fileid) {
1411 /* Is this perhaps the mounted-on fileid? */ 1412 /* Is this perhaps the mounted-on fileid? */
1412 if ((fattr->valid & NFS_ATTR_FATTR_MOUNTED_ON_FILEID) && 1413 if ((fattr->valid & NFS_ATTR_FATTR_MOUNTED_ON_FILEID) &&
1413 nfsi->fileid == fattr->mounted_on_fileid) 1414 nfsi->fileid == fattr->mounted_on_fileid)
@@ -1807,11 +1808,12 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr)
1807 nfs_display_fhandle_hash(NFS_FH(inode)), 1808 nfs_display_fhandle_hash(NFS_FH(inode)),
1808 atomic_read(&inode->i_count), fattr->valid); 1809 atomic_read(&inode->i_count), fattr->valid);
1809 1810
1810 /* No fileid? Just exit */ 1811 if (!(fattr->valid & NFS_ATTR_FATTR_FILEID)) {
1811 if (!(fattr->valid & NFS_ATTR_FATTR_FILEID)) 1812 /* Only a mounted-on-fileid? Just exit */
1812 return 0; 1813 if (fattr->valid & NFS_ATTR_FATTR_MOUNTED_ON_FILEID)
1814 return 0;
1813 /* Has the inode gone and changed behind our back? */ 1815 /* Has the inode gone and changed behind our back? */
1814 if (nfsi->fileid != fattr->fileid) { 1816 } else if (nfsi->fileid != fattr->fileid) {
1815 /* Is this perhaps the mounted-on fileid? */ 1817 /* Is this perhaps the mounted-on fileid? */
1816 if ((fattr->valid & NFS_ATTR_FATTR_MOUNTED_ON_FILEID) && 1818 if ((fattr->valid & NFS_ATTR_FATTR_MOUNTED_ON_FILEID) &&
1817 nfsi->fileid == fattr->mounted_on_fileid) 1819 nfsi->fileid == fattr->mounted_on_fileid)