|
@@ -1593,6 +1593,19 @@ 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);
|
|
|
|
|
|
+
|
|
|
+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
|
|
|
* an operation. Here we update the inode to reflect the state
|
|
@@ -1619,7 +1632,7 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr)
|
|
|
nfs_display_fhandle_hash(NFS_FH(inode)),
|
|
|
atomic_read(&inode->i_count), fattr->valid);
|
|
|
|
|
|
- if ((fattr->valid & NFS_ATTR_FATTR_FILEID) && nfsi->fileid != fattr->fileid) {
|
|
|
+ if (!nfs_fileid_valid(nfsi, fattr)) {
|
|
|
printk(KERN_ERR "NFS: server %s error: fileid changed\n"
|
|
|
"fsid %s: expected fileid 0x%Lx, got 0x%Lx\n",
|
|
|
NFS_SERVER(inode)->nfs_client->cl_hostname,
|