- missed part of 15440. Do not forget to call ldlm_pool_fini() before removing ns proc dir;
- call ldlm_namespace_unregister() namespace _before_ __ldlm_namespace_free() which is waiting for refc == 0 as ldlm_namespace_unregister() drops refc.
+ /* Remove @ns from list. */
+ ldlm_namespace_unregister(ns, ns->ns_client);
+
/* Can fail with -EINTR when force == 0 in which case try harder */
rc = __ldlm_namespace_free(ns, force);
if (rc != ELDLM_OK) {
/* Can fail with -EINTR when force == 0 in which case try harder */
rc = __ldlm_namespace_free(ns, force);
if (rc != ELDLM_OK) {
- /* Remove @ns from list. */
- ldlm_namespace_unregister(ns, ns->ns_client);
+ /*
+ * Fini pool _before_ parent proc dir is removed. This is important as
+ * ldlm_pool_fini() removes own proc dir which is child to @dir. Removing
+ * it after @dir may cause oops.
+ */
+ ldlm_pool_fini(&ns->ns_pool);
#ifdef LPROCFS
{
struct proc_dir_entry *dir;
#ifdef LPROCFS
{
struct proc_dir_entry *dir;