diff options
author | NeilBrown <neilb@suse.com> | 2016-08-04 10:19:06 +1000 |
---|---|---|
committer | J. Bruce Fields <bfields@redhat.com> | 2016-10-06 09:07:44 -0400 |
commit | 09bb8bfffd29c3dffb72bc2c69a062dfb1ae624c (patch) | |
tree | 44c4f7a56072f73b85088225a408a91bdb33b567 /fs/exportfs | |
parent | 7d22fc11c7edeeac6f1c3f1ae0edcef4de08c6e0 (diff) | |
download | linux-09bb8bfffd29c3dffb72bc2c69a062dfb1ae624c.tar.gz linux-09bb8bfffd29c3dffb72bc2c69a062dfb1ae624c.tar.bz2 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.c | 10 |
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); |