* GPL HEADER END
*/
/*
- * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+ * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
*/
/*
vvp_page_fini_common(cp);
}
-static void vvp_page_own(const struct lu_env *env,
- const struct cl_page_slice *slice, struct cl_io *io)
+static int vvp_page_own(const struct lu_env *env,
+ const struct cl_page_slice *slice, struct cl_io *io,
+ int nonblock)
{
struct ccc_page *vpg = cl2ccc_page(slice);
cfs_page_t *vmpage = vpg->cpg_page;
- int count = 0;
LASSERT(vmpage != NULL);
+ if (nonblock) {
+ if (TestSetPageLocked(vmpage))
+ return -EAGAIN;
- /* DEBUG CODE FOR #18881 */
- while (TestSetPageLocked(vmpage)) {
- cfs_schedule_timeout(CFS_TASK_INTERRUPTIBLE,
- cfs_time_seconds(1)/10);
- if (++count > 600) {
- CL_PAGE_DEBUG(D_ERROR, env,
- cl_page_top(slice->cpl_page),
- "XXX page %p blocked on acquiring the"
- " lock. process %s/%p, flags %lx,io %p\n",
- vmpage, current->comm, current,
- vmpage->flags, io);
- libcfs_debug_dumpstack(NULL);
- if (slice->cpl_page->cp_task) {
- cfs_task_t *tsk = slice->cpl_page->cp_task;
- LCONSOLE_WARN("The page was owned by %s\n",
- tsk->comm);
- libcfs_debug_dumpstack(tsk);
- }
- LCONSOLE_WARN("Reproduced bug #18881,please contact:"
- "jay <jinshan.xiong@sun.com>, thanks\n");
-
- lock_page(vmpage);
- break;
+ if (unlikely(PageWriteback(vmpage))) {
+ unlock_page(vmpage);
+ return -EAGAIN;
}
+
+ return 0;
}
- /* DEBUG CODE END */
- /* lock_page(vmpage); */
+ lock_page(vmpage);
wait_on_page_writeback(vmpage);
+ return 0;
}
static void vvp_page_assume(const struct lu_env *env,
/* LASSERT_SEM_LOCKED(&inode->i_alloc_sem); */
}
-static void vvp_transient_page_own(const struct lu_env *env,
- const struct cl_page_slice *slice,
- struct cl_io *unused)
+static int vvp_transient_page_own(const struct lu_env *env,
+ const struct cl_page_slice *slice,
+ struct cl_io *unused, int nonblock)
{
vvp_transient_page_verify(slice->cpl_page);
+ return 0;
}
static void vvp_transient_page_assume(const struct lu_env *env,