/* the file offset of the first page. */
loff_t cdp_file_offset;
unsigned int cdp_lov_index;
+ loff_t cdp_osc_off;
/* the first and last page can be incomplete, this records the
* offsets
*/
#define OSC_FLAGS (ASYNC_URGENT|ASYNC_READY)
/* osc_page.c */
+int osc_dio_pages_init(const struct lu_env *env, struct cl_object *obj,
+ struct cl_dio_pages *cdp, pgoff_t index);
int osc_page_init(const struct lu_env *env, struct cl_io *io,
struct cl_object *obj, struct cl_page *cl_page,
pgoff_t index);
static const struct cl_object_operations mdc_ops = {
.coo_page_init = osc_page_init,
+ .coo_dio_pages_init = osc_dio_pages_init,
.coo_lock_init = mdc_lock_init,
.coo_io_init = mdc_io_init,
.coo_attr_get = mdc_attr_get,
struct osc_lock *oscl;
struct cl_page *page;
struct osc_page *opg;
+ pgoff_t cdp_index = cdp->cdp_osc_off >> PAGE_SHIFT;
int mppr = cli->cl_max_pages_per_rpc;
int page_count = to_page - from_page + 1;
pgoff_t start = CL_PAGE_EOF;
if (unlikely(cdp->cdp_from > 0 || cdp->cdp_to < PAGE_SIZE - 1))
can_merge = false;
- for (i = from_page; i <= to_page; i++) {
- pgoff_t index;
-
- page = cdp->cdp_cl_pages[i];
- opg = osc_cl_page_osc(page, obj);
- oap = &opg->ops_oap;
- index = osc_index(opg);
-
- if (index > end)
- end = index;
- if (index < start)
- start = index;
- }
+ start = cdp_index + from_page;
+ end = cdp_index + to_page;
ext = osc_extent_alloc(obj);
if (ext == NULL) {
static const struct cl_object_operations osc_ops = {
.coo_page_init = osc_page_init,
+ .coo_dio_pages_init = osc_dio_pages_init,
.coo_lock_init = osc_lock_init,
.coo_io_init = osc_io_init,
.coo_attr_get = osc_attr_get,
.cpo_page_touch = osc_page_touch,
};
+int osc_dio_pages_init(const struct lu_env *env, struct cl_object *obj,
+ struct cl_dio_pages *cdp, pgoff_t index)
+{
+ cdp->cdp_osc_off = index << PAGE_SHIFT;
+
+ return 0;
+}
+EXPORT_SYMBOL(osc_dio_pages_init);
+
int osc_page_init(const struct lu_env *env, struct cl_io *io,
struct cl_object *obj, struct cl_page *cl_page, pgoff_t index)
{