while (TestSetPageLocked(vmpage)) {
cfs_schedule_timeout(CFS_TASK_INTERRUPTIBLE,
cfs_time_seconds(1)/10);
- if (++count > 100) {
+ 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\n",
+ " lock. process %s/%p, flags %lx,io %p\n",
vmpage, current->comm, current,
- vmpage->flags);
+ vmpage->flags, _);
libcfs_debug_dumpstack(NULL);
LCONSOLE_WARN("Reproduced bug #18881,please contact:"
"jay <jinshan.xiong@sun.com>, thanks\n");
{
struct cl_page *page;
struct cl_page *temp;
+ pgoff_t index = 0;
int result;
LINVRNT(plist->pl_owner == cfs_current());
ENTRY;
result = 0;
cl_page_list_for_each_safe(page, temp, plist) {
+ LASSERT(index <= page->cp_index);
+ index = page->cp_index;
if (cl_page_own(env, io, page) == 0)
- result = result ?: page->cp_error;
+ result = result ?: page->cp_error;
else
cl_page_list_del(env, plist, page);
}
static const struct cl_lock_operations osc_lock_lockless_ops;
static void osc_lock_to_lockless(const struct lu_env *env,
struct osc_lock *ols, int force);
+static int osc_lock_has_pages(struct osc_lock *olck);
int osc_lock_is_lockless(const struct osc_lock *olck)
{
cl_env_nested_put(&nest, env);
} else
result = PTR_ERR(env);
- if (result == 0)
+ if (result == 0) {
ols->ols_flush = 1;
+ LINVRNT(!osc_lock_has_pages(ols));
+ }
return result;
}
return result;
}
#else
-# define osc_lock_has_pages(olck) (0)
+static int osc_lock_has_pages(struct osc_lock *olck)
+{
+ return 0;
+}
#endif /* INVARIANT_CHECK */
static void osc_lock_delete(const struct lu_env *env,
struct osc_lock *olck;
olck = cl2osc_lock(slice);
+ if (olck->ols_glimpse) {
+ LASSERT(!olck->ols_hold);
+ LASSERT(!olck->ols_lock);
+ return;
+ }
+
LINVRNT(osc_lock_invariant(olck));
LINVRNT(!osc_lock_has_pages(olck));