NFS: Don't refresh attributes with mounted-on-file information
If we've been given the attributes of the mounted-on-file, then do not use those to check or update the attributes on the application-visible inode. Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
This commit is contained in:
parent
d1abaeb3be
commit
7e10cc25bf
1 changed files with 19 additions and 14 deletions
|
@ -1403,12 +1403,21 @@ 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))
|
||||||
|
return 0;
|
||||||
/* Has the inode gone and changed behind our back? */
|
/* Has the inode gone and changed behind our back? */
|
||||||
if ((fattr->valid & NFS_ATTR_FATTR_FILEID) && nfsi->fileid != fattr->fileid)
|
if (nfsi->fileid != fattr->fileid) {
|
||||||
|
/* Is this perhaps the mounted-on fileid? */
|
||||||
|
if ((fattr->valid & NFS_ATTR_FATTR_MOUNTED_ON_FILEID) &&
|
||||||
|
nfsi->fileid == fattr->mounted_on_fileid)
|
||||||
|
return 0;
|
||||||
return -ESTALE;
|
return -ESTALE;
|
||||||
|
}
|
||||||
if ((fattr->valid & NFS_ATTR_FATTR_TYPE) && (inode->i_mode & S_IFMT) != (fattr->mode & S_IFMT))
|
if ((fattr->valid & NFS_ATTR_FATTR_TYPE) && (inode->i_mode & S_IFMT) != (fattr->mode & S_IFMT))
|
||||||
return -ESTALE;
|
return -ESTALE;
|
||||||
|
|
||||||
|
|
||||||
if (!nfs_file_has_buffered_writers(nfsi)) {
|
if (!nfs_file_has_buffered_writers(nfsi)) {
|
||||||
/* Verify a few of the more important attributes */
|
/* Verify a few of the more important attributes */
|
||||||
if ((fattr->valid & NFS_ATTR_FATTR_CHANGE) != 0 && !inode_eq_iversion_raw(inode, fattr->change_attr))
|
if ((fattr->valid & NFS_ATTR_FATTR_CHANGE) != 0 && !inode_eq_iversion_raw(inode, fattr->change_attr))
|
||||||
|
@ -1768,18 +1777,6 @@ int nfs_post_op_update_inode_force_wcc(struct inode *inode, struct nfs_fattr *fa
|
||||||
EXPORT_SYMBOL_GPL(nfs_post_op_update_inode_force_wcc);
|
EXPORT_SYMBOL_GPL(nfs_post_op_update_inode_force_wcc);
|
||||||
|
|
||||||
|
|
||||||
static inline bool nfs_fileid_valid(struct nfs_inode *nfsi,
|
|
||||||
struct nfs_fattr *fattr)
|
|
||||||
{
|
|
||||||
bool ret1 = true, ret2 = true;
|
|
||||||
|
|
||||||
if (fattr->valid & NFS_ATTR_FATTR_FILEID)
|
|
||||||
ret1 = (nfsi->fileid == fattr->fileid);
|
|
||||||
if (fattr->valid & NFS_ATTR_FATTR_MOUNTED_ON_FILEID)
|
|
||||||
ret2 = (nfsi->fileid == fattr->mounted_on_fileid);
|
|
||||||
return ret1 || ret2;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Many nfs protocol calls return the new file attributes after
|
* Many nfs protocol calls return the new file attributes after
|
||||||
* an operation. Here we update the inode to reflect the state
|
* an operation. Here we update the inode to reflect the state
|
||||||
|
@ -1810,7 +1807,15 @@ 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);
|
||||||
|
|
||||||
if (!nfs_fileid_valid(nfsi, fattr)) {
|
/* No fileid? Just exit */
|
||||||
|
if (!(fattr->valid & NFS_ATTR_FATTR_FILEID))
|
||||||
|
return 0;
|
||||||
|
/* Has the inode gone and changed behind our back? */
|
||||||
|
if (nfsi->fileid != fattr->fileid) {
|
||||||
|
/* Is this perhaps the mounted-on fileid? */
|
||||||
|
if ((fattr->valid & NFS_ATTR_FATTR_MOUNTED_ON_FILEID) &&
|
||||||
|
nfsi->fileid == fattr->mounted_on_fileid)
|
||||||
|
return 0;
|
||||||
printk(KERN_ERR "NFS: server %s error: fileid changed\n"
|
printk(KERN_ERR "NFS: server %s error: fileid changed\n"
|
||||||
"fsid %s: expected fileid 0x%Lx, got 0x%Lx\n",
|
"fsid %s: expected fileid 0x%Lx, got 0x%Lx\n",
|
||||||
NFS_SERVER(inode)->nfs_client->cl_hostname,
|
NFS_SERVER(inode)->nfs_client->cl_hostname,
|
||||||
|
|
Loading…
Reference in a new issue