Whamcloud - gitweb
LU-13799 clio: Skip prep for transients
[fs/lustre-release.git] / lustre / obdclass / cl_page.c
index 9723b38..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.
@@ -268,7 +271,7 @@ struct cl_page *cl_page_alloc(const struct lu_env *env, struct cl_object *o,
                              enum cl_page_type type)
 {
        struct cl_page *cl_page;
-       struct lu_object_header *head;
+       struct cl_object *head;
 
        ENTRY;
 
@@ -284,17 +287,18 @@ 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;
                cl_page->cp_state = CPS_CACHED;
                cl_page->cp_type = type;
+               cl_page->cp_inode = NULL;
                INIT_LIST_HEAD(&cl_page->cp_batch);
                lu_ref_init(&cl_page->cp_reference);
-               head = o->co_lu.lo_header;
-               list_for_each_entry(o, &head->loh_layers,
-                                   co_lu.lo_linkage) {
+               head = o;
+               cl_object_for_each(o, head) {
                        if (o->co_ops->coo_page_init != NULL) {
                                result = o->co_ops->coo_page_init(env, o,
                                                        cl_page, ind);
@@ -350,7 +354,7 @@ struct cl_page *cl_page_find(const struct lu_env *env,
         if (type == CPT_CACHEABLE) {
                /* vmpage lock is used to protect the child/parent
                 * relationship */
-               KLASSERT(PageLocked(vmpage));
+               LASSERT(PageLocked(vmpage));
                 /*
                  * cl_vmpage_page() can be called here without any locks as
                  *
@@ -515,7 +519,7 @@ struct cl_page *cl_vmpage_page(struct page *vmpage, struct cl_object *obj)
        struct cl_page *page;
 
        ENTRY;
-       KLASSERT(PageLocked(vmpage));
+       LASSERT(PageLocked(vmpage));
 
        /*
         * NOTE: absence of races and liveness of data are guaranteed by page
@@ -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) {