*/
/*
* This file is part of Lustre, http://www.lustre.org/
- * Lustre is a trademark of Sun Microsystems, Inc.
*
* Client Lustre 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;
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.
enum cl_page_type type)
{
struct cl_page *cl_page;
- struct lu_object_header *head;
+ struct cl_object *head;
ENTRY;
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);
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
*
struct cl_page *page;
ENTRY;
- KLASSERT(PageLocked(vmpage));
+ LASSERT(PageLocked(vmpage));
/*
* NOTE: absence of races and liveness of data are guaranteed by page
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) {