diff options
author | NeilBrown <neilb@suse.com> | 2017-07-03 07:27:26 +0200 |
---|---|---|
committer | Anna Schumaker <Anna.Schumaker@Netapp.com> | 2017-07-13 22:00:09 +0200 |
commit | 26fde4dfcbdcbbac394bb35de0c0f842de6972b5 (patch) | |
tree | 8e744314f14044538f8d65edc0c7bcd2a9750c3d /fs | |
parent | NFS: guard against confused server in nfs_atomic_open() (diff) | |
download | linux-26fde4dfcbdcbbac394bb35de0c0f842de6972b5.tar.xz linux-26fde4dfcbdcbbac394bb35de0c0f842de6972b5.zip |
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>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/nfs/inode.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c index 8c465d3c7e05..7e7a894601b9 100644 --- a/fs/nfs/inode.c +++ b/fs/nfs/inode.c @@ -525,8 +525,14 @@ nfs_fhget(struct super_block *sb, struct nfs_fh *fh, struct nfs_fattr *fattr, st nfs_fscache_init_inode(inode); unlock_new_inode(inode); - } else - nfs_refresh_inode(inode, fattr); + } else { + 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", inode->i_sb->s_id, (unsigned long long)NFS_FILEID(inode), |