struct cl_page *page = oap2cl_page(oap);
enum cl_req_type crt;
int srvlock;
+ int cptype = page->cp_type;
ENTRY;
cmd &= ~OBD_BRW_NOQUOTA;
- if (page->cp_type != CPT_TRANSIENT) {
+ if (cptype != CPT_TRANSIENT) {
LASSERTF(equi(page->cp_state == CPS_PAGEIN, cmd == OBD_BRW_READ),
"cp_state:%u, cmd:%d\n", page->cp_state, cmd);
LASSERTF(equi(page->cp_state == CPS_PAGEOUT, cmd == OBD_BRW_WRITE),
*/
lu_ref_del(&page->cp_reference, "transfer", page);
+ /* for transient pages, the last reference is destroyed by the
+ * cl_page_completion process, so do not referencce the page after this
+ */
cl_page_completion(env, page, crt, rc);
- cl_page_put(env, page);
+ if (cptype != CPT_TRANSIENT)
+ cl_page_put(env, page);
RETURN(0);
}
{
struct osc_page *opg = cl2osc_page(slice);
struct osc_object *obj = osc_page_object(opg);
+ void *value = NULL;
int rc;
ENTRY;
CDEBUG(D_TRACE, "%p\n", opg);
- osc_page_transfer_put(env, opg);
- if (slice->cpl_page->cp_type == CPT_CACHEABLE) {
- void *value = NULL;
+ osc_page_transfer_put(env, opg);
- rc = osc_teardown_async_page(env, obj, opg);
- if (rc) {
- CL_PAGE_DEBUG(D_ERROR, env, slice->cpl_page,
- "Trying to teardown failed: %d\n", rc);
- LASSERT(0);
- }
+ rc = osc_teardown_async_page(env, obj, opg);
+ if (rc) {
+ CL_PAGE_DEBUG(D_ERROR, env, slice->cpl_page,
+ "Trying to teardown failed: %d\n", rc);
+ LASSERT(0);
+ }
- osc_lru_del(osc_cli(obj), opg);
+ osc_lru_del(osc_cli(obj), opg);
- spin_lock(&obj->oo_tree_lock);
- if (opg->ops_intree) {
- value = radix_tree_delete(&obj->oo_tree,
- osc_index(opg));
- if (value != NULL) {
- --obj->oo_npages;
- opg->ops_intree = 0;
- }
+ spin_lock(&obj->oo_tree_lock);
+ if (opg->ops_intree) {
+ value = radix_tree_delete(&obj->oo_tree,
+ osc_index(opg));
+ if (value != NULL) {
+ --obj->oo_npages;
+ opg->ops_intree = 0;
}
- spin_unlock(&obj->oo_tree_lock);
-
- LASSERT(ergo(value != NULL, value == opg));
}
+ spin_unlock(&obj->oo_tree_lock);
+
+ LASSERT(ergo(value != NULL, value == opg));
EXIT;
}
static const struct cl_page_operations osc_transient_page_ops = {
.cpo_print = osc_page_print,
- .cpo_delete = osc_page_delete,
.cpo_clip = osc_page_clip,
};
{
struct osc_io *oio = osc_env_io(env);
struct osc_async_page *oap = &opg->ops_oap;
+ struct cl_page *page = opg->ops_cl.cpl_page;
LASSERT(oap->oap_async_flags & ASYNC_READY);
LASSERT(oap->oap_async_flags & ASYNC_COUNT_STABLE);
if (oio->oi_cap_sys_resource)
oap->oap_brw_flags |= OBD_BRW_SYS_RESOURCE;
- osc_page_transfer_get(opg, "transfer\0imm");
+ if (page->cp_type != CPT_TRANSIENT)
+ osc_page_transfer_get(opg, "transfer\0imm");
osc_page_transfer_add(env, opg, crt);
}