| From f7b43d0c992c3ec3e8d9285c3fb5e1e0eb0d031a Mon Sep 17 00:00:00 2001 |
| From: "J. Bruce Fields" <bfields@redhat.com> |
| Date: Tue, 12 Aug 2014 11:41:40 -0400 |
| Subject: nfsd4: reserve adequate space for LOCK op |
| |
| From: "J. Bruce Fields" <bfields@redhat.com> |
| |
| commit f7b43d0c992c3ec3e8d9285c3fb5e1e0eb0d031a upstream. |
| |
| As of 8c7424cff6 "nfsd4: don't try to encode conflicting owner if low |
| on space", we permit the server to process a LOCK operation even if |
| there might not be space to return the conflicting lockowner, because |
| we've made returning the conflicting lockowner optional. |
| |
| However, the rpc server still wants to know the most we might possibly |
| return, so we need to take into account the possible conflicting |
| lockowner in the svc_reserve_space() call here. |
| |
| Symptoms were log messages like "RPC request reserved 88 but used 108". |
| |
| Fixes: 8c7424cff6 "nfsd4: don't try to encode conflicting owner if low on space" |
| Reported-by: Kinglong Mee <kinglongmee@gmail.com> |
| Signed-off-by: J. Bruce Fields <bfields@redhat.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| fs/nfsd/nfs4xdr.c | 8 ++++++++ |
| 1 file changed, 8 insertions(+) |
| |
| --- a/fs/nfsd/nfs4xdr.c |
| +++ b/fs/nfsd/nfs4xdr.c |
| @@ -1670,6 +1670,14 @@ nfsd4_decode_compound(struct nfsd4_compo |
| readbytes += nfsd4_max_reply(argp->rqstp, op); |
| } else |
| max_reply += nfsd4_max_reply(argp->rqstp, op); |
| + /* |
| + * OP_LOCK may return a conflicting lock. (Special case |
| + * because it will just skip encoding this if it runs |
| + * out of xdr buffer space, and it is the only operation |
| + * that behaves this way.) |
| + */ |
| + if (op->opnum == OP_LOCK) |
| + max_reply += NFS4_OPAQUE_LIMIT; |
| |
| if (op->status) { |
| argp->opcnt = i+1; |