Whamcloud - gitweb
b=18881
authorjxiong <jxiong>
Wed, 10 Jun 2009 06:06:26 +0000 (06:06 +0000)
committerjxiong <jxiong>
Wed, 10 Jun 2009 06:06:26 +0000 (06:06 +0000)
r=rread

a diagnose patch to help print the needed info.

lustre/llite/vvp_page.c
lustre/osc/osc_page.c

index 8db2b38..548ffb0 100644 (file)
@@ -83,9 +83,32 @@ static void vvp_page_own(const struct lu_env *env,
 {
         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;
+        int count = 0;
 
         LASSERT(vmpage != NULL);
 
         LASSERT(vmpage != NULL);
-        lock_page(vmpage);
+
+        /* DEBUG CODE FOR #18881 */
+        while (TestSetPageLocked(vmpage)) {
+                cfs_schedule_timeout(CFS_TASK_INTERRUPTIBLE,
+                                     cfs_time_seconds(1)/10);
+                if (++count > 100) {
+                        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",
+                                      vmpage, current->comm, current,
+                                      vmpage->flags);
+                        libcfs_debug_dumpstack(NULL);
+                        LCONSOLE_WARN("Reproduced bug #18881,please contact:"
+                               "jay <jinshan.xiong@sun.com>, thanks\n");
+
+                        lock_page(vmpage);
+                        break;
+                }
+        }
+        /* DEBUG CODE END */
+
+        /* lock_page(vmpage); */
         wait_on_page_writeback(vmpage);
 }
 
         wait_on_page_writeback(vmpage);
 }
 
index 5f5179c..1f8c33c 100644 (file)
@@ -269,16 +269,25 @@ static int osc_page_print(const struct lu_env *env,
         struct osc_async_page *oap = &opg->ops_oap;
 
         return (*printer)(env, cookie, LUSTRE_OSC_NAME"-page@%p: "
         struct osc_async_page *oap = &opg->ops_oap;
 
         return (*printer)(env, cookie, LUSTRE_OSC_NAME"-page@%p: "
-                          "%#x %d %u %s %s %s %llu %u %#x %p %p %p %p %p\n",
-                          opg, oap->oap_magic, oap->oap_cmd,
+                          "< %#x %d %u %s %s %s >"
+                          "< %llu %u %#x %#x %p %p %p %p %p >"
+                          "< %s %p %d >\n",
+                          opg,
+                          /* 1 */
+                          oap->oap_magic, oap->oap_cmd,
                           oap->oap_interrupted,
                           osc_list(&oap->oap_pending_item),
                           osc_list(&oap->oap_urgent_item),
                           osc_list(&oap->oap_rpc_item),
                           oap->oap_interrupted,
                           osc_list(&oap->oap_pending_item),
                           osc_list(&oap->oap_urgent_item),
                           osc_list(&oap->oap_rpc_item),
+                          /* 2 */
                           oap->oap_obj_off, oap->oap_page_off,
                           oap->oap_obj_off, oap->oap_page_off,
-                          oap->oap_async_flags, oap->oap_request,
+                          oap->oap_async_flags, oap->oap_brw_flags,
+                          oap->oap_request,
                           oap->oap_cli, oap->oap_loi, oap->oap_caller_ops,
                           oap->oap_cli, oap->oap_loi, oap->oap_caller_ops,
-                          oap->oap_caller_data);
+                          oap->oap_caller_data,
+                          /* 3 */
+                          osc_list(&opg->ops_inflight),
+                          opg->ops_submitter, opg->ops_transfer_pinned);
 }
 
 static void osc_page_delete(const struct lu_env *env,
 }
 
 static void osc_page_delete(const struct lu_env *env,
@@ -295,7 +304,11 @@ static void osc_page_delete(const struct lu_env *env,
         CDEBUG(D_TRACE, "%p\n", opg);
         osc_page_transfer_put(env, opg);
         rc = osc_teardown_async_page(osc_export(obj), NULL, obj->oo_oinfo, oap);
         CDEBUG(D_TRACE, "%p\n", opg);
         osc_page_transfer_put(env, opg);
         rc = osc_teardown_async_page(osc_export(obj), NULL, obj->oo_oinfo, oap);
-        LASSERTF(rc == 0, "%i\n", rc);
+        if (rc) {
+                CL_PAGE_DEBUG(D_ERROR, env, cl_page_top(slice->cpl_page),
+                              "Trying to teardown failed: %d\n", rc);
+                LASSERT(0);
+        }
         spin_lock(&obj->oo_seatbelt);
         list_del_init(&opg->ops_inflight);
         spin_unlock(&obj->oo_seatbelt);
         spin_lock(&obj->oo_seatbelt);
         list_del_init(&opg->ops_inflight);
         spin_unlock(&obj->oo_seatbelt);