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>
/**
* Set if the page must be transferred with OBD_BRW_SRVLOCK.
*/
/**
* Set if the page must be transferred with OBD_BRW_SRVLOCK.
*/
+ 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.
*/
/**
* lru page list. See osc_lru_{del|use}() in osc_page.c for usage.
*/
osc_lru_del(osc_cli(obj), opg);
if (slice->cpl_page->cp_type == CPT_CACHEABLE) {
osc_lru_del(osc_cli(obj), opg);
if (slice->cpl_page->cp_type == CPT_CACHEABLE) {
spin_lock(&obj->oo_tree_lock);
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));
spin_unlock(&obj->oo_tree_lock);
LASSERT(ergo(value != NULL, value == opg));
spin_lock(&osc->oo_tree_lock);
result = radix_tree_insert(&osc->oo_tree,
index, opg);
spin_lock(&osc->oo_tree_lock);
result = radix_tree_insert(&osc->oo_tree,
index, opg);
+ opg->ops_intree = 1;
+ }
spin_unlock(&osc->oo_tree_lock);
radix_tree_preload_end();
spin_unlock(&osc->oo_tree_lock);
radix_tree_preload_end();