Whamcloud - gitweb
LU-13252 mgs: Handle possible failure from name_create_mdt
[fs/lustre-release.git] / lustre / osp / osp_trans.c
index a69a9cb..f0cad02 100644 (file)
@@ -347,6 +347,7 @@ int osp_prep_update_req(const struct lu_env *env, struct obd_import *imp,
        struct out_update_header        *ouh;
        struct out_update_buffer        *oub;
        __u32                           buf_count = 0;
+       int                             page_count = 0;
        int                             repsize = 0;
        struct object_update_reply      *reply;
        int                             rc, i;
@@ -418,13 +419,15 @@ int osp_prep_update_req(const struct lu_env *env, struct obd_import *imp,
        list_for_each_entry(ours, &our->our_req_list, ours_list) {
                oub->oub_size = ours->ours_req_size;
                oub++;
+               /* First *and* last might be partial pages, hence +1 */
+               page_count += DIV_ROUND_UP(ours->ours_req_size, PAGE_SIZE) + 1;
        }
 
        req->rq_bulk_write = 1;
-       desc = ptlrpc_prep_bulk_imp(req, buf_count,
+       desc = ptlrpc_prep_bulk_imp(req, page_count,
                MD_MAX_BRW_SIZE >> LNET_MTU_BITS,
-               PTLRPC_BULK_GET_SOURCE | PTLRPC_BULK_BUF_KVEC,
-               MDS_BULK_PORTAL, &ptlrpc_bulk_kvec_ops);
+               PTLRPC_BULK_GET_SOURCE,
+               MDS_BULK_PORTAL, &ptlrpc_bulk_kiov_nopin_ops);
        if (desc == NULL)
                GOTO(out_req, rc = -ENOMEM);
 
@@ -735,7 +738,7 @@ int osp_unplug_async_request(const struct lu_env *env,
                }
                osp_update_request_destroy(env, our);
        } else {
-               args = ptlrpc_req_async_args(req);
+               args = ptlrpc_req_async_args(args, req);
                args->oaua_update = our;
                args->oaua_count = NULL;
                args->oaua_waitq = NULL;
@@ -1118,7 +1121,7 @@ static int osp_send_update_req(const struct lu_env *env,
                RETURN(rc);
        }
 
-       args = ptlrpc_req_async_args(req);
+       args = ptlrpc_req_async_args(args, req);
        args->oaua_update = our;
        /* set env to NULL, in case the interrupt cb and current function
         * are in different thread */
@@ -1376,8 +1379,6 @@ void osp_invalidate_request(struct osp_device *osp)
                return;
        }
 
-       INIT_LIST_HEAD(&list);
-
        spin_lock(&ou->ou_lock);
        /* invalidate all of request in the sending list */
        list_for_each_entry_safe(our, tmp, &ou->ou_list, our_list) {
@@ -1430,50 +1431,41 @@ void osp_invalidate_request(struct osp_device *osp)
  */
 int osp_send_update_thread(void *arg)
 {
-       struct lu_env           env;
+       struct lu_env           *env;
        struct osp_device       *osp = arg;
-       struct l_wait_info       lwi = { 0 };
        struct osp_updates      *ou = osp->opd_update;
-       struct ptlrpc_thread    *thread = &osp->opd_update_thread;
        struct osp_update_request *our = NULL;
        int                     rc;
        ENTRY;
 
        LASSERT(ou != NULL);
-       rc = lu_env_init(&env, osp->opd_dt_dev.dd_lu_dev.ld_type->ldt_ctx_tags);
-       if (rc < 0) {
-               CERROR("%s: init env error: rc = %d\n", osp->opd_obd->obd_name,
-                      rc);
-               RETURN(rc);
-       }
+       env = &ou->ou_env;
 
-       thread->t_flags = SVC_RUNNING;
-       wake_up(&thread->t_ctl_waitq);
        while (1) {
                our = NULL;
-               l_wait_event(ou->ou_waitq,
-                            !osp_send_update_thread_running(osp) ||
-                            osp_get_next_request(ou, &our), &lwi);
+               wait_event_idle(ou->ou_waitq,
+                               kthread_should_stop() ||
+                               osp_get_next_request(ou, &our));
 
-               if (!osp_send_update_thread_running(osp)) {
+               if (kthread_should_stop()) {
                        if (our != NULL) {
-                               osp_trans_callback(&env, our->our_th, -EINTR);
-                               osp_thandle_put(&env, our->our_th);
+                               osp_trans_callback(env, our->our_th, -EINTR);
+                               osp_thandle_put(env, our->our_th);
                        }
                        break;
                }
 
                LASSERT(our->our_th != NULL);
                if (our->our_th->ot_super.th_result != 0) {
-                       osp_trans_callback(&env, our->our_th,
+                       osp_trans_callback(env, our->our_th,
                                our->our_th->ot_super.th_result);
                        rc = our->our_th->ot_super.th_result;
                } else if (ou->ou_generation != our->our_generation ||
                           OBD_FAIL_CHECK(OBD_FAIL_INVALIDATE_UPDATE)) {
                        rc = -EIO;
-                       osp_trans_callback(&env, our->our_th, rc);
+                       osp_trans_callback(env, our->our_th, rc);
                } else {
-                       rc = osp_send_update_req(&env, osp, our);
+                       rc = osp_send_update_req(env, osp, our);
                }
 
                /* Update the rpc version */
@@ -1490,13 +1482,9 @@ int osp_send_update_thread(void *arg)
                        osp_invalidate_request(osp);
 
                /* Balanced for thandle_get in osp_check_and_set_rpc_version */
-               osp_thandle_put(&env, our->our_th);
+               osp_thandle_put(env, our->our_th);
        }
 
-       thread->t_flags = SVC_STOPPED;
-       lu_env_fini(&env);
-       wake_up(&thread->t_ctl_waitq);
-
        RETURN(0);
 }
 
@@ -1576,8 +1564,7 @@ int osp_trans_stop(const struct lu_env *env, struct dt_device *dt,
                GOTO(out, rc);
        }
 
-       if (osp->opd_update == NULL ||
-           !osp_send_update_thread_running(osp)) {
+       if (osp->opd_update == NULL) {
                osp_trans_callback(env, oth, -EIO);
                GOTO(out, rc = -EIO);
        }