From: NeilBrown Date: Mon, 3 Jul 2017 05:27:26 +0000 (+1000) Subject: NFS: check for nfs_refresh_inode() errors in nfs_fhget() X-Git-Url: https://git.stricted.de/?a=commitdiff_plain;h=26fde4dfcbdcbbac394bb35de0c0f842de6972b5;p=GitHub%2Fmoto-9609%2Fandroid_kernel_motorola_exynos9610.git 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 Signed-off-by: Anna Schumaker --- 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),