Whamcloud - gitweb
LU-10244 osc: add a bit to indicate osc_page in cache tree 96/30096/6
authorBobi Jam <bobijam.xu@intel.com>
Wed, 15 Nov 2017 07:02:30 +0000 (15:02 +0800)
committerOleg Drokin <oleg.drokin@intel.com>
Sat, 3 Mar 2018 04:29:30 +0000 (04:29 +0000)
Add osc_page::ops_intree to indicate whether the osc_page is in the
osc_object's cache tree, so that when page cannot insert in the
cache as race happens, the cleanup code won't try to remove it from
the cache.

Signed-off-by: Bobi Jam <bobijam.xu@intel.com>
Change-Id: Ifcfe158d10c23a40c116414c7f4f86b257e1fa76
Reviewed-on: https://review.whamcloud.com/30096
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Jinshan Xiong <jinshan.xiong@intel.com>
Reviewed-by: Fan Yong <fan.yong@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lustre/include/lustre_osc.h
lustre/osc/osc_page.c

index 21f1764..ebc0168 100644 (file)
@@ -533,7 +533,11 @@ struct osc_page {
        /**
         * Set if the page must be transferred with OBD_BRW_SRVLOCK.
         */
-                               ops_srvlock:1;
+                               ops_srvlock:1,
+       /**
+        * If the page is in osc_object::oo_tree.
+        */
+                               ops_intree:1;
        /**
         * lru page list. See osc_lru_{del|use}() in osc_page.c for usage.
         */
index 8bc7fca..709e9dd 100644 (file)
@@ -196,12 +196,17 @@ static void osc_page_delete(const struct lu_env *env,
        osc_lru_del(osc_cli(obj), opg);
 
        if (slice->cpl_page->cp_type == CPT_CACHEABLE) {
-               void *value;
+               void *value = NULL;
 
                spin_lock(&obj->oo_tree_lock);
-               value = radix_tree_delete(&obj->oo_tree, osc_index(opg));
-               if (value != NULL)
-                       --obj->oo_npages;
+               if (opg->ops_intree) {
+                       value = radix_tree_delete(&obj->oo_tree,
+                                                 osc_index(opg));
+                       if (value != NULL) {
+                               --obj->oo_npages;
+                               opg->ops_intree = 0;
+                       }
+               }
                spin_unlock(&obj->oo_tree_lock);
 
                LASSERT(ergo(value != NULL, value == opg));
@@ -300,8 +305,10 @@ int osc_page_init(const struct lu_env *env, struct cl_object *obj,
                                spin_lock(&osc->oo_tree_lock);
                                result = radix_tree_insert(&osc->oo_tree,
                                                           index, opg);
-                               if (result == 0)
+                               if (result == 0) {
                                        ++osc->oo_npages;
+                                       opg->ops_intree = 1;
+                               }
                                spin_unlock(&osc->oo_tree_lock);
 
                                radix_tree_preload_end();