-static int lprocfs_rd_ns_resources(char *page, char **start, off_t off,
- int count, int *eof, void *data)
-{
- struct ldlm_namespace *ns = data;
- __u64 res = 0;
- cfs_hash_bd_t bd;
- int i;
-
- /* result is not strictly consistant */
- cfs_hash_for_each_bucket(ns->ns_rs_hash, &bd, i)
- res += cfs_hash_bd_count_get(&bd);
- return lprocfs_rd_u64(page, start, off, count, eof, &res);
-}
-
-static int lprocfs_rd_ns_locks(char *page, char **start, off_t off,
- int count, int *eof, void *data)
-{
- struct ldlm_namespace *ns = data;
- __u64 locks;
-
- locks = lprocfs_stats_collector(ns->ns_stats, LDLM_NSS_LOCKS,
- LPROCFS_FIELDS_FLAGS_SUM);
- return lprocfs_rd_u64(page, start, off, count, eof, &locks);
-}
-
-static int lprocfs_rd_lru_size(char *page, char **start, off_t off,
- int count, int *eof, void *data)
-{
- struct ldlm_namespace *ns = data;
- __u32 *nr = &ns->ns_max_unused;
-
- if (ns_connect_lru_resize(ns))
- nr = &ns->ns_nr_unused;
- return lprocfs_rd_uint(page, start, off, count, eof, nr);
-}
-
-static int lprocfs_wr_lru_size(struct file *file, const char *buffer,
- unsigned long count, void *data)
-{
- struct ldlm_namespace *ns = data;
- char dummy[MAX_STRING_SIZE + 1], *end;
- unsigned long tmp;
- int lru_resize;
-
- dummy[MAX_STRING_SIZE] = '\0';
- if (cfs_copy_from_user(dummy, buffer, MAX_STRING_SIZE))
- return -EFAULT;
-
- if (strncmp(dummy, "clear", 5) == 0) {
- CDEBUG(D_DLMTRACE,
- "dropping all unused locks from namespace %s\n",
- ldlm_ns_name(ns));
- if (ns_connect_lru_resize(ns)) {
- int canceled, unused = ns->ns_nr_unused;
-
- /* Try to cancel all @ns_nr_unused locks. */
- canceled = ldlm_cancel_lru(ns, unused, LDLM_SYNC,
- LDLM_CANCEL_PASSED);
- if (canceled < unused) {
- CDEBUG(D_DLMTRACE,
- "not all requested locks are canceled, "
- "requested: %d, canceled: %d\n", unused,
- canceled);
- return -EINVAL;
- }
- } else {
- tmp = ns->ns_max_unused;
- ns->ns_max_unused = 0;
- ldlm_cancel_lru(ns, 0, LDLM_SYNC, LDLM_CANCEL_PASSED);
- ns->ns_max_unused = tmp;
- }
- return count;
- }
-
- tmp = simple_strtoul(dummy, &end, 0);
- if (dummy == end) {
- CERROR("invalid value written\n");
- return -EINVAL;
- }
- lru_resize = (tmp == 0);
-
- if (ns_connect_lru_resize(ns)) {
- if (!lru_resize)
- ns->ns_max_unused = (unsigned int)tmp;
-
- if (tmp > ns->ns_nr_unused)
- tmp = ns->ns_nr_unused;
- tmp = ns->ns_nr_unused - tmp;
-
- CDEBUG(D_DLMTRACE,
- "changing namespace %s unused locks from %u to %u\n",
- ldlm_ns_name(ns), ns->ns_nr_unused,
- (unsigned int)tmp);
- ldlm_cancel_lru(ns, tmp, LDLM_ASYNC, LDLM_CANCEL_PASSED);
-
- if (!lru_resize) {
- CDEBUG(D_DLMTRACE,
- "disable lru_resize for namespace %s\n",
- ldlm_ns_name(ns));
- ns->ns_connect_flags &= ~OBD_CONNECT_LRU_RESIZE;
- }
- } else {
- CDEBUG(D_DLMTRACE,
- "changing namespace %s max_unused from %u to %u\n",
- ldlm_ns_name(ns), ns->ns_max_unused,
- (unsigned int)tmp);
- ns->ns_max_unused = (unsigned int)tmp;
- ldlm_cancel_lru(ns, 0, LDLM_ASYNC, LDLM_CANCEL_PASSED);
-
- /* Make sure that originally lru resize was supported before
- * turning it on here. */
- if (lru_resize &&
- (ns->ns_orig_connect_flags & OBD_CONNECT_LRU_RESIZE)) {
- CDEBUG(D_DLMTRACE,
- "enable lru_resize for namespace %s\n",
- ldlm_ns_name(ns));
- ns->ns_connect_flags |= OBD_CONNECT_LRU_RESIZE;
- }
- }
-
- return count;
-}
-
-void ldlm_namespace_proc_unregister(struct ldlm_namespace *ns)
-{
- struct proc_dir_entry *dir;
-
- dir = lprocfs_srch(ldlm_ns_proc_dir, ldlm_ns_name(ns));
- if (dir == NULL) {
- CERROR("dlm namespace %s has no procfs dir?\n",
- ldlm_ns_name(ns));
- } else {
- lprocfs_remove(&dir);
- }
-
- if (ns->ns_stats != NULL)
- lprocfs_free_stats(&ns->ns_stats);
-}
-
-int ldlm_namespace_proc_register(struct ldlm_namespace *ns)
-{
- struct lprocfs_vars lock_vars[2];
- char lock_name[MAX_STRING_SIZE + 1];
-
- LASSERT(ns != NULL);
- LASSERT(ns->ns_rs_hash != NULL);
-
- ns->ns_stats = lprocfs_alloc_stats(LDLM_NSS_LAST, 0);
- if (ns->ns_stats == NULL)
- return -ENOMEM;
-
- lprocfs_counter_init(ns->ns_stats, LDLM_NSS_LOCKS,
- LPROCFS_CNTR_AVGMINMAX, "locks", "locks");
-
- lock_name[MAX_STRING_SIZE] = '\0';
-
- memset(lock_vars, 0, sizeof(lock_vars));
- lock_vars[0].name = lock_name;
-
- snprintf(lock_name, MAX_STRING_SIZE, "%s/resource_count",
- ldlm_ns_name(ns));
- lock_vars[0].data = ns;
- lock_vars[0].read_fptr = lprocfs_rd_ns_resources;
- lprocfs_add_vars(ldlm_ns_proc_dir, lock_vars, 0);
-
- snprintf(lock_name, MAX_STRING_SIZE, "%s/lock_count",
- ldlm_ns_name(ns));
- lock_vars[0].data = ns;
- lock_vars[0].read_fptr = lprocfs_rd_ns_locks;
- lprocfs_add_vars(ldlm_ns_proc_dir, lock_vars, 0);
-
- if (ns_is_client(ns)) {
- snprintf(lock_name, MAX_STRING_SIZE, "%s/lock_unused_count",
- ldlm_ns_name(ns));
- lock_vars[0].data = &ns->ns_nr_unused;
- lock_vars[0].read_fptr = lprocfs_rd_uint;
- lprocfs_add_vars(ldlm_ns_proc_dir, lock_vars, 0);
-
- snprintf(lock_name, MAX_STRING_SIZE, "%s/lru_size",
- ldlm_ns_name(ns));
- lock_vars[0].data = ns;
- lock_vars[0].read_fptr = lprocfs_rd_lru_size;
- lock_vars[0].write_fptr = lprocfs_wr_lru_size;
- lprocfs_add_vars(ldlm_ns_proc_dir, lock_vars, 0);
-
- snprintf(lock_name, MAX_STRING_SIZE, "%s/lru_max_age",
- ldlm_ns_name(ns));
- lock_vars[0].data = &ns->ns_max_age;
- lock_vars[0].read_fptr = lprocfs_rd_uint;
- lock_vars[0].write_fptr = lprocfs_wr_uint;
- lprocfs_add_vars(ldlm_ns_proc_dir, lock_vars, 0);
- } else {
- snprintf(lock_name, MAX_STRING_SIZE, "%s/ctime_age_limit",
- ldlm_ns_name(ns));
- lock_vars[0].data = &ns->ns_ctime_age_limit;
- lock_vars[0].read_fptr = lprocfs_rd_uint;
- lock_vars[0].write_fptr = lprocfs_wr_uint;
- lprocfs_add_vars(ldlm_ns_proc_dir, lock_vars, 0);
-
- snprintf(lock_name, MAX_STRING_SIZE, "%s/lock_timeouts",
- ldlm_ns_name(ns));
- lock_vars[0].data = &ns->ns_timeouts;
- lock_vars[0].read_fptr = lprocfs_rd_uint;
- lprocfs_add_vars(ldlm_ns_proc_dir, lock_vars, 0);
-
- snprintf(lock_name, MAX_STRING_SIZE, "%s/max_nolock_bytes",
- ldlm_ns_name(ns));
- lock_vars[0].data = &ns->ns_max_nolock_size;
- lock_vars[0].read_fptr = lprocfs_rd_uint;
- lock_vars[0].write_fptr = lprocfs_wr_uint;
- lprocfs_add_vars(ldlm_ns_proc_dir, lock_vars, 0);
-
- snprintf(lock_name, MAX_STRING_SIZE, "%s/contention_seconds",
- ldlm_ns_name(ns));
- lock_vars[0].data = &ns->ns_contention_time;
- lock_vars[0].read_fptr = lprocfs_rd_uint;
- lock_vars[0].write_fptr = lprocfs_wr_uint;
- lprocfs_add_vars(ldlm_ns_proc_dir, lock_vars, 0);
-
- snprintf(lock_name, MAX_STRING_SIZE, "%s/contended_locks",
- ldlm_ns_name(ns));
- lock_vars[0].data = &ns->ns_contended_locks;
- lock_vars[0].read_fptr = lprocfs_rd_uint;
- lock_vars[0].write_fptr = lprocfs_wr_uint;
- lprocfs_add_vars(ldlm_ns_proc_dir, lock_vars, 0);
-
- snprintf(lock_name, MAX_STRING_SIZE, "%s/max_parallel_ast",
- ldlm_ns_name(ns));
- lock_vars[0].data = &ns->ns_max_parallel_ast;
- lock_vars[0].read_fptr = lprocfs_rd_uint;
- lock_vars[0].write_fptr = lprocfs_wr_uint;
- lprocfs_add_vars(ldlm_ns_proc_dir, lock_vars, 0);
- }
- return 0;