Commit eb3d8f42 authored by Trond Myklebust's avatar Trond Myklebust

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: default avatarMurphy Zhou <jencce.kernel@gmail.com>
Fixes: 7e10cc25 ("NFS: Don't refresh attributes with mounted-on-file...")
Signed-off-by: default avatarTrond Myklebust <trond.myklebust@hammerspace.com>
parent 089cf7f6
...@@ -1403,11 +1403,12 @@ static int nfs_check_inode_attributes(struct inode *inode, struct nfs_fattr *fat ...@@ -1403,11 +1403,12 @@ static int nfs_check_inode_attributes(struct inode *inode, struct nfs_fattr *fat
if (NFS_PROTO(inode)->have_delegation(inode, FMODE_READ)) if (NFS_PROTO(inode)->have_delegation(inode, FMODE_READ))
return 0; return 0;
/* No fileid? Just exit */ if (!(fattr->valid & NFS_ATTR_FATTR_FILEID)) {
if (!(fattr->valid & NFS_ATTR_FATTR_FILEID)) /* Only a mounted-on-fileid? Just exit */
if (fattr->valid & NFS_ATTR_FATTR_MOUNTED_ON_FILEID)
return 0; return 0;
/* Has the inode gone and changed behind our back? */ /* Has the inode gone and changed behind our back? */
if (nfsi->fileid != fattr->fileid) { } else if (nfsi->fileid != fattr->fileid) {
/* Is this perhaps the mounted-on fileid? */ /* Is this perhaps the mounted-on fileid? */
if ((fattr->valid & NFS_ATTR_FATTR_MOUNTED_ON_FILEID) && if ((fattr->valid & NFS_ATTR_FATTR_MOUNTED_ON_FILEID) &&
nfsi->fileid == fattr->mounted_on_fileid) nfsi->fileid == fattr->mounted_on_fileid)
...@@ -1807,11 +1808,12 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr) ...@@ -1807,11 +1808,12 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr)
nfs_display_fhandle_hash(NFS_FH(inode)), nfs_display_fhandle_hash(NFS_FH(inode)),
atomic_read(&inode->i_count), fattr->valid); atomic_read(&inode->i_count), fattr->valid);
/* No fileid? Just exit */ if (!(fattr->valid & NFS_ATTR_FATTR_FILEID)) {
if (!(fattr->valid & NFS_ATTR_FATTR_FILEID)) /* Only a mounted-on-fileid? Just exit */
if (fattr->valid & NFS_ATTR_FATTR_MOUNTED_ON_FILEID)
return 0; return 0;
/* Has the inode gone and changed behind our back? */ /* Has the inode gone and changed behind our back? */
if (nfsi->fileid != fattr->fileid) { } else if (nfsi->fileid != fattr->fileid) {
/* Is this perhaps the mounted-on fileid? */ /* Is this perhaps the mounted-on fileid? */
if ((fattr->valid & NFS_ATTR_FATTR_MOUNTED_ON_FILEID) && if ((fattr->valid & NFS_ATTR_FATTR_MOUNTED_ON_FILEID) &&
nfsi->fileid == fattr->mounted_on_fileid) nfsi->fileid == fattr->mounted_on_fileid)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment