* Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
*
- * Copyright (c) 2011, Whamcloud, Inc.
+ * Copyright (c) 2011, 2012, Intel Corporation.
*/
/*
* This file is part of Lustre, http://www.lustre.org/
static void lov_page_fini(const struct lu_env *env,
struct cl_page_slice *slice)
{
- struct lov_page *lp = cl2lov_page(slice);
struct cl_page *sub = lov_sub_page(slice);
LINVRNT(lov_page_invariant(slice));
slice->cpl_page->cp_child = NULL;
cl_page_put(env, sub);
}
- OBD_SLAB_FREE_PTR(lp, lov_page_kmem);
EXIT;
}
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)
+int 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 cl_page *subpage;
struct cl_object *subobj;
struct lov_io_sub *sub;
- struct lov_page *lpg;
- struct cl_page *result;
+ struct lov_page *lpg = cl_object_page_slice(obj, page);
loff_t offset;
obd_off suboff;
int 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);
+ GOTO(out, rc = PTR_ERR(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);
+ GOTO(out, rc = PTR_ERR(subpage));
if (likely(subpage->cp_parent == page)) {
lu_ref_add(&subpage->cp_reference, "lov", page);
lpg->lps_invalid = 0;
- result = NULL;
+ rc = 0;
} else {
CL_PAGE_DEBUG(D_ERROR, env, page, "parent page\n");
CL_PAGE_DEBUG(D_ERROR, env, subpage, "child page\n");
EXIT;
out:
- return(result);
+ return rc;
}
.cpo_print = lov_page_print
};
-struct cl_page *lov_page_init_empty(const struct lu_env *env,
- struct cl_object *obj, struct cl_page *page,
- cfs_page_t *vmpage)
+int lov_page_init_empty(const struct lu_env *env, struct cl_object *obj,
+ struct cl_page *page, cfs_page_t *vmpage)
{
- struct lov_page *lpg;
- int result = -ENOMEM;
+ struct lov_page *lpg = cl_object_page_slice(obj, page);
+ void *addr;
ENTRY;
- OBD_SLAB_ALLOC_PTR_GFP(lpg, lov_page_kmem, CFS_ALLOC_IO);
- if (lpg != NULL) {
- void *addr;
- cl_page_slice_add(page, &lpg->lps_cl,
- obj, &lov_empty_page_ops);
- addr = cfs_kmap(vmpage);
- memset(addr, 0, cl_page_size(obj));
- cfs_kunmap(vmpage);
- cl_page_export(env, page, 1);
- result = 0;
- }
- RETURN(ERR_PTR(result));
+ cl_page_slice_add(page, &lpg->lps_cl, obj, &lov_empty_page_ops);
+ addr = cfs_kmap(vmpage);
+ memset(addr, 0, cl_page_size(obj));
+ cfs_kunmap(vmpage);
+ cl_page_export(env, page, 1);
+ RETURN(0);
}