From cf503e047c7fe58c3f75c912b3ce8da93f79bf0e Mon Sep 17 00:00:00 2001 From: Mikhail Pershin Date: Sun, 23 Sep 2018 23:07:37 +0300 Subject: [PATCH] LU-11414 ptlrpc: don't change buffer when signature is ready The lm_repsize is part of buffer being used in signature calculation and must not be changed after calculation is done. Patch reverts related changes from commit 13372d6c and moves related lm_repsize update into MDC where DOM read-on-open buffer is prepared Signed-off-by: Mikhail Pershin Change-Id: Ic277ca26ad8fb8e23ee7e4b6e81d84a1d51b4733 Reviewed-on: https://review.whamcloud.com/33223 Tested-by: Jenkins Reviewed-by: Andreas Dilger Reviewed-by: Sebastien Buisson Tested-by: Maloo Reviewed-by: Oleg Drokin --- lustre/mdc/mdc_locks.c | 30 +++++++++++++++++++++--------- lustre/ptlrpc/niobuf.c | 17 ++++++----------- 2 files changed, 27 insertions(+), 20 deletions(-) diff --git a/lustre/mdc/mdc_locks.c b/lustre/mdc/mdc_locks.c index 57144ea..e4abed2 100644 --- a/lustre/mdc/mdc_locks.c +++ b/lustre/mdc/mdc_locks.c @@ -256,7 +256,7 @@ mdc_intent_open_pack(struct obd_export *exp, struct lookup_intent *it, int count = 0; enum ldlm_mode mode; int rc; - int repsize; + int repsize, repsize_estimate; ENTRY; @@ -351,22 +351,34 @@ mdc_intent_open_pack(struct obd_export *exp, struct lookup_intent *it, /* Get real repbuf allocated size as rounded up power of 2 */ repsize = size_roundup_power2(req->rq_replen + lustre_msg_early_size()); - /* Estimate free space for DoM files in repbuf */ - repsize -= req->rq_replen - obddev->u.cli.cl_max_mds_easize + - sizeof(struct lov_comp_md_v1) + - sizeof(struct lov_comp_md_entry_v1) + - lov_mds_md_size(0, LOV_MAGIC_V3); - - if (repsize < obddev->u.cli.cl_dom_min_inline_repsize) { - repsize = obddev->u.cli.cl_dom_min_inline_repsize - repsize; + repsize_estimate = repsize - (req->rq_replen - + obddev->u.cli.cl_max_mds_easize + + sizeof(struct lov_comp_md_v1) + + sizeof(struct lov_comp_md_entry_v1) + + lov_mds_md_size(0, LOV_MAGIC_V3)); + + if (repsize_estimate < obddev->u.cli.cl_dom_min_inline_repsize) { + repsize = obddev->u.cli.cl_dom_min_inline_repsize - + repsize_estimate + sizeof(struct niobuf_remote); req_capsule_set_size(&req->rq_pill, &RMF_NIOBUF_INLINE, RCL_SERVER, sizeof(struct niobuf_remote) + repsize); ptlrpc_request_set_replen(req); CDEBUG(D_INFO, "Increase repbuf by %d bytes, total: %d\n", repsize, req->rq_replen); + repsize = size_roundup_power2(req->rq_replen + + lustre_msg_early_size()); } + /* The only way to report real allocated repbuf size to the server + * is the lm_repsize but it must be set prior buffer allocation itself + * due to security reasons - it is part of buffer used in signature + * calculation (see LU-11414). Therefore the saved size is predicted + * value as rq_replen rounded to the next higher power of 2. + * Such estimation is safe. Though the final allocated buffer might + * be even larger, it is not possible to know that at this point. + */ + req->rq_reqmsg->lm_repsize = repsize; return req; } diff --git a/lustre/ptlrpc/niobuf.c b/lustre/ptlrpc/niobuf.c index fb6a282..86dc511 100644 --- a/lustre/ptlrpc/niobuf.c +++ b/lustre/ptlrpc/niobuf.c @@ -786,8 +786,8 @@ int ptl_send_rpc(struct ptlrpc_request *request, int noreply) if (request->rq_resend_cb != NULL) request->rq_resend_cb(request, &request->rq_async_args); } - if (request->rq_memalloc) - mpflag = cfs_memory_pressure_get_and_set(); + if (request->rq_memalloc) + mpflag = cfs_memory_pressure_get_and_set(); rc = sptlrpc_cli_wrap_request(request); if (rc) @@ -822,15 +822,10 @@ int ptl_send_rpc(struct ptlrpc_request *request, int noreply) request->rq_status = rc; GOTO(cleanup_bulk, rc); } - /* Use real allocated value in lm_repsize, - * so the server may use whole reply buffer - * without resends where it is needed. - */ - request->rq_reqmsg->lm_repsize = request->rq_repbuf_len; - } else { - request->rq_repdata = NULL; - request->rq_repmsg = NULL; - } + } else { + request->rq_repdata = NULL; + request->rq_repmsg = NULL; + } rc = LNetMEAttach(request->rq_reply_portal,/*XXX FIXME bug 249*/ connection->c_peer, request->rq_xid, 0, -- 1.8.3.1