summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2019-09-04 14:09:53 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2019-09-04 14:09:53 -0400
commit3b47fd5ca9ead91156bcdf6435279ad0b14a650c (patch)
tree13ec7187d0b1bdc3c01ed59af91528b434ce9b13
parent089cf7f6ecb266b6a4164919a2e69bd2f938374a (diff)
parenteb3d8f42231aec65b64b079dd17bd6c008a3fe29 (diff)
Merge tag 'nfs-for-5.3-4' of git://git.linux-nfs.org/projects/trondmy/linux-nfs
Pull NFS client bugfix from Trond Myklebust: "Regression fix inode fileid checks in attribute revalidation code" * tag 'nfs-for-5.3-4' of git://git.linux-nfs.org/projects/trondmy/linux-nfs: NFS: Fix inode fileid checks in attribute revalidation code
-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)