| From cd0b16c1c3cda12dbed1f8de8f1a9b0591990724 Mon Sep 17 00:00:00 2001 |
| From: Trond Myklebust <Trond.Myklebust@netapp.com> |
| Date: Sat, 13 Oct 2012 00:30:28 -0400 |
| Subject: NLM: nlm_lookup_file() may return NLMv4-specific error codes |
| |
| From: Trond Myklebust <Trond.Myklebust@netapp.com> |
| |
| 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 <Trond.Myklebust@netapp.com> |
| Reported-by: Larry McVoy <lm@bitmover.com> |
| Signed-off-by: J. Bruce Fields <bfields@redhat.com> |
| 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; |
| |