summaryrefslogtreecommitdiffstats
path: root/fs/exportfs
diff options
context:
space:
mode:
authorNeilBrown2016-08-04 02:19:06 +0200
committerJ. Bruce Fields2016-10-06 15:07:44 +0200
commit09bb8bfffd29c3dffb72bc2c69a062dfb1ae624c (patch)
tree44c4f7a56072f73b85088225a408a91bdb33b567 /fs/exportfs
parentnfsd4: setclientid_confirm with unmatched verifier should fail (diff)
downloadkernel-qcow2-linux-09bb8bfffd29c3dffb72bc2c69a062dfb1ae624c.tar.gz
kernel-qcow2-linux-09bb8bfffd29c3dffb72bc2c69a062dfb1ae624c.tar.xz
kernel-qcow2-linux-09bb8bfffd29c3dffb72bc2c69a062dfb1ae624c.zip
exportfs: be careful to only return expected errors.
When nfsd calls fh_to_dentry, it expect ESTALE or ENOMEM as errors. In particular it can be tempting to return ENOENT, but this is not handled well by nfsd. Rather than requiring strict adherence to error code code filesystems, treat all unexpected error codes the same as ESTALE. This is safest. Signed-off-by: NeilBrown <neilb@suse.com> Signed-off-by: J. Bruce Fields <bfields@redhat.com>
Diffstat (limited to 'fs/exportfs')
-rw-r--r--fs/exportfs/expfs.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/fs/exportfs/expfs.c b/fs/exportfs/expfs.c
index 207ba8d627ca..a4b531be9168 100644
--- a/fs/exportfs/expfs.c
+++ b/fs/exportfs/expfs.c
@@ -428,10 +428,10 @@ struct dentry *exportfs_decode_fh(struct vfsmount *mnt, struct fid *fid,
if (!nop || !nop->fh_to_dentry)
return ERR_PTR(-ESTALE);
result = nop->fh_to_dentry(mnt->mnt_sb, fid, fh_len, fileid_type);
- if (!result)
- result = ERR_PTR(-ESTALE);
- if (IS_ERR(result))
- return result;
+ if (PTR_ERR(result) == -ENOMEM)
+ return ERR_CAST(result);
+ if (IS_ERR_OR_NULL(result))
+ return ERR_PTR(-ESTALE);
if (d_is_dir(result)) {
/*
@@ -541,6 +541,8 @@ struct dentry *exportfs_decode_fh(struct vfsmount *mnt, struct fid *fid,
err_result:
dput(result);
+ if (err != -ENOMEM)
+ err = -ESTALE;
return ERR_PTR(err);
}
EXPORT_SYMBOL_GPL(exportfs_decode_fh);