[ 05/42] NLM: nlm_lookup_file() may return NLMv4-specific error codes
From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date: 2012-10-26 00:06:30
Also in:
lkml
3.4-stable review patch. If anyone has any objections, please let me know. ------------------ From: Trond Myklebust <redacted> commit cd0b16c1c3cda12dbed1f8de8f1a9b0591990724 upstream. If the filehandle is stale, or open access is denied for some reason, nlm_fopen() may return one of the NLMv4-specific error codes nlm4_stale_fh or nlm4_failed. These get passed right through nlm_lookup_file(), and so when nlmsvc_retrieve_args() calls the latter, it needs to filter the result through the cast_status() machinery. Failure to do so, will trigger the BUG_ON() in encode_nlm_stat... Signed-off-by: Trond Myklebust <redacted> Reported-by: Larry McVoy <redacted> Signed-off-by: J. Bruce Fields <redacted> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> --- fs/lockd/clntxdr.c | 2 +- fs/lockd/svcproc.c | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-)
--- a/fs/lockd/clntxdr.c
+++ b/fs/lockd/clntxdr.c@@ -223,7 +223,7 @@ static void encode_nlm_stat(struct xdr_s { __be32 *p; - BUG_ON(be32_to_cpu(stat) > NLM_LCK_DENIED_GRACE_PERIOD); + WARN_ON_ONCE(be32_to_cpu(stat) > NLM_LCK_DENIED_GRACE_PERIOD); p = xdr_reserve_space(xdr, 4); *p = stat; } --- a/fs/lockd/svcproc.c +++ b/fs/lockd/svcproc.c
@@ -67,7 +67,8 @@ nlmsvc_retrieve_args(struct svc_rqst *rq /* Obtain file pointer. Not used by FREE_ALL call. */ if (filp != NULL) { - if ((error = nlm_lookup_file(rqstp, &file, &lock->fh)) != 0) + error = cast_status(nlm_lookup_file(rqstp, &file, &lock->fh)); + if (error != 0) goto no_locks; *filp = file;