Whamcloud - gitweb
LU-13309 ofd: optimize the brw codepath
[fs/lustre-release.git] / lustre / ofd / ofd_io.c
index a5d49e1..d86bb5c 100644 (file)
@@ -165,7 +165,6 @@ static int ofd_inconsistency_verification_main(void *args)
        struct ptlrpc_thread *thread = &ofd->ofd_inconsistency_thread;
        struct ofd_inconsistency_item *oii;
        struct lfsck_req_local *lrl = NULL;
-       struct l_wait_info lwi = { 0 };
        int rc;
        ENTRY;
 
@@ -200,10 +199,9 @@ static int ofd_inconsistency_verification_main(void *args)
                }
 
                spin_unlock(&ofd->ofd_inconsistency_lock);
-               l_wait_event(thread->t_ctl_waitq,
-                            !list_empty(&ofd->ofd_inconsistency_list) ||
-                            !thread_is_running(thread),
-                            &lwi);
+               wait_event_idle(thread->t_ctl_waitq,
+                               !list_empty(&ofd->ofd_inconsistency_list) ||
+                               !thread_is_running(thread));
                spin_lock(&ofd->ofd_inconsistency_lock);
        }
 
@@ -254,7 +252,6 @@ out:
 int ofd_start_inconsistency_verification_thread(struct ofd_device *ofd)
 {
        struct ptlrpc_thread    *thread = &ofd->ofd_inconsistency_thread;
-       struct l_wait_info       lwi    = { 0 };
        struct task_struct      *task;
        int                      rc;
 
@@ -275,10 +272,9 @@ int ofd_start_inconsistency_verification_thread(struct ofd_device *ofd)
                       ofd_name(ofd), rc);
        } else {
                rc = 0;
-               l_wait_event(thread->t_ctl_waitq,
-                            thread_is_running(thread) ||
-                            thread_is_stopped(thread),
-                            &lwi);
+               wait_event_idle(thread->t_ctl_waitq,
+                               thread_is_running(thread) ||
+                               thread_is_stopped(thread));
        }
 
        return rc;
@@ -295,7 +291,6 @@ int ofd_start_inconsistency_verification_thread(struct ofd_device *ofd)
 int ofd_stop_inconsistency_verification_thread(struct ofd_device *ofd)
 {
        struct ptlrpc_thread    *thread = &ofd->ofd_inconsistency_thread;
-       struct l_wait_info       lwi    = { 0 };
 
        spin_lock(&ofd->ofd_inconsistency_lock);
        if (thread_is_init(thread) || thread_is_stopped(thread)) {
@@ -307,9 +302,8 @@ int ofd_stop_inconsistency_verification_thread(struct ofd_device *ofd)
        thread_set_flags(thread, SVC_STOPPING);
        spin_unlock(&ofd->ofd_inconsistency_lock);
        wake_up_all(&thread->t_ctl_waitq);
-       l_wait_event(thread->t_ctl_waitq,
-                    thread_is_stopped(thread),
-                    &lwi);
+       wait_event_idle(thread->t_ctl_waitq,
+                       thread_is_stopped(thread));
 
        return 0;
 }
@@ -521,6 +515,8 @@ static int ofd_preprw_read(const struct lu_env *env, struct obd_export *exp,
                RETURN(PTR_ERR(fo));
        LASSERT(fo != NULL);
 
+       ofd_info(env)->fti_obj = fo;
+
        ofd_read_lock(env, fo);
        if (!ofd_object_exists(fo))
                GOTO(unlock, rc = -ENOENT);
@@ -553,10 +549,6 @@ static int ofd_preprw_read(const struct lu_env *env, struct obd_export *exp,
        }
 
        LASSERT(*nr_local > 0 && *nr_local <= PTLRPC_MAX_BRW_PAGES);
-       rc = dt_attr_get(env, ofd_object_child(fo), la);
-       if (unlikely(rc))
-               GOTO(buf_put, rc);
-
        rc = dt_read_prep(env, ofd_object_child(fo), lnb, *nr_local);
        if (unlikely(rc))
                GOTO(buf_put, rc);
@@ -678,6 +670,8 @@ static int ofd_preprw_write(const struct lu_env *env, struct obd_export *exp,
                GOTO(out, rc = PTR_ERR(fo));
        LASSERT(fo != NULL);
 
+       ofd_info(env)->fti_obj = fo;
+
        ofd_read_lock(env, fo);
        if (!ofd_object_exists(fo)) {
                CERROR("%s: BRW to missing obj "DOSTID"\n",
@@ -788,8 +782,7 @@ int ofd_preprw(const struct lu_env *env, int cmd, struct obd_export *exp,
        int                      rc = 0;
 
        if (*nr_local > PTLRPC_MAX_BRW_PAGES) {
-               CERROR("%s: bulk has too many pages %d, which exceeds the"
-                      "maximum pages per RPC of %d\n",
+               CERROR("%s: bulk has too many pages %d, which exceeds the maximum pages per RPC of %d\n",
                       exp->exp_obd->obd_name, *nr_local, PTLRPC_MAX_BRW_PAGES);
                RETURN(-EPROTO);
        }
@@ -837,7 +830,6 @@ int ofd_preprw(const struct lu_env *env, int cmd, struct obd_export *exp,
                rc = ofd_preprw_read(env, exp, ofd, fid, &info->fti_attr, oa,
                                     obj->ioo_bufcnt, rnb, nr_local, lnb,
                                     jobid);
-               obdo_from_la(oa, &info->fti_attr, LA_ATIME);
        } else {
                CERROR("%s: wrong cmd %d received!\n",
                       exp->exp_obd->obd_name, cmd);
@@ -872,17 +864,13 @@ ofd_commitrw_read(const struct lu_env *env, struct ofd_device *ofd,
 
        LASSERT(niocount > 0);
 
-       fo = ofd_object_find(env, ofd, fid);
-       if (IS_ERR(fo))
-               RETURN(PTR_ERR(fo));
+       fo = ofd_info(env)->fti_obj;
        LASSERT(fo != NULL);
        LASSERT(ofd_object_exists(fo));
        dt_bufs_put(env, ofd_object_child(fo), lnb, niocount);
 
        ofd_read_unlock(env, fo);
        ofd_object_put(env, fo);
-       /* second put is pair to object_get in ofd_preprw_read */
-       ofd_object_put(env, fo);
 
        RETURN(0);
 }
@@ -943,11 +931,13 @@ ofd_write_attr_set(const struct lu_env *env, struct ofd_device *ofd,
                        GOTO(out_tx, rc);
        }
 
-       rc = dt_declare_xattr_set(env, dt_obj, &info->fti_buf,
-                       XATTR_NAME_FID, 0, th);
-       if (rc)
-               GOTO(out_tx, rc);
-
+       if (oa->o_valid & (OBD_MD_FLFID | OBD_MD_FLOSTLAYOUT |
+                          OBD_MD_LAYOUT_VERSION)) {
+               rc = dt_declare_xattr_set(env, dt_obj, &info->fti_buf,
+                                         XATTR_NAME_FID, 0, th);
+               if (rc)
+                       GOTO(out_tx, rc);
+       }
        /* We don't need a transno for this operation which will be re-executed
         * anyway when the OST_WRITE (with a transno assigned) is replayed */
        rc = dt_trans_start_local(env, ofd->ofd_osd , th);
@@ -956,6 +946,17 @@ ofd_write_attr_set(const struct lu_env *env, struct ofd_device *ofd,
 
        ofd_read_lock(env, ofd_obj);
 
+       rc = ofd_attr_handle_id(env, ofd_obj, la, 0 /* !is_setattr */);
+       if (rc != 0)
+               GOTO(out_unlock, rc);
+
+       if (!la->la_valid && !(oa->o_valid &
+           (OBD_MD_FLFID | OBD_MD_FLOSTLAYOUT | OBD_MD_LAYOUT_VERSION)))
+               /* no attributes to set */
+               GOTO(out_unlock, rc = 0);
+
+
+
        /* set uid/gid/projid */
        if (la->la_valid) {
                rc = dt_attr_set(env, dt_obj, la, th);
@@ -1114,7 +1115,7 @@ ofd_commitrw_write(const struct lu_env *env, struct obd_export *exp,
 
        LASSERT(objcount == 1);
 
-       fo = ofd_object_find(env, ofd, fid);
+       fo = ofd_info(env)->fti_obj;
        LASSERT(fo != NULL);
 
        o = ofd_object_child(fo);
@@ -1255,8 +1256,6 @@ out_stop:
 out:
        dt_bufs_put(env, o, lnb, niocount);
        ofd_object_put(env, fo);
-       /* second put is pair to object_get in ofd_preprw_write */
-       ofd_object_put(env, fo);
        if (granted > 0)
                tgt_grant_commit(exp, granted, old_rc);
        RETURN(rc);
@@ -1292,6 +1291,8 @@ int ofd_commitrw(const struct lu_env *env, int cmd, struct obd_export *exp,
        struct ofd_thread_info *info = ofd_info(env);
        struct ofd_device *ofd = ofd_exp(exp);
        const struct lu_fid *fid = &oa->o_oi.oi_fid;
+       struct ldlm_namespace *ns = ofd->ofd_namespace;
+       struct ldlm_resource *rs = NULL;
        __u64 valid;
        int rc = 0;
 
@@ -1343,6 +1344,23 @@ int ofd_commitrw(const struct lu_env *env, int cmd, struct obd_export *exp,
                        oa->o_valid |= OBD_MD_FLALLQUOTA;
                }
 
+               /**
+                * Update LVB after writing finish for server lock, see
+                * comments in ldlm_lock_decref_internal(), If this is a
+                * local lock on a server namespace and this was the last
+                * reference, lock will be destroyed directly thus there
+                * is no chance for ldlm_request_cancel() to update lvb.
+                */
+               if (rc == 0 && (rnb[0].rnb_flags & OBD_BRW_SRVLOCK)) {
+                       ost_fid_build_resid(fid, &info->fti_resid);
+                       rs = ldlm_resource_get(ns, NULL, &info->fti_resid,
+                                              LDLM_EXTENT, 0);
+                       if (!IS_ERR(rs)) {
+                               ldlm_res_lvbo_update(rs, NULL, 1);
+                               ldlm_resource_putref(rs);
+                       }
+               }
+
                /* Convert back to client IDs. LU-9671.
                 * nodemap_get_from_exp() may fail due to nodemap deactivated,
                 * server ID will be returned back to client in that case. */
@@ -1357,22 +1375,6 @@ int ofd_commitrw(const struct lu_env *env, int cmd, struct obd_export *exp,
                        nodemap_putref(nodemap);
                }
        } else if (cmd == OBD_BRW_READ) {
-               struct ldlm_namespace *ns = ofd->ofd_namespace;
-
-               /* If oa != NULL then ofd_preprw_read updated the inode
-                * atime and we should update the lvb so that other glimpses
-                * will also get the updated value. bug 5972 */
-               if (oa && ns && ns->ns_lvbo && ns->ns_lvbo->lvbo_update) {
-                        struct ldlm_resource *rs = NULL;
-
-                       ost_fid_build_resid(fid, &info->fti_resid);
-                       rs = ldlm_resource_get(ns, NULL, &info->fti_resid,
-                                              LDLM_EXTENT, 0);
-                       if (!IS_ERR(rs)) {
-                               ldlm_res_lvbo_update(rs, NULL, 1);
-                               ldlm_resource_putref(rs);
-                       }
-               }
                rc = ofd_commitrw_read(env, ofd, fid, objcount,
                                       npages, lnb);
                if (old_rc)