int ldlm_namespace_cleanup(struct ldlm_namespace *ns, int flags);
void ldlm_namespace_free(struct ldlm_namespace *ns,
struct obd_import *imp, int force);
-void ldlm_namespace_move(struct ldlm_namespace *ns, ldlm_side_t client);
-struct ldlm_namespace *ldlm_namespace_first(ldlm_side_t client);
+void ldlm_namespace_register(struct ldlm_namespace *ns, ldlm_side_t client);
+void ldlm_namespace_unregister(struct ldlm_namespace *ns, ldlm_side_t client);
+void ldlm_namespace_move_locked(struct ldlm_namespace *ns, ldlm_side_t client);
+struct ldlm_namespace *ldlm_namespace_first_locked(ldlm_side_t client);
+void ldlm_namespace_get_locked(struct ldlm_namespace *ns);
+void ldlm_namespace_put_locked(struct ldlm_namespace *ns, int wakeup);
void ldlm_namespace_get(struct ldlm_namespace *ns);
void ldlm_namespace_put(struct ldlm_namespace *ns, int wakeup);
-void ldlm_namespace_get_nolock(struct ldlm_namespace *ns);
-void ldlm_namespace_put_nolock(struct ldlm_namespace *ns, int wakeup);
int ldlm_proc_setup(void);
#ifdef LPROCFS
void ldlm_proc_cleanup(void);
mutex_up(ldlm_namespace_lock(client));
return 0;
}
- ns = ldlm_namespace_first(client);
+ ns = ldlm_namespace_first_locked(client);
ldlm_namespace_get(ns);
- ldlm_namespace_move(ns, client);
+ ldlm_namespace_move_locked(ns, client);
mutex_up(ldlm_namespace_lock(client));
total += ldlm_pool_shrink(&ns->ns_pool, 0, gfp_mask);
ldlm_namespace_put(ns, 1);
cached = 0;
break;
}
- ns = ldlm_namespace_first(client);
+ ns = ldlm_namespace_first_locked(client);
ldlm_namespace_get(ns);
- ldlm_namespace_move(ns, client);
+ ldlm_namespace_move_locked(ns, client);
mutex_up(ldlm_namespace_lock(client));
nr_locks = ldlm_pool_granted(&ns->ns_pool);
mutex_up(ldlm_namespace_lock(client));
break;
}
- ns = ldlm_namespace_first(client);
+ ns = ldlm_namespace_first_locked(client);
ldlm_namespace_get(ns);
- ldlm_namespace_move(ns, client);
+ ldlm_namespace_move_locked(ns, client);
mutex_up(ldlm_namespace_lock(client));
/* After setup is done - recalc the pool. */
strcpy(ns->ns_name, name);
CFS_INIT_LIST_HEAD(&ns->ns_root_list);
+ CFS_INIT_LIST_HEAD(&ns->ns_list_chain);
ns->ns_refcount = 0;
ns->ns_client = client;
spin_lock_init(&ns->ns_hash_lock);
GOTO(out_proc, rc);
}
- mutex_down(ldlm_namespace_lock(client));
- list_add(&ns->ns_list_chain, ldlm_namespace_list(client));
- atomic_inc(ldlm_namespace_nr(client));
- mutex_up(ldlm_namespace_lock(client));
-
+ ldlm_namespace_register(ns, client);
RETURN(ns);
out_proc:
ldlm_namespace_cleanup(ns, 0);
return;
}
- mutex_down(ldlm_namespace_lock(ns->ns_client));
- /*
- * Some asserts and possibly other parts of code still using
- * list_empty(&ns->ns_list_chain). This is why it is important
- * to use list_del_init() here.
- */
- list_del_init(&ns->ns_list_chain);
- atomic_dec(ldlm_namespace_nr(ns->ns_client));
- ldlm_pool_fini(&ns->ns_pool);
- mutex_up(ldlm_namespace_lock(ns->ns_client));
+ /* Remove @ns from list. */
+ ldlm_namespace_unregister(ns, ns->ns_client);
#ifdef LPROCFS
{
struct proc_dir_entry *dir;
}
-void ldlm_namespace_get_nolock(struct ldlm_namespace *ns)
+void ldlm_namespace_get_locked(struct ldlm_namespace *ns)
{
LASSERT(ns->ns_refcount >= 0);
ns->ns_refcount++;
void ldlm_namespace_get(struct ldlm_namespace *ns)
{
spin_lock(&ns->ns_hash_lock);
- ldlm_namespace_get_nolock(ns);
+ ldlm_namespace_get_locked(ns);
spin_unlock(&ns->ns_hash_lock);
}
-void ldlm_namespace_put_nolock(struct ldlm_namespace *ns, int wakeup)
+void ldlm_namespace_put_locked(struct ldlm_namespace *ns, int wakeup)
{
LASSERT(ns->ns_refcount > 0);
ns->ns_refcount--;
void ldlm_namespace_put(struct ldlm_namespace *ns, int wakeup)
{
spin_lock(&ns->ns_hash_lock);
- ldlm_namespace_put_nolock(ns, wakeup);
+ ldlm_namespace_put_locked(ns, wakeup);
spin_unlock(&ns->ns_hash_lock);
}
+/* Register @ns in the list of namespaces */
+void ldlm_namespace_register(struct ldlm_namespace *ns, ldlm_side_t client)
+{
+ mutex_down(ldlm_namespace_lock(client));
+ LASSERT(list_empty(&ns->ns_list_chain));
+ list_add(&ns->ns_list_chain, ldlm_namespace_list(client));
+ atomic_inc(ldlm_namespace_nr(client));
+ mutex_up(ldlm_namespace_lock(client));
+}
+
+/* Unregister @ns from the list of namespaces */
+void ldlm_namespace_unregister(struct ldlm_namespace *ns, ldlm_side_t client)
+{
+ mutex_down(ldlm_namespace_lock(client));
+ LASSERT(!list_empty(&ns->ns_list_chain));
+ /*
+ * Some asserts and possibly other parts of code still using
+ * list_empty(&ns->ns_list_chain). This is why it is important
+ * to use list_del_init() here.
+ */
+ list_del_init(&ns->ns_list_chain);
+ atomic_dec(ldlm_namespace_nr(client));
+ mutex_up(ldlm_namespace_lock(client));
+}
+
/* Should be called under ldlm_namespace_lock(client) taken */
-void ldlm_namespace_move(struct ldlm_namespace *ns, ldlm_side_t client)
+void ldlm_namespace_move_locked(struct ldlm_namespace *ns, ldlm_side_t client)
{
LASSERT(!list_empty(&ns->ns_list_chain));
LASSERT_SEM_LOCKED(ldlm_namespace_lock(client));
}
/* Should be called under ldlm_namespace_lock(client) taken */
-struct ldlm_namespace *ldlm_namespace_first(ldlm_side_t client)
+struct ldlm_namespace *ldlm_namespace_first_locked(ldlm_side_t client)
{
LASSERT_SEM_LOCKED(ldlm_namespace_lock(client));
LASSERT(!list_empty(ldlm_namespace_list(client)));
bucket = ns->ns_hash + hash;
list_add(&res->lr_hash, bucket);
ns->ns_resources++;
- ldlm_namespace_get_nolock(ns);
+ ldlm_namespace_get_locked(ns);
if (parent == NULL) {
list_add(&res->lr_childof, &ns->ns_root_list);
/* Pass 0 here to not wake ->ns_waitq up yet, we will do it few
* lines below when all children are freed. */
- ldlm_namespace_put_nolock(ns, 0);
+ ldlm_namespace_put_locked(ns, 0);
list_del_init(&res->lr_hash);
list_del_init(&res->lr_childof);