}
EXPORT_SYMBOL(obd_exports_barrier);
+/* Total amount of zombies to be destroyed */
+static int zombies_count = 0;
+
/**
* kill zombie imports and exports
*/
cfs_spin_unlock(&obd_zombie_impexp_lock);
- if (import != NULL)
+ if (import != NULL) {
class_import_destroy(import);
+ cfs_spin_lock(&obd_zombie_impexp_lock);
+ zombies_count--;
+ cfs_spin_unlock(&obd_zombie_impexp_lock);
+ }
- if (export != NULL)
+ if (export != NULL) {
class_export_destroy(export);
+ cfs_spin_lock(&obd_zombie_impexp_lock);
+ zombies_count--;
+ cfs_spin_unlock(&obd_zombie_impexp_lock);
+ }
cfs_cond_resched();
} while (import != NULL || export != NULL);
int rc;
cfs_spin_lock(&obd_zombie_impexp_lock);
- rc = cfs_list_empty(&obd_zombie_imports) &&
- cfs_list_empty(&obd_zombie_exports) &&
+ rc = (zombies_count == 0) &&
!cfs_test_bit(OBD_ZOMBIE_STOP, &obd_zombie_flags);
-
cfs_spin_unlock(&obd_zombie_impexp_lock);
RETURN(rc);
cfs_list_del_init(&exp->exp_obd_chain);
cfs_spin_unlock(&exp->exp_obd->obd_dev_lock);
cfs_spin_lock(&obd_zombie_impexp_lock);
+ zombies_count++;
cfs_list_add(&exp->exp_obd_chain, &obd_zombie_exports);
cfs_spin_unlock(&obd_zombie_impexp_lock);
LASSERT(imp->imp_sec == NULL);
cfs_spin_lock(&obd_zombie_impexp_lock);
LASSERT(cfs_list_empty(&imp->imp_zombie_chain));
+ zombies_count++;
cfs_list_add(&imp->imp_zombie_chain, &obd_zombie_imports);
cfs_spin_unlock(&obd_zombie_impexp_lock);
LASSERT(!cfs_test_bit(OBD_ZOMBIE_STOP, &obd_zombie_flags));
cfs_spin_lock(&obd_zombie_impexp_lock);
- rc = cfs_list_empty(&obd_zombie_imports) &&
- cfs_list_empty(&obd_zombie_exports);
+ rc = (zombies_count == 0);
cfs_spin_unlock(&obd_zombie_impexp_lock);
return rc;
}