+spinlock_t ldlm_namespace_lock = SPIN_LOCK_UNLOCKED;
+struct list_head ldlm_namespace_list = LIST_HEAD_INIT(ldlm_namespace_list);
+static struct proc_dir_entry *ldlm_ns_proc_dir = NULL;
+
+int ldlm_proc_setup(struct obd_device *obd)
+{
+ int rc;
+ ENTRY;
+ LASSERT(ldlm_ns_proc_dir == NULL);
+ LASSERT(obd != NULL);
+ rc = lprocfs_obd_attach(obd, 0);
+ if (rc) {
+ CERROR("LProcFS failed in ldlm-init\n");
+ RETURN(rc);
+ }
+ ldlm_ns_proc_dir = obd->obd_proc_entry;
+ RETURN(0);
+}
+
+void ldlm_proc_cleanup(struct obd_device *obd)
+{
+ if (ldlm_ns_proc_dir) {
+ lprocfs_obd_detach(obd);
+ ldlm_ns_proc_dir = NULL;
+ }
+}
+
+#ifdef __KERNEL__
+static int lprocfs_uint_rd(char *page, char **start, off_t off,
+ int count, int *eof, void *data)
+{
+ unsigned int *temp = (unsigned int *)data;
+ return snprintf(page, count, "%u\n", *temp);
+}
+
+
+#define MAX_STRING_SIZE 128
+void ldlm_proc_namespace(struct ldlm_namespace *ns)
+{
+ struct lprocfs_vars lock_vars[2];
+ char lock_name[MAX_STRING_SIZE + 1];
+
+ LASSERT(ns != NULL);
+ LASSERT(ns->ns_name != NULL);
+
+ lock_name[MAX_STRING_SIZE] = '\0';
+
+ memset(lock_vars, 0, sizeof(lock_vars));
+ lock_vars[0].read_fptr = lprocfs_rd_u64;
+
+ lock_vars[0].name = lock_name;
+
+ snprintf(lock_name, MAX_STRING_SIZE, "%s/resource_count", ns->ns_name);
+
+ lock_vars[0].data = &ns->ns_resources;
+ lprocfs_add_vars(ldlm_ns_proc_dir, lock_vars, 0);
+
+ snprintf(lock_name, MAX_STRING_SIZE, "%s/lock_count", ns->ns_name);
+
+ lock_vars[0].data = &ns->ns_locks;
+ lprocfs_add_vars(ldlm_ns_proc_dir, lock_vars, 0);
+
+ snprintf(lock_name, MAX_STRING_SIZE, "%s/lock_unused_count",
+ ns->ns_name);
+ lock_vars[0].data = &ns->ns_nr_unused;
+ lock_vars[0].read_fptr = lprocfs_uint_rd;
+ lprocfs_add_vars(ldlm_ns_proc_dir, lock_vars, 0);
+}
+#endif
+#undef MAX_STRING_SIZE
+
+#define LDLM_MAX_UNUSED 20