diff --git a/lustre/include/lustre_dlm.h b/lustre/include/lustre_dlm.h
index 40c03e092b52420569634bd59376d497df344858..a7ccb9903ed12be0a0e1055339f69045d94503d5 100644
--- a/lustre/include/lustre_dlm.h
+++ b/lustre/include/lustre_dlm.h
@@ -672,7 +672,7 @@ void ldlm_resource_add_lock(struct ldlm_resource *res, struct list_head *head,
                             struct ldlm_lock *lock);
 void ldlm_resource_unlink_lock(struct ldlm_lock *lock);
 void ldlm_res2desc(struct ldlm_resource *res, struct ldlm_resource_desc *desc);
-void ldlm_dump_all_namespaces(int level);
+void ldlm_dump_all_namespaces(int level, ldlm_side_t client);
 void ldlm_namespace_dump(int level, struct ldlm_namespace *);
 void ldlm_resource_dump(int level, struct ldlm_resource *);
 int ldlm_lock_change_resource(struct ldlm_namespace *, struct ldlm_lock *,
@@ -758,10 +758,9 @@ void unlock_res_and_lock(struct ldlm_lock *lock);
 
 /* ldlm_pool.c */
 int ldlm_pools_init(ldlm_side_t client);
+void ldlm_pools_recalc(ldlm_side_t client);
 void ldlm_pools_fini(void);
 void ldlm_pools_wakeup(void);
-void ldlm_pools_recalc(void);
-int ldlm_pools_shrink(int nr, unsigned int gfp_mask);
 
 int ldlm_pool_init(struct ldlm_pool *pl, struct ldlm_namespace *ns, 
                    int idx, ldlm_side_t client);
diff --git a/lustre/ldlm/ldlm_internal.h b/lustre/ldlm/ldlm_internal.h
index 936170fcf9768962f5cd3b87e60b8c466a8689b8..440a21e857f76908a197cb8102258d8e2066b991 100644
--- a/lustre/ldlm/ldlm_internal.h
+++ b/lustre/ldlm/ldlm_internal.h
@@ -4,6 +4,31 @@
 
 #define MAX_STRING_SIZE 128
 
+extern atomic_t ldlm_srv_namespace_nr;
+extern atomic_t ldlm_cli_namespace_nr;
+extern struct semaphore ldlm_srv_namespace_lock;
+extern struct list_head ldlm_srv_namespace_list;
+extern struct semaphore ldlm_cli_namespace_lock;
+extern struct list_head ldlm_cli_namespace_list;
+
+static inline atomic_t *ldlm_namespace_nr(ldlm_side_t client)
+{
+        return client == LDLM_NAMESPACE_SERVER ? 
+                &ldlm_srv_namespace_nr : &ldlm_cli_namespace_nr;
+}
+
+static inline struct list_head *ldlm_namespace_list(ldlm_side_t client)
+{
+        return client == LDLM_NAMESPACE_SERVER ? 
+                &ldlm_srv_namespace_list : &ldlm_cli_namespace_list;
+}
+
+static inline struct semaphore *ldlm_namespace_lock(ldlm_side_t client)
+{
+        return client == LDLM_NAMESPACE_SERVER ? 
+                &ldlm_srv_namespace_lock : &ldlm_cli_namespace_lock;
+}
+
 /* ldlm_request.c */
 typedef enum {
         LDLM_ASYNC,
@@ -54,7 +79,11 @@ int ldlm_reprocess_queue(struct ldlm_resource *res, struct list_head *queue,
                          struct list_head *work_list);
 int ldlm_run_bl_ast_work(struct list_head *rpc_list);
 int ldlm_run_cp_ast_work(struct list_head *rpc_list);
+int ldlm_lock_remove_from_lru(struct ldlm_lock *lock);
 int ldlm_lock_remove_from_lru_nolock(struct ldlm_lock *lock);
+void ldlm_lock_add_to_lru_nolock(struct ldlm_lock *lock);
+void ldlm_lock_add_to_lru(struct ldlm_lock *lock);
+void ldlm_lock_touch_in_lru(struct ldlm_lock *lock);
 void ldlm_lock_destroy_nolock(struct ldlm_lock *lock);
 
 /* ldlm_lockd.c */
diff --git a/lustre/ldlm/ldlm_lock.c b/lustre/ldlm/ldlm_lock.c
index cc3bbb5c9850878e274d19aa4fb02eb8e46a4ffe..4e62e68e9a7892c01551281168314fb4b42a482d 100644
--- a/lustre/ldlm/ldlm_lock.c
+++ b/lustre/ldlm/ldlm_lock.c
@@ -172,10 +172,11 @@ int ldlm_lock_remove_from_lru_nolock(struct ldlm_lock *lock)
 {
         int rc = 0;
         if (!list_empty(&lock->l_lru)) {
+                struct ldlm_namespace *ns = lock->l_resource->lr_namespace;
                 LASSERT(lock->l_resource->lr_type != LDLM_FLOCK);
                 list_del_init(&lock->l_lru);
-                lock->l_resource->lr_namespace->ns_nr_unused--;
-                LASSERT(lock->l_resource->lr_namespace->ns_nr_unused >= 0);
+                ns->ns_nr_unused--;
+                LASSERT(ns->ns_nr_unused >= 0);
                 rc = 1;
         }
         return rc;
@@ -183,15 +184,49 @@ int ldlm_lock_remove_from_lru_nolock(struct ldlm_lock *lock)
 
 int ldlm_lock_remove_from_lru(struct ldlm_lock *lock)
 {
+        struct ldlm_namespace *ns = lock->l_resource->lr_namespace;
         int rc;
         ENTRY;
-        spin_lock(&lock->l_resource->lr_namespace->ns_unused_lock);
+        spin_lock(&ns->ns_unused_lock);
         rc = ldlm_lock_remove_from_lru_nolock(lock);
-        spin_unlock(&lock->l_resource->lr_namespace->ns_unused_lock);
+        spin_unlock(&ns->ns_unused_lock);
         EXIT;
         return rc;
 }
 
+void ldlm_lock_add_to_lru_nolock(struct ldlm_lock *lock)
+{
+        struct ldlm_namespace *ns = lock->l_resource->lr_namespace;
+        lock->l_last_used = cfs_time_current();
+        LASSERT(list_empty(&lock->l_lru));
+        list_add_tail(&lock->l_lru, &ns->ns_unused_list);
+        LASSERT(ns->ns_nr_unused >= 0);
+        ns->ns_nr_unused++;
+}
+
+void ldlm_lock_add_to_lru(struct ldlm_lock *lock)
+{
+        struct ldlm_namespace *ns = lock->l_resource->lr_namespace;
+        ENTRY;
+        spin_lock(&ns->ns_unused_lock);
+        ldlm_lock_add_to_lru_nolock(lock);
+        spin_unlock(&ns->ns_unused_lock);
+        EXIT;
+}
+
+void ldlm_lock_touch_in_lru(struct ldlm_lock *lock)
+{
+        struct ldlm_namespace *ns = lock->l_resource->lr_namespace;
+        ENTRY;
+        spin_lock(&ns->ns_unused_lock);
+        if (!list_empty(&lock->l_lru)) {
+                ldlm_lock_remove_from_lru_nolock(lock);
+                ldlm_lock_add_to_lru_nolock(lock);
+        }
+        spin_unlock(&ns->ns_unused_lock);
+        EXIT;
+}
+
 /* This used to have a 'strict' flag, which recovery would use to mark an
  * in-use lock as needing-to-die.  Lest I am ever tempted to put it back, I
  * shall explain why it's gone: with the new hash table scheme, once you call
@@ -531,7 +566,6 @@ void ldlm_lock_addref_internal_nolock(struct ldlm_lock *lock, __u32 mode)
                 lock->l_readers++;
         if (mode & (LCK_EX | LCK_CW | LCK_PW | LCK_GROUP))
                 lock->l_writers++;
-        lock->l_last_used = cfs_time_current();
         LDLM_LOCK_GET(lock);
         LDLM_DEBUG(lock, "ldlm_lock_addref(%s)", ldlm_lockname[mode]);
 }
@@ -603,17 +637,13 @@ void ldlm_lock_decref_internal(struct ldlm_lock *lock, __u32 mode)
                    !(lock->l_flags & LDLM_FL_NO_LRU)) {
                 /* If this is a client-side namespace and this was the last
                  * reference, put it on the LRU. */
-                LASSERT(list_empty(&lock->l_lru));
-                LASSERT(ns->ns_nr_unused >= 0);
-                lock->l_last_used = cfs_time_current();
-                spin_lock(&ns->ns_unused_lock);
-                list_add_tail(&lock->l_lru, &ns->ns_unused_list);
-                ns->ns_nr_unused++;
-                spin_unlock(&ns->ns_unused_lock);
+                ldlm_lock_add_to_lru(lock);
                 unlock_res_and_lock(lock);
-                /* Call ldlm_cancel_lru() only if EARLY_CANCEL is not supported
-                 * by the server, otherwise, it is done on enqueue. */
-                if (!exp_connect_cancelset(lock->l_conn_export))
+                /* Call ldlm_cancel_lru() only if EARLY_CANCEL and LRU RESIZE 
+                 * are not supported by the server, otherwise, it is done on 
+                 * enqueue. */
+                if (!exp_connect_cancelset(lock->l_conn_export) && 
+                    !exp_connect_lru_resize(lock->l_conn_export))
                         ldlm_cancel_lru(ns, 0, LDLM_ASYNC);
         } else {
                 unlock_res_and_lock(lock);
@@ -926,10 +956,12 @@ static struct ldlm_lock *search_queue(struct list_head *queue, ldlm_mode_t mode,
                     !(lock->l_flags & LDLM_FL_LOCAL))
                         continue;
 
-                if (flags & LDLM_FL_TEST_LOCK)
+                if (flags & LDLM_FL_TEST_LOCK) {
                         LDLM_LOCK_GET(lock);
-                else
+                        ldlm_lock_touch_in_lru(lock);
+                } else {
                         ldlm_lock_addref_internal_nolock(lock, mode);
+                }
                 return lock;
         }
 
diff --git a/lustre/ldlm/ldlm_lockd.c b/lustre/ldlm/ldlm_lockd.c
index 011cd703ca6300d533f08fcc79e7366034cf5718..ca5f7f8b0cb8c879786c0f49f04bf5213de1079f 100644
--- a/lustre/ldlm/ldlm_lockd.c
+++ b/lustre/ldlm/ldlm_lockd.c
@@ -43,8 +43,6 @@
 extern cfs_mem_cache_t *ldlm_resource_slab;
 extern cfs_mem_cache_t *ldlm_lock_slab;
 extern struct lustre_lock ldlm_handle_lock;
-extern struct list_head ldlm_namespace_list;
-extern struct semaphore ldlm_namespace_lock;
 
 static struct semaphore ldlm_ref_sem;
 static int ldlm_refcount;
@@ -1334,7 +1332,8 @@ static void ldlm_handle_gl_callback(struct ptlrpc_request *req,
         if (lock->l_granted_mode == LCK_PW &&
             !lock->l_readers && !lock->l_writers &&
             cfs_time_after(cfs_time_current(),
-                           cfs_time_add(lock->l_last_used, cfs_time_seconds(10)))) {
+                           cfs_time_add(lock->l_last_used, 
+                                        cfs_time_seconds(10)))) {
                 unlock_res_and_lock(lock);
                 if (ldlm_bl_to_thread(ns, NULL, lock, 0))
                         ldlm_handle_bl_callback(ns, NULL, lock);
@@ -1845,9 +1844,11 @@ static int ldlm_cleanup(ldlm_side_t client, int force)
 #endif
         ENTRY;
 
-        if (!list_empty(&ldlm_namespace_list)) {
+        if (!list_empty(ldlm_namespace_list(LDLM_NAMESPACE_SERVER)) || 
+            !list_empty(ldlm_namespace_list(LDLM_NAMESPACE_CLIENT))) {
                 CERROR("ldlm still has namespaces; clean these up first.\n");
-                ldlm_dump_all_namespaces(D_DLMTRACE);
+                ldlm_dump_all_namespaces(LDLM_NAMESPACE_SERVER, D_DLMTRACE);
+                ldlm_dump_all_namespaces(LDLM_NAMESPACE_CLIENT, D_DLMTRACE);
                 RETURN(-EBUSY);
         }
 
@@ -1892,7 +1893,8 @@ static int ldlm_cleanup(ldlm_side_t client, int force)
 int __init ldlm_init(void)
 {
         init_mutex(&ldlm_ref_sem);
-        init_mutex(&ldlm_namespace_lock);
+        init_mutex(ldlm_namespace_lock(LDLM_NAMESPACE_SERVER));
+        init_mutex(ldlm_namespace_lock(LDLM_NAMESPACE_CLIENT));
         ldlm_resource_slab = cfs_mem_cache_create("ldlm_resources",
                                                sizeof(struct ldlm_resource), 0,
                                                SLAB_HWCACHE_ALIGN);
diff --git a/lustre/ldlm/ldlm_pool.c b/lustre/ldlm/ldlm_pool.c
index 4a53927dd4f1a482a16fabc681ee516cba900c76..35840bfeecf5205786054869312262fc0da8479a 100644
--- a/lustre/ldlm/ldlm_pool.c
+++ b/lustre/ldlm/ldlm_pool.c
@@ -114,11 +114,6 @@
 extern cfs_proc_dir_entry_t *ldlm_ns_proc_dir;
 #endif
 
-extern atomic_t ldlm_srv_namespace_nr;
-extern atomic_t ldlm_cli_namespace_nr;
-extern struct list_head ldlm_namespace_list;
-extern struct semaphore ldlm_namespace_lock;
-
 #define avg(src, add) \
         ((src) = ((src) + (add)) / 2)
 
@@ -707,7 +702,8 @@ static int ldlm_pool_granted(struct ldlm_pool *pl)
 }
 
 static struct ptlrpc_thread *ldlm_pools_thread;
-static struct shrinker *ldlm_pools_shrinker;
+static struct shrinker *ldlm_pools_srv_shrinker;
+static struct shrinker *ldlm_pools_cli_shrinker;
 static struct completion ldlm_pools_comp;
 
 void ldlm_pools_wakeup(void)
@@ -724,7 +720,8 @@ EXPORT_SYMBOL(ldlm_pools_wakeup);
 /* Cancel @nr locks from all namespaces (if possible). Returns number of
  * cached locks after shrink is finished. All namespaces are asked to
  * cancel approximately equal amount of locks. */
-int ldlm_pools_shrink(int nr, unsigned int gfp_mask)
+static int ldlm_pools_shrink(ldlm_side_t client, int nr, 
+                             unsigned int gfp_mask)
 {
         struct ldlm_namespace *ns;
         int total = 0, cached = 0;
@@ -732,45 +729,57 @@ int ldlm_pools_shrink(int nr, unsigned int gfp_mask)
         if (nr != 0 && !(gfp_mask & __GFP_FS))
                 return -1;
 
-        CDEBUG(D_DLMTRACE, "request to shrink %d locks from all pools\n",
-               nr);
-        mutex_down(&ldlm_namespace_lock);
-        list_for_each_entry(ns, &ldlm_namespace_list, ns_list_chain)
+        CDEBUG(D_DLMTRACE, "request to shrink %d %s locks from all pools\n",
+               nr, client == LDLM_NAMESPACE_CLIENT ? "client" : "server");
+
+        if (down_trylock(ldlm_namespace_lock(client)))
+                return nr != 0 ? -1 : 0;
+
+        list_for_each_entry(ns, ldlm_namespace_list(client), ns_list_chain)
                 total += ldlm_pool_granted(&ns->ns_pool);
 
         if (nr == 0) {
-                mutex_up(&ldlm_namespace_lock);
+                mutex_up(ldlm_namespace_lock(client));
                 return total;
         }
 
         /* Check all namespaces. */
-        list_for_each_entry(ns, &ldlm_namespace_list, ns_list_chain) {
+        list_for_each_entry(ns, ldlm_namespace_list(client), ns_list_chain) {
                 struct ldlm_pool *pl = &ns->ns_pool;
                 int cancel, nr_locks;
 
                 nr_locks = ldlm_pool_granted(&ns->ns_pool);
                 cancel = 1 + nr_locks * nr / total;
-                cancel = ldlm_pool_shrink(pl, cancel, gfp_mask);
+                ldlm_pool_shrink(pl, cancel, gfp_mask);
                 cached += ldlm_pool_granted(&ns->ns_pool);
         }
-        mutex_up(&ldlm_namespace_lock);
+        mutex_up(ldlm_namespace_lock(client));
         return cached;
 }
-EXPORT_SYMBOL(ldlm_pools_shrink);
 
-void ldlm_pools_recalc(void)
+static int ldlm_pools_srv_shrink(int nr, unsigned int gfp_mask)
+{
+        return ldlm_pools_shrink(LDLM_NAMESPACE_SERVER, nr, gfp_mask);
+}
+
+static int ldlm_pools_cli_shrink(int nr, unsigned int gfp_mask)
+{
+        return ldlm_pools_shrink(LDLM_NAMESPACE_CLIENT, nr, gfp_mask);
+}
+
+void ldlm_pools_recalc(ldlm_side_t client)
 {
         __u32 nr_l = 0, nr_p = 0, l;
         struct ldlm_namespace *ns;
         int rc, equal = 0;
 
         /* Check all modest namespaces. */
-        mutex_down(&ldlm_namespace_lock);
-        list_for_each_entry(ns, &ldlm_namespace_list, ns_list_chain) {
+        mutex_down(ldlm_namespace_lock(client));
+        list_for_each_entry(ns, ldlm_namespace_list(client), ns_list_chain) {
                 if (ns->ns_appetite != LDLM_NAMESPACE_MODEST)
                         continue;
 
-                if (ns->ns_client == LDLM_NAMESPACE_SERVER) {
+                if (client == LDLM_NAMESPACE_SERVER) {
                         l = ldlm_pool_granted(&ns->ns_pool);
                         if (l == 0)
                                 l = 1;
@@ -798,22 +807,22 @@ void ldlm_pools_recalc(void)
         }
 
         /* The rest is given to greedy namespaces. */
-        list_for_each_entry(ns, &ldlm_namespace_list, ns_list_chain) {
+        list_for_each_entry(ns, ldlm_namespace_list(client), ns_list_chain) {
                 if (!equal && ns->ns_appetite != LDLM_NAMESPACE_GREEDY)
                         continue;
 
-                if (ns->ns_client == LDLM_NAMESPACE_SERVER) {
+                if (client == LDLM_NAMESPACE_SERVER) {
                         if (equal) {
                                 /* In the case 2/3 locks are eaten out by
                                  * modest pools, we re-setup equal limit
                                  * for _all_ pools. */
                                 l = LDLM_POOL_HOST_L /
-                                        atomic_read(&ldlm_srv_namespace_nr);
+                                        atomic_read(ldlm_namespace_nr(client));
                         } else {
                                 /* All the rest of greedy pools will have
                                  * all locks in equal parts.*/
                                 l = (LDLM_POOL_HOST_L - nr_l) /
-                                        (atomic_read(&ldlm_srv_namespace_nr) -
+                                        (atomic_read(ldlm_namespace_nr(client)) -
                                          nr_p);
                         }
                         ldlm_pool_setup(&ns->ns_pool, l);
@@ -825,7 +834,7 @@ void ldlm_pools_recalc(void)
                         CERROR("%s: pool recalculation error "
                                "%d\n", ns->ns_pool.pl_name, rc);
         }
-        mutex_up(&ldlm_namespace_lock);
+        mutex_up(ldlm_namespace_lock(client));
 }
 EXPORT_SYMBOL(ldlm_pools_recalc);
 
@@ -846,7 +855,8 @@ static int ldlm_pools_thread_main(void *arg)
                 struct l_wait_info lwi;
 
                 /* Recal all pools on this tick. */
-                ldlm_pools_recalc();
+                ldlm_pools_recalc(LDLM_NAMESPACE_CLIENT);
+                ldlm_pools_recalc(LDLM_NAMESPACE_SERVER);
                 
                 /* Wait until the next check time, or until we're
                  * stopped. */
@@ -933,18 +943,25 @@ int ldlm_pools_init(ldlm_side_t client)
         ENTRY;
 
         rc = ldlm_pools_thread_start(client);
-        if (rc == 0)
-                ldlm_pools_shrinker = set_shrinker(DEFAULT_SEEKS,
-                                                   ldlm_pools_shrink);
+        if (rc == 0) {
+                ldlm_pools_srv_shrinker = set_shrinker(DEFAULT_SEEKS,
+                                                       ldlm_pools_srv_shrink);
+                ldlm_pools_cli_shrinker = set_shrinker(DEFAULT_SEEKS,
+                                                       ldlm_pools_cli_shrink);
+        }
         RETURN(rc);
 }
 EXPORT_SYMBOL(ldlm_pools_init);
 
 void ldlm_pools_fini(void)
 {
-        if (ldlm_pools_shrinker != NULL) {
-                remove_shrinker(ldlm_pools_shrinker);
-                ldlm_pools_shrinker = NULL;
+        if (ldlm_pools_srv_shrinker != NULL) {
+                remove_shrinker(ldlm_pools_srv_shrinker);
+                ldlm_pools_srv_shrinker = NULL;
+        }
+        if (ldlm_pools_cli_shrinker != NULL) {
+                remove_shrinker(ldlm_pools_cli_shrinker);
+                ldlm_pools_cli_shrinker = NULL;
         }
         ldlm_pools_thread_stop();
 }
@@ -1038,7 +1055,7 @@ void ldlm_pools_wakeup(void)
 }
 EXPORT_SYMBOL(ldlm_pools_wakeup);
 
-void ldlm_pools_recalc(void)
+void ldlm_pools_recalc(ldlm_side_t client)
 {
         return;
 }
diff --git a/lustre/ldlm/ldlm_request.c b/lustre/ldlm/ldlm_request.c
index 6a78cd29f362cd5df5fae5a8c451ed05bc79bd3f..651dfd189369967f3b78470b4e7c4f0d41d8e7a8 100644
--- a/lustre/ldlm/ldlm_request.c
+++ b/lustre/ldlm/ldlm_request.c
@@ -1421,12 +1421,7 @@ int ldlm_cli_join_lru(struct ldlm_namespace *ns,
                     !lock->l_readers && !lock->l_writers &&
                     !(lock->l_flags & LDLM_FL_LOCAL) &&
                     !(lock->l_flags & LDLM_FL_CBPENDING)) {
-                        lock->l_last_used = cfs_time_current();
-                        spin_lock(&ns->ns_unused_lock);
-                        LASSERT(ns->ns_nr_unused >= 0);
-                        list_add_tail(&lock->l_lru, &ns->ns_unused_list);
-                        ns->ns_nr_unused++;
-                        spin_unlock(&ns->ns_unused_lock);
+                        ldlm_lock_add_to_lru(lock);
                         lock->l_flags &= ~LDLM_FL_NO_LRU;
                         LDLM_DEBUG(lock, "join lock to lru");
                         count++;
diff --git a/lustre/ldlm/ldlm_resource.c b/lustre/ldlm/ldlm_resource.c
index 78ad0859a3df37dbda8e87bf901097bb01359c97..af7c34ec49e27be195a4574a92a08e91324c81fc 100644
--- a/lustre/ldlm/ldlm_resource.c
+++ b/lustre/ldlm/ldlm_resource.c
@@ -38,8 +38,15 @@ cfs_mem_cache_t *ldlm_resource_slab, *ldlm_lock_slab;
 
 atomic_t ldlm_srv_namespace_nr = ATOMIC_INIT(0);
 atomic_t ldlm_cli_namespace_nr = ATOMIC_INIT(0);
-struct semaphore ldlm_namespace_lock;
-struct list_head ldlm_namespace_list = CFS_LIST_HEAD_INIT(ldlm_namespace_list);
+
+struct semaphore ldlm_srv_namespace_lock;
+struct list_head ldlm_srv_namespace_list = 
+        CFS_LIST_HEAD_INIT(ldlm_srv_namespace_list);
+
+struct semaphore ldlm_cli_namespace_lock;
+struct list_head ldlm_cli_namespace_list = 
+        CFS_LIST_HEAD_INIT(ldlm_cli_namespace_list);
+
 cfs_proc_dir_entry_t *ldlm_type_proc_dir = NULL;
 cfs_proc_dir_entry_t *ldlm_ns_proc_dir = NULL;
 cfs_proc_dir_entry_t *ldlm_svc_proc_dir = NULL;
@@ -48,7 +55,8 @@ cfs_proc_dir_entry_t *ldlm_svc_proc_dir = NULL;
 static int ldlm_proc_dump_ns(struct file *file, const char *buffer,
                              unsigned long count, void *data)
 {
-        ldlm_dump_all_namespaces(D_DLMTRACE);
+        ldlm_dump_all_namespaces(LDLM_NAMESPACE_SERVER, D_DLMTRACE);
+        ldlm_dump_all_namespaces(LDLM_NAMESPACE_CLIENT, D_DLMTRACE);
         RETURN(count);
 }
 
@@ -253,12 +261,6 @@ void ldlm_proc_namespace(struct ldlm_namespace *ns)
 #define ldlm_proc_namespace(ns) do {} while (0)
 #endif /* LPROCFS */
 
-static atomic_t *ldlm_namespace_nr(ldlm_side_t client)
-{
-        return client == LDLM_NAMESPACE_SERVER ? 
-                &ldlm_srv_namespace_nr : &ldlm_cli_namespace_nr;
-}
-
 struct ldlm_namespace *ldlm_namespace_new(char *name, ldlm_side_t client, 
                                           ldlm_appetite_t apt)
 {
@@ -310,11 +312,11 @@ struct ldlm_namespace *ldlm_namespace_new(char *name, ldlm_side_t client,
         spin_lock_init(&ns->ns_unused_lock);
 
         ns->ns_connect_flags = 0;
-        mutex_down(&ldlm_namespace_lock);
-        list_add(&ns->ns_list_chain, &ldlm_namespace_list);
+        mutex_down(ldlm_namespace_lock(client));
+        list_add(&ns->ns_list_chain, ldlm_namespace_list(client));
         idx = atomic_read(ldlm_namespace_nr(client));
         atomic_inc(ldlm_namespace_nr(client));
-        mutex_up(&ldlm_namespace_lock);
+        mutex_up(ldlm_namespace_lock(client));
         
         ldlm_proc_namespace(ns);
         
@@ -326,10 +328,10 @@ struct ldlm_namespace *ldlm_namespace_new(char *name, ldlm_side_t client,
         RETURN(ns);
 
 out_del:
-        mutex_down(&ldlm_namespace_lock);
+        mutex_down(ldlm_namespace_lock(client));
         list_del(&ns->ns_list_chain);
         atomic_dec(ldlm_namespace_nr(client));
-        mutex_up(&ldlm_namespace_lock);
+        mutex_up(ldlm_namespace_lock(client));
 out_hash:
         POISON(ns->ns_hash, 0x5a, sizeof(*ns->ns_hash) * RES_HASH_SIZE);
         OBD_VFREE(ns->ns_hash, sizeof(*ns->ns_hash) * RES_HASH_SIZE);
@@ -471,11 +473,11 @@ int ldlm_namespace_free_prior(struct ldlm_namespace *ns)
         if (!ns)
                 RETURN(ELDLM_OK);
 
-        mutex_down(&ldlm_namespace_lock);
+        mutex_down(ldlm_namespace_lock(ns->ns_client));
         list_del(&ns->ns_list_chain);
         atomic_dec(ldlm_namespace_nr(ns->ns_client));
         ldlm_pool_fini(&ns->ns_pool);
-        mutex_up(&ldlm_namespace_lock);
+        mutex_up(ldlm_namespace_lock(ns->ns_client));
 
         /* At shutdown time, don't call the cancellation callback */
         ldlm_namespace_cleanup(ns, 0);
@@ -862,22 +864,22 @@ void ldlm_res2desc(struct ldlm_resource *res, struct ldlm_resource_desc *desc)
         desc->lr_name = res->lr_name;
 }
 
-void ldlm_dump_all_namespaces(int level)
+void ldlm_dump_all_namespaces(int level, ldlm_side_t client)
 {
         struct list_head *tmp;
 
         if (!((libcfs_debug | D_ERROR) & level))
                 return;
 
-        mutex_down(&ldlm_namespace_lock);
+        mutex_down(ldlm_namespace_lock(client));
 
-        list_for_each(tmp, &ldlm_namespace_list) {
+        list_for_each(tmp, ldlm_namespace_list(client)) {
                 struct ldlm_namespace *ns;
                 ns = list_entry(tmp, struct ldlm_namespace, ns_list_chain);
                 ldlm_namespace_dump(level, ns);
         }
 
-        mutex_up(&ldlm_namespace_lock);
+        mutex_up(ldlm_namespace_lock(client));
 }
 
 void ldlm_namespace_dump(int level, struct ldlm_namespace *ns)