RETURN(rc);
}
+static int cml_readpage(const struct lu_context *ctxt, struct md_object *mo,
+ struct lu_rdpg *rdpg)
+{
+ int rc;
+ ENTRY;
+ rc = mo_readpage(ctxt, md_object_next(mo), rdpg);
+ RETURN(rc);
+}
+
static struct md_object_operations cml_mo_ops = {
.moo_attr_get = cml_attr_get,
.moo_attr_set = cml_attr_set,
.moo_ref_add = cml_ref_add,
.moo_ref_del = cml_ref_del,
.moo_open = cml_open,
- .moo_close = cml_close
+ .moo_close = cml_close,
+ .moo_readpage = cml_readpage
};
/* md_dir operations */
}
static int mdd_readpage(const struct lu_context *ctxt, struct md_object *obj,
- struct md_rdpg *rdpg)
+ struct lu_rdpg *rdpg)
{
struct dt_object *next;
int rc;
- LASSERT(lu_object_exists(ctxt, mdd2lu_obj(obj)));
- next = mdd_object_child(obj);
+ LASSERT(lu_object_exists(ctxt, mdd2lu_obj(md2mdd_obj(obj))));
+ next = mdd_object_child(md2mdd_obj(obj));
rc = next->do_ops->do_readpage(ctxt, next, rdpg);
return rc;
}
static int mdt_readpage(struct mdt_thread_info *info)
{
+ struct mdt_object *child = info->mti_object;
struct mdt_body *reqbody, *repbody;
int rc, i, tmpcount, tmpsize = 0;
struct lu_rdpg rdpg = { 0 };
- struct mdt_object *child;
ENTRY;
if (OBD_FAIL_CHECK(OBD_FAIL_MDS_READPAGE_PACK))
RETURN(-ENOMEM);
- req_capsule_set(&info->mti_pill, &RQF_MDS_READPAGE);
- rc = req_capsule_pack(&info->mti_pill);
- if (rc)
- RETURN(rc);
-
reqbody = req_capsule_client_get(&info->mti_pill,
&RMF_MDT_BODY);
if (reqbody == NULL)
RETURN(-EFAULT);
- child = mdt_object_find(info->mti_ctxt,
- info->mti_mdt, &reqbody->fid1);
- if (IS_ERR(child))
- RETURN(PTR_ERR(child));
-
repbody = req_capsule_server_get(&info->mti_pill,
&RMF_MDT_BODY);
if (repbody == NULL)
- GOTO(out_child, -EFAULT);
+ RETURN(-EFAULT);
- /* prepare @rdpg before calling lower layers and transfer itself. */
+ /*
+ * prepare @rdpg before calling lower layers and transfer itself. Here
+ * reqbody->size contains offset of where to start to read and
+ * reqbody->nlink contains number bytes to read.
+ */
rdpg.rp_offset = reqbody->size;
rdpg.rp_count = reqbody->nlink;
rdpg.rp_npages = (rdpg.rp_count + PAGE_SIZE - 1) >> PAGE_SHIFT;
EXIT;
free_rdpg:
for (i = 0; i < rdpg.rp_npages; i++)
- if (rdpg.rp_pages[i])
+ if (rdpg.rp_pages[i] != NULL)
__free_pages(rdpg.rp_pages[i], 0);
-out_child:
- mdt_object_put(info->mti_ctxt, child);
return rc;
}
};
static struct mdt_handler mdt_mds_readpage_ops[] = {
- DEF_MDT_HNDL_F(HABEO_CORPUS, READPAGE, mdt_readpage),
+ DEF_MDT_HNDL_F(HABEO_CORPUS|HABEO_REFERO, READPAGE, mdt_readpage),
};
static struct mdt_opc_slice mdt_readpage_handlers[] = {
{
- .mos_opc_start = MDS_READPAGE,
- .mos_opc_end = MDS_READPAGE + 1,
+ .mos_opc_start = MDS_GETATTR,
+ .mos_opc_end = MDS_LAST_OPC,
.mos_hs = mdt_mds_readpage_ops
},
{