-static const struct cl_page_operations lov_page_ops = {
- .cpo_fini = lov_page_fini,
- .cpo_own = lov_page_own,
- .cpo_assume = lov_page_assume,
- .cpo_print = lov_page_print
-};
-
-static void lov_empty_page_fini(const struct lu_env *env,
- struct cl_page_slice *slice)
-{
- struct lov_page *lp = cl2lov_page(slice);
-
- LASSERT(slice->cpl_page->cp_child == NULL);
- ENTRY;
- OBD_SLAB_FREE_PTR(lp, lov_page_kmem);
- EXIT;
-}
-
-struct cl_page *lov_page_init_raid0(const struct lu_env *env,
- struct cl_object *obj, struct cl_page *page,
- cfs_page_t *vmpage)
-{
- struct lov_object *loo = cl2lov(obj);
- struct lov_layout_raid0 *r0 = lov_r0(loo);
- struct lov_io *lio = lov_env_io(env);
- struct cl_page *subpage;
- struct cl_object *subobj;
- struct lov_io_sub *sub;
- struct lov_page *lpg;
- struct cl_page *result;
- loff_t offset;
- obd_off suboff;
- int stripe;
- int rc;
- ENTRY;
-
- offset = cl_offset(obj, page->cp_index);
- stripe = lov_stripe_number(r0->lo_lsm, offset);
- LASSERT(stripe < r0->lo_nr);
- rc = lov_stripe_offset(r0->lo_lsm, offset, stripe,
- &suboff);
- LASSERT(rc == 0);
-
- OBD_SLAB_ALLOC_PTR_GFP(lpg, lov_page_kmem, CFS_ALLOC_IO);
- if (lpg == NULL)
- GOTO(out, result = ERR_PTR(-ENOMEM));
-
- lpg->lps_invalid = 1;
- cl_page_slice_add(page, &lpg->lps_cl, obj, &lov_page_ops);
-
- sub = lov_sub_get(env, lio, stripe);
- if (IS_ERR(sub))
- GOTO(out, result = (struct cl_page *)sub);
-
- subobj = lovsub2cl(r0->lo_sub[stripe]);
- subpage = cl_page_find_sub(sub->sub_env, subobj,
- cl_index(subobj, suboff), vmpage, page);
- lov_sub_put(sub);
- if (IS_ERR(subpage))
- GOTO(out, result = subpage);
-
- if (likely(subpage->cp_parent == page)) {
- lu_ref_add(&subpage->cp_reference, "lov", page);
- lpg->lps_invalid = 0;
- result = NULL;
- } else {
- CL_PAGE_DEBUG(D_ERROR, env, page, "parent page\n");
- CL_PAGE_DEBUG(D_ERROR, env, subpage, "child page\n");
- LASSERT(0);
- }
-
- EXIT;
-out:
- return(result);
-}
-
-