NFS: check for nfs_refresh_inode() errors in nfs_fhget()
If an NFS server returns a filehandle that we have previously seen, and reports a different type, then nfs_refresh_inode() will log a warning and return an error. nfs_fhget() does not check for this error and may return an inode with a different type than the one that the server reported. This is likely to cause confusion, and is one way that ->open_context() could return a directory inode as discussed in the previous patch. So if nfs_refresh_inode() returns and error, return that error from nfs_fhget() to avoid the confusion propagating. Signed-off-by: NeilBrown <neilb@suse.com> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
This commit is contained in:
parent
eaa2b82c3b
commit
26fde4dfcb
|
@ -525,8 +525,14 @@ nfs_fhget(struct super_block *sb, struct nfs_fh *fh, struct nfs_fattr *fattr, st
|
||||||
nfs_fscache_init_inode(inode);
|
nfs_fscache_init_inode(inode);
|
||||||
|
|
||||||
unlock_new_inode(inode);
|
unlock_new_inode(inode);
|
||||||
} else
|
} else {
|
||||||
nfs_refresh_inode(inode, fattr);
|
int err = nfs_refresh_inode(inode, fattr);
|
||||||
|
if (err < 0) {
|
||||||
|
iput(inode);
|
||||||
|
inode = ERR_PTR(err);
|
||||||
|
goto out_no_inode;
|
||||||
|
}
|
||||||
|
}
|
||||||
dprintk("NFS: nfs_fhget(%s/%Lu fh_crc=0x%08x ct=%d)\n",
|
dprintk("NFS: nfs_fhget(%s/%Lu fh_crc=0x%08x ct=%d)\n",
|
||||||
inode->i_sb->s_id,
|
inode->i_sb->s_id,
|
||||||
(unsigned long long)NFS_FILEID(inode),
|
(unsigned long long)NFS_FILEID(inode),
|
||||||
|
|
Loading…
Reference in New Issue