void (*cpo_unassume)(const struct lu_env *env,
const struct cl_page_slice *slice,
struct cl_io *io);
- /**
- * Announces whether the page contains valid data or not by \a uptodate.
- *
- * \see cl_page_export()
- * \see vvp_page_export()
- */
- void (*cpo_export)(const struct lu_env *env,
- const struct cl_page_slice *slice, int uptodate);
- /**
- * Checks whether underlying VM page is locked (in the suitable
- * sense). Used for assertions.
- *
- * \retval -EBUSY: page is protected by a lock of a given mode;
- * \retval -ENODATA: page is not protected by a lock;
- * \retval 0: this layer cannot decide. (Should never happen.)
- */
- int (*cpo_is_vmlocked)(const struct lu_env *env,
- const struct cl_page_slice *slice);
-
/**
* Update file attributes when all we have is this page. Used for tiny
* writes to update attributes when we don't have a full cl_io.
void cl_page_discard(const struct lu_env *env, struct cl_io *io,
struct cl_page *pg);
void cl_page_delete(const struct lu_env *env, struct cl_page *pg);
-int cl_page_is_vmlocked(const struct lu_env *env,
- const struct cl_page *pg);
void cl_page_touch(const struct lu_env *env, const struct cl_page *pg,
size_t to);
-void cl_page_export(const struct lu_env *env,
- struct cl_page *pg, int uptodate);
loff_t cl_offset(const struct cl_object *obj, pgoff_t idx);
pgoff_t cl_index(const struct cl_object *obj, loff_t offset);
size_t cl_page_size(const struct cl_object *obj);
put_page(vmpage);
break;
}
- cl_page_export(env, page, 1);
+ SetPageUptodate(vmpage);
cl_page_put(env, page);
unlock_page(vmpage);
put_page(vmpage);
cl_2queue_init(queue);
if (uptodate) {
vpg->vpg_ra_used = 1;
- cl_page_export(env, page, 1);
+ SetPageUptodate(page->cp_vmpage);
cl_page_disown(env, io, page);
} else {
anchor = &vvp_env_info(env)->vti_anchor;
/* export the page and skip io stack */
if (result == 0) {
vpg->vpg_ra_used = 1;
- cl_page_export(env, page, 1);
+ SetPageUptodate(vmpage);
} else {
ll_ra_stats_inc_sbi(sbi, RA_STAT_FAILED_FAST_READ);
}
*/
}
-static void vvp_page_export(const struct lu_env *env,
- const struct cl_page_slice *slice,
- int uptodate)
-{
- struct page *vmpage = cl2vm_page(slice);
-
- LASSERT(vmpage != NULL);
- LASSERT(PageLocked(vmpage));
- if (uptodate)
- SetPageUptodate(vmpage);
- else
- ClearPageUptodate(vmpage);
-}
-
-static int vvp_page_is_vmlocked(const struct lu_env *env,
- const struct cl_page_slice *slice)
-{
- return PageLocked(cl2vm_page(slice)) ? -EBUSY : -ENODATA;
-}
-
static int vvp_page_prep_read(const struct lu_env *env,
const struct cl_page_slice *slice,
struct cl_io *unused)
if (ioret == 0) {
if (!vpg->vpg_defer_uptodate)
- cl_page_export(env, page, 1);
+ SetPageUptodate(vmpage);
} else if (vpg->vpg_defer_uptodate) {
vpg->vpg_defer_uptodate = 0;
if (ioret == -EAGAIN) {
.cpo_disown = vvp_page_disown,
.cpo_discard = vvp_page_discard,
.cpo_delete = vvp_page_delete,
- .cpo_export = vvp_page_export,
- .cpo_is_vmlocked = vvp_page_is_vmlocked,
.cpo_fini = vvp_page_fini,
.cpo_print = vvp_page_print,
.io = {
cl_page_delete(env, page);
}
-static int vvp_transient_page_is_vmlocked(const struct lu_env *env,
- const struct cl_page_slice *slice)
-{
- return -EBUSY;
-}
-
static const struct cl_page_operations vvp_transient_page_ops = {
.cpo_discard = vvp_transient_page_discard,
- .cpo_is_vmlocked = vvp_transient_page_is_vmlocked,
.cpo_print = vvp_page_print,
};
addr = kmap(page->cp_vmpage);
memset(addr, 0, cl_page_size(obj));
kunmap(page->cp_vmpage);
- cl_page_export(env, page, 1);
+ SetPageUptodate(page->cp_vmpage);
RETURN(0);
}
struct cl_page_list *plist, struct cl_page *page)
{
LASSERT(plist->pl_nr > 0);
- LASSERT(cl_page_is_vmlocked(env, page));
ENTRY;
list_del_init(&page->cp_batch);
}
EXPORT_SYMBOL(cl_page_delete);
-/**
- * Marks page up-to-date.
- *
- * Call cl_page_operations::cpo_export() through all layers top-to-bottom. The
- * layer responsible for VM interaction has to mark/clear page as up-to-date
- * by the \a uptodate argument.
- *
- * \see cl_page_operations::cpo_export()
- */
-void cl_page_export(const struct lu_env *env, struct cl_page *cl_page,
- int uptodate)
-{
- const struct cl_page_slice *slice;
- int i;
-
- PINVRNT(env, cl_page, cl_page_invariant(cl_page));
-
- cl_page_slice_for_each(cl_page, slice, i) {
- if (slice->cpl_ops->cpo_export != NULL)
- (*slice->cpl_ops->cpo_export)(env, slice, uptodate);
- }
-}
-EXPORT_SYMBOL(cl_page_export);
-
-/**
- * Returns true, if \a page is VM locked in a suitable sense by the calling
- * thread.
- */
-int cl_page_is_vmlocked(const struct lu_env *env,
- const struct cl_page *cl_page)
-{
- const struct cl_page_slice *slice;
- int result;
-
- ENTRY;
- slice = cl_page_slice_get(cl_page, 0);
- PASSERT(env, cl_page, slice->cpl_ops->cpo_is_vmlocked != NULL);
- /*
- * Call ->cpo_is_vmlocked() directly instead of going through
- * CL_PAGE_INVOKE(), because cl_page_is_vmlocked() is used by
- * cl_page_invariant().
- */
- result = slice->cpl_ops->cpo_is_vmlocked(env, slice);
- PASSERT(env, cl_page, result == -EBUSY || result == -ENODATA);
-
- RETURN(result == -EBUSY);
-}
-EXPORT_SYMBOL(cl_page_is_vmlocked);
-
void cl_page_touch(const struct lu_env *env,
const struct cl_page *cl_page, size_t to)
{
struct osc_page *ops = pvec[i];
struct cl_page *page = ops->ops_cl.cpl_page;
- if (cl_page_is_vmlocked(env, page) ||
+ if (PageLocked(page->cp_vmpage) ||
PageDirty(page->cp_vmpage) ||
PageWriteback(page->cp_vmpage))
return false;