Whamcloud - gitweb
LU-2150 ost: ost_brw_read() to ptlrpc_free_bulk_nopin()
authorAlex Zhuravlev <alexey.zhuravlev@intel.com>
Thu, 11 Oct 2012 19:31:19 +0000 (23:31 +0400)
committerOleg Drokin <green@whamcloud.com>
Wed, 17 Oct 2012 01:25:02 +0000 (21:25 -0400)
since a643e38 (LU-2089) OST do not pin pages involved in
BULKs: this is done to prevent get/put on the pages which
were allocated as part of order N (>1) allocation with 0
refcounter. get/put on such a page leads to warning from
the kernel. in the original patch one code path was not
fixed, so this patch completes the change.

also, to prevent confusion, the patch removes couple macros:
ptlrpc_free_bulk() and ptlrpc_prep_bulk_page(). so now the
caller should specify whether ptlrpc should reference pages
or not.

Signed-off-by: Alex Zhuravlev <alexey.zhuravlev@intel.com>
Change-Id: I8cf5f334e8f7edab0ad37678e1e8af18904a0be6
Reviewed-on: http://review.whamcloud.com/4256
Tested-by: Hudson
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Tested-by: Maloo <whamcloud.maloo@gmail.com>
Reviewed-by: Mike Pershin <tappro@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/include/lustre_net.h
lustre/mdc/mdc_request.c
lustre/mdt/mdt_handler.c
lustre/mgc/mgc_request.c
lustre/mgs/mgs_nids.c
lustre/osc/osc_request.c
lustre/ost/ost_handler.c
lustre/ptlrpc/client.c
lustre/quota/qsd_request.c

index 8f7575e..a218f55 100644 (file)
@@ -1773,7 +1773,7 @@ struct ptlrpc_request *ptlrpc_request_addref(struct ptlrpc_request *req);
 struct ptlrpc_bulk_desc *ptlrpc_prep_bulk_imp(struct ptlrpc_request *req,
                                               int npages, int type, int portal);
 void __ptlrpc_free_bulk(struct ptlrpc_bulk_desc *bulk, int pin);
-static inline void ptlrpc_free_bulk(struct ptlrpc_bulk_desc *bulk)
+static inline void ptlrpc_free_bulk_pin(struct ptlrpc_bulk_desc *bulk)
 {
        __ptlrpc_free_bulk(bulk, 1);
 }
@@ -1783,9 +1783,9 @@ static inline void ptlrpc_free_bulk_nopin(struct ptlrpc_bulk_desc *bulk)
 }
 void __ptlrpc_prep_bulk_page(struct ptlrpc_bulk_desc *desc,
                             cfs_page_t *page, int pageoffset, int len, int);
-static inline void ptlrpc_prep_bulk_page(struct ptlrpc_bulk_desc *desc,
-                                        cfs_page_t *page, int pageoffset,
-                                        int len)
+static inline void ptlrpc_prep_bulk_page_pin(struct ptlrpc_bulk_desc *desc,
+                                            cfs_page_t *page, int pageoffset,
+                                            int len)
 {
        __ptlrpc_prep_bulk_page(desc, page, pageoffset, len, 1);
 }
index 88a42ab..4121826 100644 (file)
@@ -1053,7 +1053,7 @@ restart_bulk:
 
         /* NB req now owns desc and will free it when it gets freed */
         for (i = 0; i < op_data->op_npages; i++)
-                ptlrpc_prep_bulk_page(desc, pages[i], 0, CFS_PAGE_SIZE);
+               ptlrpc_prep_bulk_page_pin(desc, pages[i], 0, CFS_PAGE_SIZE);
 
         mdc_readdir_pack(req, op_data->op_offset,
                          CFS_PAGE_SIZE * op_data->op_npages,
index b5aaad8..6a51282 100644 (file)
@@ -1560,12 +1560,12 @@ static int mdt_sendpage(struct mdt_thread_info *info,
        for (i = 0, tmpcount = nob; i < rdpg->rp_npages && tmpcount > 0;
             i++, tmpcount -= tmpsize) {
                 tmpsize = min_t(int, tmpcount, CFS_PAGE_SIZE);
-                ptlrpc_prep_bulk_page(desc, rdpg->rp_pages[i], 0, tmpsize);
+               ptlrpc_prep_bulk_page_pin(desc, rdpg->rp_pages[i], 0, tmpsize);
         }
 
         LASSERT(desc->bd_nob == nob);
         rc = target_bulk_io(exp, desc, lwi);
-        ptlrpc_free_bulk(desc);
+       ptlrpc_free_bulk_pin(desc);
         RETURN(rc);
 }
 
@@ -1738,7 +1738,7 @@ cleanup_lwi:
 cleanup_page:
         cfs_free_page(page);
 desc_cleanup:
-        ptlrpc_free_bulk(desc);
+       ptlrpc_free_bulk_pin(desc);
         RETURN(rc);
 }
 #endif
index 61b639b..53f0b59 100644 (file)
@@ -1484,7 +1484,7 @@ again:
                 GOTO(out, rc = -ENOMEM);
 
         for (i = 0; i < nrpages; i++)
-                ptlrpc_prep_bulk_page(desc, pages[i], 0, CFS_PAGE_SIZE);
+               ptlrpc_prep_bulk_page_pin(desc, pages[i], 0, CFS_PAGE_SIZE);
 
         ptlrpc_request_set_replen(req);
         rc = ptlrpc_queue_wait(req);
index 6141a00..e10c029 100644 (file)
@@ -681,13 +681,13 @@ int mgs_get_ir_logs(struct ptlrpc_request *req)
                 GOTO(out, rc = -ENOMEM);
 
         for (i = 0; i < page_count && bytes > 0; i++) {
-                ptlrpc_prep_bulk_page(desc, pages[i], 0,
-                                min_t(int, bytes, CFS_PAGE_SIZE));
+               ptlrpc_prep_bulk_page_pin(desc, pages[i], 0,
+                                         min_t(int, bytes, CFS_PAGE_SIZE));
                 bytes -= CFS_PAGE_SIZE;
         }
 
         rc = target_bulk_io(req->rq_export, desc, &lwi);
-        ptlrpc_free_bulk(desc);
+       ptlrpc_free_bulk_pin(desc);
 
 out:
        for (i = 0; i < nrpages; i++) {
index 19d60f0..55439f5 100644 (file)
@@ -1306,7 +1306,7 @@ static int osc_brw_prep_request(int cmd, struct client_obd *cli,struct obdo *oa,
                 LASSERT((pga[0]->flag & OBD_BRW_SRVLOCK) ==
                         (pg->flag & OBD_BRW_SRVLOCK));
 
-                ptlrpc_prep_bulk_page(desc, pg->pg, poff, pg->count);
+               ptlrpc_prep_bulk_page_pin(desc, pg->pg, poff, pg->count);
                 requested_nob += pg->count;
 
                 if (i > 0 && can_merge_pages(pg_prev, pg)) {
index 1e0d8b7..b32b988 100644 (file)
@@ -899,7 +899,7 @@ out:
                 lwi1 = LWI_TIMEOUT_INTR(cfs_time_seconds(3), NULL, NULL, NULL);
                 l_wait_event(waitq, 0, &lwi1);
                 rc = target_bulk_io(exp, desc, &lwi);
-                ptlrpc_free_bulk(desc);
+               ptlrpc_free_bulk_nopin(desc);
         }
 
         RETURN(rc);
index a41cd32..45899c8 100644 (file)
@@ -2276,8 +2276,8 @@ static void __ptlrpc_free_req(struct ptlrpc_request *request, int locked)
                 class_import_put(request->rq_import);
                 request->rq_import = NULL;
         }
-        if (request->rq_bulk != NULL)
-                ptlrpc_free_bulk(request->rq_bulk);
+       if (request->rq_bulk != NULL)
+               ptlrpc_free_bulk_pin(request->rq_bulk);
 
         if (request->rq_reqbuf != NULL || request->rq_clrbuf != NULL)
                 sptlrpc_cli_free_reqbuf(request);
index a3992eb..485e2ce 100644 (file)
@@ -378,7 +378,7 @@ int qsd_fetch_index(const struct lu_env *env, struct obd_export *exp,
 
        /* req now owns desc and will free it when it gets freed */
        for (i = 0; i < npages; i++)
-               ptlrpc_prep_bulk_page(desc, pages[i], 0, CFS_PAGE_SIZE);
+               ptlrpc_prep_bulk_page_pin(desc, pages[i], 0, CFS_PAGE_SIZE);
 
        /* pack index information in request */
        req_ii = req_capsule_client_get(&req->rq_pill, &RMF_IDX_INFO);