Whamcloud - gitweb
LU-13799 clio: Skip prep for transients
[fs/lustre-release.git] / lustre / obdclass / cl_page.c
index 4dfa0d6..0dc44cf 100644 (file)
@@ -27,7 +27,6 @@
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
- * Lustre is a trademark of Sun Microsystems, Inc.
  *
  * Client Lustre Page.
  *
@@ -204,7 +203,8 @@ static void cl_page_free(const struct lu_env *env, struct cl_page *cl_page,
        cs_pagestate_dec(obj, cl_page->cp_state);
        lu_object_ref_del_at(&obj->co_lu, &cl_page->cp_obj_ref,
                             "cl_page", cl_page);
-       cl_object_put(env, obj);
+       if (cl_page->cp_type != CPT_TRANSIENT)
+               cl_object_put(env, obj);
        lu_ref_fini(&cl_page->cp_reference);
        __cl_page_free(cl_page, bufsize);
        EXIT;
@@ -216,6 +216,9 @@ static struct cl_page *__cl_page_alloc(struct cl_object *o)
        struct cl_page *cl_page = NULL;
        unsigned short bufsize = cl_object_header(o)->coh_page_bufsize;
 
+       if (OBD_FAIL_CHECK(OBD_FAIL_LLITE_PAGE_ALLOC))
+               return NULL;
+
 check:
        /* the number of entries in cl_page_kmem_array is expected to
         * only be 2-3 entries, so the lookup overhead should be low.
@@ -284,7 +287,8 @@ struct cl_page *cl_page_alloc(const struct lu_env *env, struct cl_object *o,
                BUILD_BUG_ON((1 << CP_TYPE_BITS) < CPT_NR); /* cp_type */
                atomic_set(&cl_page->cp_ref, 1);
                cl_page->cp_obj = o;
-               cl_object_get(o);
+               if (type != CPT_TRANSIENT)
+                       cl_object_get(o);
                lu_object_ref_add_at(&o->co_lu, &cl_page->cp_obj_ref,
                                     "cl_page", cl_page);
                cl_page->cp_vmpage = vmpage;
@@ -979,13 +983,16 @@ int cl_page_prep(const struct lu_env *env, struct cl_io *io,
        if (crt >= CRT_NR)
                return -EINVAL;
 
-       cl_page_slice_for_each(cl_page, slice, i) {
-               if (slice->cpl_ops->cpo_own)
-                       result = (*slice->cpl_ops->io[crt].cpo_prep)(env,
+       if (cl_page->cp_type != CPT_TRANSIENT) {
+               cl_page_slice_for_each(cl_page, slice, i) {
+                       if (slice->cpl_ops->cpo_own)
+                               result =
+                                (*slice->cpl_ops->io[crt].cpo_prep)(env,
                                                                     slice,
                                                                     io);
-               if (result != 0)
-                       break;
+                       if (result != 0)
+                               break;
+               }
        }
 
        if (result >= 0) {