+ if (ldlm_svc_proc_dir) {
+ lprocfs_remove(ldlm_svc_proc_dir);
+ ldlm_svc_proc_dir = NULL;
+ }
+
+ if (ldlm_ns_proc_dir) {
+ lprocfs_remove(ldlm_ns_proc_dir);
+ ldlm_ns_proc_dir = NULL;
+ }
+
+ if (ldlm_type_proc_dir) {
+ lprocfs_remove(ldlm_type_proc_dir);
+ ldlm_type_proc_dir = NULL;
+ }
+}
+
+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);
+}
+
+static int lprocfs_read_lru_size(char *page, char **start, off_t off,
+ int count, int *eof, void *data)
+{
+ struct ldlm_namespace *ns = data;
+ return lprocfs_uint_rd(page, start, off, count, eof,
+ &ns->ns_max_unused);
+}
+
+#define MAX_STRING_SIZE 128
+static int lprocfs_write_lru_size(struct file *file, const char *buffer,
+ unsigned long count, void *data)
+{
+ struct ldlm_namespace *ns = data;
+ char dummy[MAX_STRING_SIZE + 1];
+ unsigned long tmp;
+
+ dummy[MAX_STRING_SIZE] = '\0';
+ copy_from_user(dummy, buffer, MAX_STRING_SIZE);
+
+ if (count == 6 && memcmp(dummy, "clear", 5) == 0) {
+ CDEBUG(D_DLMTRACE,
+ "dropping all unused locks from namespace %s\n",
+ ns->ns_name);
+ tmp = ns->ns_max_unused;
+ ns->ns_max_unused = 0;
+ ldlm_cancel_lru(ns);
+ ns->ns_max_unused = tmp;
+ return count;
+ }
+
+ tmp = simple_strtoul(dummy, NULL, 0);
+ CDEBUG(D_DLMTRACE, "changing namespace %s max_unused from %u to %u\n",
+ ns->ns_name, ns->ns_max_unused, (unsigned int)tmp);
+ ns->ns_max_unused = (unsigned int)tmp;
+
+ ldlm_cancel_lru(ns);
+
+ return count;
+}
+
+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);
+
+ if (ns->ns_client) {
+ 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);
+
+ snprintf(lock_name, MAX_STRING_SIZE, "%s/lru_size",
+ ns->ns_name);
+ lock_vars[0].data = ns;
+ lock_vars[0].read_fptr = lprocfs_read_lru_size;
+ lock_vars[0].write_fptr = lprocfs_write_lru_size;
+ lprocfs_add_vars(ldlm_ns_proc_dir, lock_vars, 0);
+ }