Whamcloud - gitweb
b=19188
authorjxiong <jxiong>
Mon, 22 Jun 2009 18:39:46 +0000 (18:39 +0000)
committerjxiong <jxiong>
Mon, 22 Jun 2009 18:39:46 +0000 (18:39 +0000)
r=pravin,rread

More debug info are added to catch bugs.

lustre/llite/vvp_page.c
lustre/obdclass/cl_io.c
lustre/osc/osc_lock.c

index 548ffb0..f543f59 100644 (file)
@@ -91,13 +91,13 @@ static void vvp_page_own(const struct lu_env *env,
         while (TestSetPageLocked(vmpage)) {
                 cfs_schedule_timeout(CFS_TASK_INTERRUPTIBLE,
                                      cfs_time_seconds(1)/10);
         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"
                         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, 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");
                         libcfs_debug_dumpstack(NULL);
                         LCONSOLE_WARN("Reproduced bug #18881,please contact:"
                                "jay <jinshan.xiong@sun.com>, thanks\n");
index e36bc31..1a172f4 100644 (file)
@@ -1129,6 +1129,7 @@ int cl_page_list_own(const struct lu_env *env,
 {
         struct cl_page *page;
         struct cl_page *temp;
 {
         struct cl_page *page;
         struct cl_page *temp;
+        pgoff_t index = 0;
         int result;
 
         LINVRNT(plist->pl_owner == cfs_current());
         int result;
 
         LINVRNT(plist->pl_owner == cfs_current());
@@ -1136,8 +1137,10 @@ int cl_page_list_own(const struct lu_env *env,
         ENTRY;
         result = 0;
         cl_page_list_for_each_safe(page, temp, plist) {
         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)
                 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);
         }
                 else
                         cl_page_list_del(env, plist, page);
         }
index c9d8e31..f77c342 100644 (file)
@@ -62,6 +62,7 @@ static const struct cl_lock_operations osc_lock_ops;
 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 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)
 {
 
 int osc_lock_is_lockless(const struct osc_lock *olck)
 {
@@ -1381,8 +1382,10 @@ static int osc_lock_flush(struct osc_lock *ols, int discard)
                 cl_env_nested_put(&nest, env);
         } else
                 result = PTR_ERR(env);
                 cl_env_nested_put(&nest, env);
         } else
                 result = PTR_ERR(env);
-        if (result == 0)
+        if (result == 0) {
                 ols->ols_flush = 1;
                 ols->ols_flush = 1;
+                LINVRNT(!osc_lock_has_pages(ols));
+        }
         return result;
 }
 
         return result;
 }
 
@@ -1495,7 +1498,10 @@ static int osc_lock_has_pages(struct osc_lock *olck)
         return result;
 }
 #else
         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,
 #endif /* INVARIANT_CHECK */
 
 static void osc_lock_delete(const struct lu_env *env,
@@ -1504,6 +1510,12 @@ static void osc_lock_delete(const struct lu_env *env,
         struct osc_lock *olck;
 
         olck = cl2osc_lock(slice);
         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));
 
         LINVRNT(osc_lock_invariant(olck));
         LINVRNT(!osc_lock_has_pages(olck));