Whamcloud - gitweb
LU-5781 osc: osc_lock_weight endless loop fix 62/12362/3
authorJinshan Xiong <jinshan.xiong@intel.com>
Thu, 6 Nov 2014 18:00:32 +0000 (10:00 -0800)
committerOleg Drokin <oleg.drokin@intel.com>
Sun, 4 Jan 2015 18:06:45 +0000 (18:06 +0000)
With huge number of pages to scan by osc_lock_weight() it is likely
CLP_GANG_RESCHED is returned from osc_page_gang_lookup() and the scan
will be repeated again from the start. To be sure that the scan is
progressing across those restarts, next scan should be started from
the last scanned page index plus one.

Xyratex-bug-id: MRP-2145
Change-Id: I60775f2d8f688029d97ad4fe64f9b2698ed278c8
Signed-off-by: Alexander Zarochentsev <alexander.zarochentsev@seagate.com>
Signed-off-by: Jinshan Xiong <jinshan.xiong@intel.com>
Reviewed-on: http://review.whamcloud.com/12362
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Bobi Jam <bobijam@hotmail.com>
Reviewed-by: James Simmons <uja.ornl@gmail.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lustre/osc/osc_lock.c

index e5e59f8..6d15dad 100644 (file)
@@ -646,11 +646,10 @@ static int weigh_cb(const struct lu_env *env, struct cl_io *io,
 
        if (cl_page_is_vmlocked(env, page)
            || PageDirty(page->cp_vmpage) || PageWriteback(page->cp_vmpage)
 
        if (cl_page_is_vmlocked(env, page)
            || PageDirty(page->cp_vmpage) || PageWriteback(page->cp_vmpage)
-          ) {
-               (*(unsigned long *)cbdata)++;
+          )
                return CLP_GANG_ABORT;
                return CLP_GANG_ABORT;
-       }
 
 
+       *(pgoff_t *)cbdata = osc_index(ops) + 1;
        return CLP_GANG_OKAY;
 }
 
        return CLP_GANG_OKAY;
 }
 
@@ -660,7 +659,7 @@ static unsigned long osc_lock_weight(const struct lu_env *env,
 {
        struct cl_io     *io = &osc_env_info(env)->oti_io;
        struct cl_object *obj = cl_object_top(&oscobj->oo_cl);
 {
        struct cl_io     *io = &osc_env_info(env)->oti_io;
        struct cl_object *obj = cl_object_top(&oscobj->oo_cl);
-       unsigned long    npages = 0;
+       pgoff_t          page_index;
        int              result;
        ENTRY;
 
        int              result;
        ENTRY;
 
@@ -670,11 +669,12 @@ static unsigned long osc_lock_weight(const struct lu_env *env,
        if (result != 0)
                RETURN(result);
 
        if (result != 0)
                RETURN(result);
 
+       page_index = cl_index(obj, extent->start);
        do {
                result = osc_page_gang_lookup(env, io, oscobj,
        do {
                result = osc_page_gang_lookup(env, io, oscobj,
-                                             cl_index(obj, extent->start),
+                                             page_index,
                                              cl_index(obj, extent->end),
                                              cl_index(obj, extent->end),
-                                             weigh_cb, (void *)&npages);
+                                             weigh_cb, (void *)&page_index);
                if (result == CLP_GANG_ABORT)
                        break;
                if (result == CLP_GANG_RESCHED)
                if (result == CLP_GANG_ABORT)
                        break;
                if (result == CLP_GANG_RESCHED)
@@ -682,7 +682,7 @@ static unsigned long osc_lock_weight(const struct lu_env *env,
        } while (result != CLP_GANG_OKAY);
        cl_io_fini(env, io);
 
        } while (result != CLP_GANG_OKAY);
        cl_io_fini(env, io);
 
-       return npages;
+       return result == CLP_GANG_ABORT ? 1 : 0;
 }
 
 /**
 }
 
 /**