Whamcloud - gitweb
LU-11414 ptlrpc: don't change buffer when signature is ready 23/33223/2
authorMikhail Pershin <mpershin@whamcloud.com>
Sun, 23 Sep 2018 20:07:37 +0000 (23:07 +0300)
committerOleg Drokin <green@whamcloud.com>
Fri, 5 Oct 2018 22:28:05 +0000 (22:28 +0000)
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 <mpershin@whamcloud.com>
Change-Id: Ic277ca26ad8fb8e23ee7e4b6e81d84a1d51b4733
Reviewed-on: https://review.whamcloud.com/33223
Tested-by: Jenkins
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Sebastien Buisson <sbuisson@ddn.com>
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/mdc/mdc_locks.c
lustre/ptlrpc/niobuf.c

index 57144ea..e4abed2 100644 (file)
@@ -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;
 }
 
index fb6a282..86dc511 100644 (file)
@@ -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,