Whamcloud - gitweb
git://git.whamcloud.com
/
fs
/
lustre-release.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
b=20595
[fs/lustre-release.git]
/
lustre
/
llite
/
vvp_page.c
diff --git
a/lustre/llite/vvp_page.c
b/lustre/llite/vvp_page.c
index
c57ce84
..
18d7fa5
100644
(file)
--- a/
lustre/llite/vvp_page.c
+++ b/
lustre/llite/vvp_page.c
@@
-78,8
+78,9
@@
static void vvp_page_fini(const struct lu_env *env,
vvp_page_fini_common(cp);
}
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;
{
struct ccc_page *vpg = cl2ccc_page(slice);
cfs_page_t *vmpage = vpg->cpg_page;
@@
-87,11
+88,24
@@
static void vvp_page_own(const struct lu_env *env,
LASSERT(vmpage != NULL);
LASSERT(vmpage != NULL);
+ if (nonblock) {
+ if (TestSetPageLocked(vmpage))
+ return -EAGAIN;
+
+ if (unlikely(PageWriteback(vmpage))) {
+ /* Something gets wrong? */
+ unlock_page(vmpage);
+ return -EAGAIN;
+ }
+
+ return 0;
+ }
+
/* DEBUG CODE FOR #18881 */
while (TestSetPageLocked(vmpage)) {
cfs_schedule_timeout(CFS_TASK_INTERRUPTIBLE,
cfs_time_seconds(1)/10);
/* DEBUG CODE FOR #18881 */
while (TestSetPageLocked(vmpage)) {
cfs_schedule_timeout(CFS_TASK_INTERRUPTIBLE,
cfs_time_seconds(1)/10);
- if (++count >
6
00) {
+ if (++count >
12
00) {
CL_PAGE_DEBUG(D_ERROR, env,
cl_page_top(slice->cpl_page),
"XXX page %p blocked on acquiring the"
CL_PAGE_DEBUG(D_ERROR, env,
cl_page_top(slice->cpl_page),
"XXX page %p blocked on acquiring the"
@@
-99,6
+113,12
@@
static void vvp_page_own(const struct lu_env *env,
vmpage, current->comm, current,
vmpage->flags, io);
libcfs_debug_dumpstack(NULL);
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");
LCONSOLE_WARN("Reproduced bug #18881,please contact:"
"jay <jinshan.xiong@sun.com>, thanks\n");
@@
-110,6
+130,7
@@
static void vvp_page_own(const struct lu_env *env,
/* lock_page(vmpage); */
wait_on_page_writeback(vmpage);
/* lock_page(vmpage); */
wait_on_page_writeback(vmpage);
+ return 0;
}
static void vvp_page_assume(const struct lu_env *env,
}
static void vvp_page_assume(const struct lu_env *env,
@@
-202,13
+223,17
@@
static void vvp_page_delete(const struct lu_env *env,
}
static void vvp_page_export(const struct lu_env *env,
}
static void vvp_page_export(const struct lu_env *env,
- const struct cl_page_slice *slice)
+ const struct cl_page_slice *slice,
+ int uptodate)
{
cfs_page_t *vmpage = cl2vm_page(slice);
LASSERT(vmpage != NULL);
LASSERT(PageLocked(vmpage));
{
cfs_page_t *vmpage = cl2vm_page(slice);
LASSERT(vmpage != NULL);
LASSERT(PageLocked(vmpage));
- SetPageUptodate(vmpage);
+ if (uptodate)
+ SetPageUptodate(vmpage);
+ else
+ ClearPageUptodate(vmpage);
}
static int vvp_page_is_vmlocked(const struct lu_env *env,
}
static int vvp_page_is_vmlocked(const struct lu_env *env,
@@
-267,14
+292,10
@@
static void vvp_page_completion_common(const struct lu_env *env,
struct cl_page *clp = cp->cpg_cl.cpl_page;
cfs_page_t *vmpage = cp->cpg_page;
struct inode *inode = ccc_object_inode(clp->cp_obj);
struct cl_page *clp = cp->cpg_cl.cpl_page;
cfs_page_t *vmpage = cp->cpg_page;
struct inode *inode = ccc_object_inode(clp->cp_obj);
- struct cl_sync_io *anchor = cp->cpg_sync_io;
LINVRNT(cl_page_is_vmlocked(env, clp));
LINVRNT(cl_page_is_vmlocked(env, clp));
- if (anchor != NULL) {
- cp->cpg_sync_io = NULL;
- cl_sync_io_note(anchor, ioret);
- } else if (clp->cp_type == CPT_CACHEABLE) {
+ if (!clp->cp_sync_io && clp->cp_type == CPT_CACHEABLE) {
/*
* Only mark the page error only when it's a cacheable page
* and NOT a sync io.
/*
* Only mark the page error only when it's a cacheable page
* and NOT a sync io.
@@
-305,7
+326,7
@@
static void vvp_page_completion_read(const struct lu_env *env,
if (ioret == 0) {
/* XXX: do we need this for transient pages? */
if (!cp->cpg_defer_uptodate)
if (ioret == 0) {
/* XXX: do we need this for transient pages? */
if (!cp->cpg_defer_uptodate)
- cl_page_export(env, page);
+ cl_page_export(env, page
, 1
);
} else
cp->cpg_defer_uptodate = 0;
vvp_page_completion_common(env, cp, ioret);
} else
cp->cpg_defer_uptodate = 0;
vvp_page_completion_common(env, cp, ioret);
@@
-459,11
+480,12
@@
static void vvp_transient_page_verify(const struct cl_page *page)
/* LASSERT_SEM_LOCKED(&inode->i_alloc_sem); */
}
/* 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);
{
vvp_transient_page_verify(slice->cpl_page);
+ return 0;
}
static void vvp_transient_page_assume(const struct lu_env *env,
}
static void vvp_transient_page_assume(const struct lu_env *env,