162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Documentation/ABI/stable/sysfs-fs-orangefs:
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * What:		/sys/fs/orangefs/perf_counter_reset
662306a36Sopenharmony_ci * Date:		June 2015
762306a36Sopenharmony_ci * Contact:		Mike Marshall <hubcap@omnibond.com>
862306a36Sopenharmony_ci * Description:
962306a36Sopenharmony_ci * 			echo a 0 or a 1 into perf_counter_reset to
1062306a36Sopenharmony_ci * 			reset all the counters in
1162306a36Sopenharmony_ci * 			/sys/fs/orangefs/perf_counters
1262306a36Sopenharmony_ci * 			except ones with PINT_PERF_PRESERVE set.
1362306a36Sopenharmony_ci *
1462306a36Sopenharmony_ci *
1562306a36Sopenharmony_ci * What:		/sys/fs/orangefs/perf_counters/...
1662306a36Sopenharmony_ci * Date:		Jun 2015
1762306a36Sopenharmony_ci * Contact:		Mike Marshall <hubcap@omnibond.com>
1862306a36Sopenharmony_ci * Description:
1962306a36Sopenharmony_ci * 			Counters and settings for various caches.
2062306a36Sopenharmony_ci * 			Read only.
2162306a36Sopenharmony_ci *
2262306a36Sopenharmony_ci *
2362306a36Sopenharmony_ci * What:		/sys/fs/orangefs/perf_time_interval_secs
2462306a36Sopenharmony_ci * Date:		Jun 2015
2562306a36Sopenharmony_ci * Contact:		Mike Marshall <hubcap@omnibond.com>
2662306a36Sopenharmony_ci * Description:
2762306a36Sopenharmony_ci *			Length of perf counter intervals in
2862306a36Sopenharmony_ci *			seconds.
2962306a36Sopenharmony_ci *
3062306a36Sopenharmony_ci *
3162306a36Sopenharmony_ci * What:		/sys/fs/orangefs/perf_history_size
3262306a36Sopenharmony_ci * Date:		Jun 2015
3362306a36Sopenharmony_ci * Contact:		Mike Marshall <hubcap@omnibond.com>
3462306a36Sopenharmony_ci * Description:
3562306a36Sopenharmony_ci * 			The perf_counters cache statistics have N, or
3662306a36Sopenharmony_ci * 			perf_history_size, samples. The default is
3762306a36Sopenharmony_ci * 			one.
3862306a36Sopenharmony_ci *
3962306a36Sopenharmony_ci *			Every perf_time_interval_secs the (first)
4062306a36Sopenharmony_ci *			samples are reset.
4162306a36Sopenharmony_ci *
4262306a36Sopenharmony_ci *			If N is greater than one, the "current" set
4362306a36Sopenharmony_ci *			of samples is reset, and the samples from the
4462306a36Sopenharmony_ci *			other N-1 intervals remain available.
4562306a36Sopenharmony_ci *
4662306a36Sopenharmony_ci *
4762306a36Sopenharmony_ci * What:		/sys/fs/orangefs/op_timeout_secs
4862306a36Sopenharmony_ci * Date:		Jun 2015
4962306a36Sopenharmony_ci * Contact:		Mike Marshall <hubcap@omnibond.com>
5062306a36Sopenharmony_ci * Description:
5162306a36Sopenharmony_ci *			Service operation timeout in seconds.
5262306a36Sopenharmony_ci *
5362306a36Sopenharmony_ci *
5462306a36Sopenharmony_ci * What:		/sys/fs/orangefs/slot_timeout_secs
5562306a36Sopenharmony_ci * Date:		Jun 2015
5662306a36Sopenharmony_ci * Contact:		Mike Marshall <hubcap@omnibond.com>
5762306a36Sopenharmony_ci * Description:
5862306a36Sopenharmony_ci *			"Slot" timeout in seconds. A "slot"
5962306a36Sopenharmony_ci *			is an indexed buffer in the shared
6062306a36Sopenharmony_ci *			memory segment used for communication
6162306a36Sopenharmony_ci *			between the kernel module and userspace.
6262306a36Sopenharmony_ci *			Slots are requested and waited for,
6362306a36Sopenharmony_ci *			the wait times out after slot_timeout_secs.
6462306a36Sopenharmony_ci *
6562306a36Sopenharmony_ci * What:		/sys/fs/orangefs/cache_timeout_msecs
6662306a36Sopenharmony_ci * Date:		Mar 2018
6762306a36Sopenharmony_ci * Contact:		Martin Brandenburg <martin@omnibond.com>
6862306a36Sopenharmony_ci * Description:
6962306a36Sopenharmony_ci *			Time in milliseconds between which
7062306a36Sopenharmony_ci *			orangefs_revalidate_mapping will invalidate the page
7162306a36Sopenharmony_ci *			cache.
7262306a36Sopenharmony_ci *
7362306a36Sopenharmony_ci * What:		/sys/fs/orangefs/dcache_timeout_msecs
7462306a36Sopenharmony_ci * Date:		Jul 2016
7562306a36Sopenharmony_ci * Contact:		Martin Brandenburg <martin@omnibond.com>
7662306a36Sopenharmony_ci * Description:
7762306a36Sopenharmony_ci *			Time lookup is valid in milliseconds.
7862306a36Sopenharmony_ci *
7962306a36Sopenharmony_ci * What:		/sys/fs/orangefs/getattr_timeout_msecs
8062306a36Sopenharmony_ci * Date:		Jul 2016
8162306a36Sopenharmony_ci * Contact:		Martin Brandenburg <martin@omnibond.com>
8262306a36Sopenharmony_ci * Description:
8362306a36Sopenharmony_ci *			Time getattr is valid in milliseconds.
8462306a36Sopenharmony_ci *
8562306a36Sopenharmony_ci * What:		/sys/fs/orangefs/readahead_count
8662306a36Sopenharmony_ci * Date:		Aug 2016
8762306a36Sopenharmony_ci * Contact:		Martin Brandenburg <martin@omnibond.com>
8862306a36Sopenharmony_ci * Description:
8962306a36Sopenharmony_ci *			Readahead cache buffer count.
9062306a36Sopenharmony_ci *
9162306a36Sopenharmony_ci * What:		/sys/fs/orangefs/readahead_size
9262306a36Sopenharmony_ci * Date:		Aug 2016
9362306a36Sopenharmony_ci * Contact:		Martin Brandenburg <martin@omnibond.com>
9462306a36Sopenharmony_ci * Description:
9562306a36Sopenharmony_ci *			Readahead cache buffer size.
9662306a36Sopenharmony_ci *
9762306a36Sopenharmony_ci * What:		/sys/fs/orangefs/readahead_count_size
9862306a36Sopenharmony_ci * Date:		Aug 2016
9962306a36Sopenharmony_ci * Contact:		Martin Brandenburg <martin@omnibond.com>
10062306a36Sopenharmony_ci * Description:
10162306a36Sopenharmony_ci *			Readahead cache buffer count and size.
10262306a36Sopenharmony_ci *
10362306a36Sopenharmony_ci * What:		/sys/fs/orangefs/readahead_readcnt
10462306a36Sopenharmony_ci * Date:		Jan 2017
10562306a36Sopenharmony_ci * Contact:		Martin Brandenburg <martin@omnibond.com>
10662306a36Sopenharmony_ci * Description:
10762306a36Sopenharmony_ci *			Number of buffers (in multiples of readahead_size)
10862306a36Sopenharmony_ci *			which can be read ahead for a single file at once.
10962306a36Sopenharmony_ci *
11062306a36Sopenharmony_ci * What:		/sys/fs/orangefs/acache/...
11162306a36Sopenharmony_ci * Date:		Jun 2015
11262306a36Sopenharmony_ci * Contact:		Martin Brandenburg <martin@omnibond.com>
11362306a36Sopenharmony_ci * Description:
11462306a36Sopenharmony_ci * 			Attribute cache configurable settings.
11562306a36Sopenharmony_ci *
11662306a36Sopenharmony_ci *
11762306a36Sopenharmony_ci * What:		/sys/fs/orangefs/ncache/...
11862306a36Sopenharmony_ci * Date:		Jun 2015
11962306a36Sopenharmony_ci * Contact:		Mike Marshall <hubcap@omnibond.com>
12062306a36Sopenharmony_ci * Description:
12162306a36Sopenharmony_ci * 			Name cache configurable settings.
12262306a36Sopenharmony_ci *
12362306a36Sopenharmony_ci *
12462306a36Sopenharmony_ci * What:		/sys/fs/orangefs/capcache/...
12562306a36Sopenharmony_ci * Date:		Jun 2015
12662306a36Sopenharmony_ci * Contact:		Mike Marshall <hubcap@omnibond.com>
12762306a36Sopenharmony_ci * Description:
12862306a36Sopenharmony_ci * 			Capability cache configurable settings.
12962306a36Sopenharmony_ci *
13062306a36Sopenharmony_ci *
13162306a36Sopenharmony_ci * What:		/sys/fs/orangefs/ccache/...
13262306a36Sopenharmony_ci * Date:		Jun 2015
13362306a36Sopenharmony_ci * Contact:		Mike Marshall <hubcap@omnibond.com>
13462306a36Sopenharmony_ci * Description:
13562306a36Sopenharmony_ci * 			Credential cache configurable settings.
13662306a36Sopenharmony_ci *
13762306a36Sopenharmony_ci */
13862306a36Sopenharmony_ci
13962306a36Sopenharmony_ci#include <linux/fs.h>
14062306a36Sopenharmony_ci#include <linux/kobject.h>
14162306a36Sopenharmony_ci#include <linux/string.h>
14262306a36Sopenharmony_ci#include <linux/sysfs.h>
14362306a36Sopenharmony_ci#include <linux/module.h>
14462306a36Sopenharmony_ci#include <linux/init.h>
14562306a36Sopenharmony_ci
14662306a36Sopenharmony_ci#include "protocol.h"
14762306a36Sopenharmony_ci#include "orangefs-kernel.h"
14862306a36Sopenharmony_ci#include "orangefs-sysfs.h"
14962306a36Sopenharmony_ci
15062306a36Sopenharmony_ci#define ORANGEFS_KOBJ_ID "orangefs"
15162306a36Sopenharmony_ci#define ACACHE_KOBJ_ID "acache"
15262306a36Sopenharmony_ci#define CAPCACHE_KOBJ_ID "capcache"
15362306a36Sopenharmony_ci#define CCACHE_KOBJ_ID "ccache"
15462306a36Sopenharmony_ci#define NCACHE_KOBJ_ID "ncache"
15562306a36Sopenharmony_ci#define PC_KOBJ_ID "pc"
15662306a36Sopenharmony_ci#define STATS_KOBJ_ID "stats"
15762306a36Sopenharmony_ci
15862306a36Sopenharmony_ci/*
15962306a36Sopenharmony_ci * Every item calls orangefs_attr_show and orangefs_attr_store through
16062306a36Sopenharmony_ci * orangefs_sysfs_ops. They look at the orangefs_attributes further below to
16162306a36Sopenharmony_ci * call one of sysfs_int_show, sysfs_int_store, sysfs_service_op_show, or
16262306a36Sopenharmony_ci * sysfs_service_op_store.
16362306a36Sopenharmony_ci */
16462306a36Sopenharmony_ci
16562306a36Sopenharmony_cistruct orangefs_attribute {
16662306a36Sopenharmony_ci	struct attribute attr;
16762306a36Sopenharmony_ci	ssize_t (*show)(struct kobject *kobj,
16862306a36Sopenharmony_ci			struct orangefs_attribute *attr,
16962306a36Sopenharmony_ci			char *buf);
17062306a36Sopenharmony_ci	ssize_t (*store)(struct kobject *kobj,
17162306a36Sopenharmony_ci			 struct orangefs_attribute *attr,
17262306a36Sopenharmony_ci			 const char *buf,
17362306a36Sopenharmony_ci			 size_t count);
17462306a36Sopenharmony_ci};
17562306a36Sopenharmony_ci
17662306a36Sopenharmony_cistatic ssize_t orangefs_attr_show(struct kobject *kobj,
17762306a36Sopenharmony_ci				  struct attribute *attr,
17862306a36Sopenharmony_ci				  char *buf)
17962306a36Sopenharmony_ci{
18062306a36Sopenharmony_ci	struct orangefs_attribute *attribute;
18162306a36Sopenharmony_ci
18262306a36Sopenharmony_ci	attribute = container_of(attr, struct orangefs_attribute, attr);
18362306a36Sopenharmony_ci	if (!attribute->show)
18462306a36Sopenharmony_ci		return -EIO;
18562306a36Sopenharmony_ci	return attribute->show(kobj, attribute, buf);
18662306a36Sopenharmony_ci}
18762306a36Sopenharmony_ci
18862306a36Sopenharmony_cistatic ssize_t orangefs_attr_store(struct kobject *kobj,
18962306a36Sopenharmony_ci				   struct attribute *attr,
19062306a36Sopenharmony_ci				   const char *buf,
19162306a36Sopenharmony_ci				   size_t len)
19262306a36Sopenharmony_ci{
19362306a36Sopenharmony_ci	struct orangefs_attribute *attribute;
19462306a36Sopenharmony_ci
19562306a36Sopenharmony_ci	if (!strcmp(kobj->name, PC_KOBJ_ID) ||
19662306a36Sopenharmony_ci	    !strcmp(kobj->name, STATS_KOBJ_ID))
19762306a36Sopenharmony_ci		return -EPERM;
19862306a36Sopenharmony_ci
19962306a36Sopenharmony_ci	attribute = container_of(attr, struct orangefs_attribute, attr);
20062306a36Sopenharmony_ci	if (!attribute->store)
20162306a36Sopenharmony_ci		return -EIO;
20262306a36Sopenharmony_ci	return attribute->store(kobj, attribute, buf, len);
20362306a36Sopenharmony_ci}
20462306a36Sopenharmony_ci
20562306a36Sopenharmony_cistatic const struct sysfs_ops orangefs_sysfs_ops = {
20662306a36Sopenharmony_ci	.show = orangefs_attr_show,
20762306a36Sopenharmony_ci	.store = orangefs_attr_store,
20862306a36Sopenharmony_ci};
20962306a36Sopenharmony_ci
21062306a36Sopenharmony_cistatic ssize_t sysfs_int_show(struct kobject *kobj,
21162306a36Sopenharmony_ci    struct orangefs_attribute *attr, char *buf)
21262306a36Sopenharmony_ci{
21362306a36Sopenharmony_ci	int rc = -EIO;
21462306a36Sopenharmony_ci
21562306a36Sopenharmony_ci	gossip_debug(GOSSIP_SYSFS_DEBUG, "sysfs_int_show: id:%s:\n",
21662306a36Sopenharmony_ci	    kobj->name);
21762306a36Sopenharmony_ci
21862306a36Sopenharmony_ci	if (!strcmp(kobj->name, ORANGEFS_KOBJ_ID)) {
21962306a36Sopenharmony_ci		if (!strcmp(attr->attr.name, "op_timeout_secs")) {
22062306a36Sopenharmony_ci			rc = scnprintf(buf,
22162306a36Sopenharmony_ci				       PAGE_SIZE,
22262306a36Sopenharmony_ci				       "%d\n",
22362306a36Sopenharmony_ci				       op_timeout_secs);
22462306a36Sopenharmony_ci			goto out;
22562306a36Sopenharmony_ci		} else if (!strcmp(attr->attr.name,
22662306a36Sopenharmony_ci				   "slot_timeout_secs")) {
22762306a36Sopenharmony_ci			rc = scnprintf(buf,
22862306a36Sopenharmony_ci				       PAGE_SIZE,
22962306a36Sopenharmony_ci				       "%d\n",
23062306a36Sopenharmony_ci				       slot_timeout_secs);
23162306a36Sopenharmony_ci			goto out;
23262306a36Sopenharmony_ci		} else if (!strcmp(attr->attr.name,
23362306a36Sopenharmony_ci				   "cache_timeout_msecs")) {
23462306a36Sopenharmony_ci			rc = scnprintf(buf,
23562306a36Sopenharmony_ci				       PAGE_SIZE,
23662306a36Sopenharmony_ci				       "%d\n",
23762306a36Sopenharmony_ci				       orangefs_cache_timeout_msecs);
23862306a36Sopenharmony_ci			goto out;
23962306a36Sopenharmony_ci		} else if (!strcmp(attr->attr.name,
24062306a36Sopenharmony_ci				   "dcache_timeout_msecs")) {
24162306a36Sopenharmony_ci			rc = scnprintf(buf,
24262306a36Sopenharmony_ci				       PAGE_SIZE,
24362306a36Sopenharmony_ci				       "%d\n",
24462306a36Sopenharmony_ci				       orangefs_dcache_timeout_msecs);
24562306a36Sopenharmony_ci			goto out;
24662306a36Sopenharmony_ci		} else if (!strcmp(attr->attr.name,
24762306a36Sopenharmony_ci				   "getattr_timeout_msecs")) {
24862306a36Sopenharmony_ci			rc = scnprintf(buf,
24962306a36Sopenharmony_ci				       PAGE_SIZE,
25062306a36Sopenharmony_ci				       "%d\n",
25162306a36Sopenharmony_ci				       orangefs_getattr_timeout_msecs);
25262306a36Sopenharmony_ci			goto out;
25362306a36Sopenharmony_ci		} else {
25462306a36Sopenharmony_ci			goto out;
25562306a36Sopenharmony_ci		}
25662306a36Sopenharmony_ci
25762306a36Sopenharmony_ci	} else if (!strcmp(kobj->name, STATS_KOBJ_ID)) {
25862306a36Sopenharmony_ci		if (!strcmp(attr->attr.name, "reads")) {
25962306a36Sopenharmony_ci			rc = scnprintf(buf,
26062306a36Sopenharmony_ci				       PAGE_SIZE,
26162306a36Sopenharmony_ci				       "%lu\n",
26262306a36Sopenharmony_ci				       orangefs_stats.reads);
26362306a36Sopenharmony_ci			goto out;
26462306a36Sopenharmony_ci		} else if (!strcmp(attr->attr.name, "writes")) {
26562306a36Sopenharmony_ci			rc = scnprintf(buf,
26662306a36Sopenharmony_ci				       PAGE_SIZE,
26762306a36Sopenharmony_ci				       "%lu\n",
26862306a36Sopenharmony_ci				       orangefs_stats.writes);
26962306a36Sopenharmony_ci			goto out;
27062306a36Sopenharmony_ci		} else {
27162306a36Sopenharmony_ci			goto out;
27262306a36Sopenharmony_ci		}
27362306a36Sopenharmony_ci	}
27462306a36Sopenharmony_ci
27562306a36Sopenharmony_ciout:
27662306a36Sopenharmony_ci
27762306a36Sopenharmony_ci	return rc;
27862306a36Sopenharmony_ci}
27962306a36Sopenharmony_ci
28062306a36Sopenharmony_cistatic ssize_t sysfs_int_store(struct kobject *kobj,
28162306a36Sopenharmony_ci    struct orangefs_attribute *attr, const char *buf, size_t count)
28262306a36Sopenharmony_ci{
28362306a36Sopenharmony_ci	int rc = 0;
28462306a36Sopenharmony_ci
28562306a36Sopenharmony_ci	gossip_debug(GOSSIP_SYSFS_DEBUG,
28662306a36Sopenharmony_ci		     "sysfs_int_store: start attr->attr.name:%s: buf:%s:\n",
28762306a36Sopenharmony_ci		     attr->attr.name, buf);
28862306a36Sopenharmony_ci
28962306a36Sopenharmony_ci	if (!strcmp(attr->attr.name, "op_timeout_secs")) {
29062306a36Sopenharmony_ci		rc = kstrtoint(buf, 0, &op_timeout_secs);
29162306a36Sopenharmony_ci		goto out;
29262306a36Sopenharmony_ci	} else if (!strcmp(attr->attr.name, "slot_timeout_secs")) {
29362306a36Sopenharmony_ci		rc = kstrtoint(buf, 0, &slot_timeout_secs);
29462306a36Sopenharmony_ci		goto out;
29562306a36Sopenharmony_ci	} else if (!strcmp(attr->attr.name, "cache_timeout_msecs")) {
29662306a36Sopenharmony_ci		rc = kstrtoint(buf, 0, &orangefs_cache_timeout_msecs);
29762306a36Sopenharmony_ci		goto out;
29862306a36Sopenharmony_ci	} else if (!strcmp(attr->attr.name, "dcache_timeout_msecs")) {
29962306a36Sopenharmony_ci		rc = kstrtoint(buf, 0, &orangefs_dcache_timeout_msecs);
30062306a36Sopenharmony_ci		goto out;
30162306a36Sopenharmony_ci	} else if (!strcmp(attr->attr.name, "getattr_timeout_msecs")) {
30262306a36Sopenharmony_ci		rc = kstrtoint(buf, 0, &orangefs_getattr_timeout_msecs);
30362306a36Sopenharmony_ci		goto out;
30462306a36Sopenharmony_ci	} else {
30562306a36Sopenharmony_ci		goto out;
30662306a36Sopenharmony_ci	}
30762306a36Sopenharmony_ci
30862306a36Sopenharmony_ciout:
30962306a36Sopenharmony_ci	if (rc)
31062306a36Sopenharmony_ci		rc = -EINVAL;
31162306a36Sopenharmony_ci	else
31262306a36Sopenharmony_ci		rc = count;
31362306a36Sopenharmony_ci
31462306a36Sopenharmony_ci	return rc;
31562306a36Sopenharmony_ci}
31662306a36Sopenharmony_ci
31762306a36Sopenharmony_ci/*
31862306a36Sopenharmony_ci * obtain attribute values from userspace with a service operation.
31962306a36Sopenharmony_ci */
32062306a36Sopenharmony_cistatic ssize_t sysfs_service_op_show(struct kobject *kobj,
32162306a36Sopenharmony_ci    struct orangefs_attribute *attr, char *buf)
32262306a36Sopenharmony_ci{
32362306a36Sopenharmony_ci	struct orangefs_kernel_op_s *new_op = NULL;
32462306a36Sopenharmony_ci	int rc = 0;
32562306a36Sopenharmony_ci	char *ser_op_type = NULL;
32662306a36Sopenharmony_ci	__u32 op_alloc_type;
32762306a36Sopenharmony_ci
32862306a36Sopenharmony_ci	gossip_debug(GOSSIP_SYSFS_DEBUG,
32962306a36Sopenharmony_ci		     "sysfs_service_op_show: id:%s:\n",
33062306a36Sopenharmony_ci		     kobj->name);
33162306a36Sopenharmony_ci
33262306a36Sopenharmony_ci	if (strcmp(kobj->name, PC_KOBJ_ID))
33362306a36Sopenharmony_ci		op_alloc_type = ORANGEFS_VFS_OP_PARAM;
33462306a36Sopenharmony_ci	else
33562306a36Sopenharmony_ci		op_alloc_type = ORANGEFS_VFS_OP_PERF_COUNT;
33662306a36Sopenharmony_ci
33762306a36Sopenharmony_ci	new_op = op_alloc(op_alloc_type);
33862306a36Sopenharmony_ci	if (!new_op)
33962306a36Sopenharmony_ci		return -ENOMEM;
34062306a36Sopenharmony_ci
34162306a36Sopenharmony_ci	/* Can't do a service_operation if the client is not running... */
34262306a36Sopenharmony_ci	rc = is_daemon_in_service();
34362306a36Sopenharmony_ci	if (rc) {
34462306a36Sopenharmony_ci		pr_info_ratelimited("%s: Client not running :%d:\n",
34562306a36Sopenharmony_ci			__func__,
34662306a36Sopenharmony_ci			is_daemon_in_service());
34762306a36Sopenharmony_ci		goto out;
34862306a36Sopenharmony_ci	}
34962306a36Sopenharmony_ci
35062306a36Sopenharmony_ci	if (strcmp(kobj->name, PC_KOBJ_ID))
35162306a36Sopenharmony_ci		new_op->upcall.req.param.type = ORANGEFS_PARAM_REQUEST_GET;
35262306a36Sopenharmony_ci
35362306a36Sopenharmony_ci	if (!strcmp(kobj->name, ORANGEFS_KOBJ_ID)) {
35462306a36Sopenharmony_ci		/* Drop unsupported requests first. */
35562306a36Sopenharmony_ci		if (!(orangefs_features & ORANGEFS_FEATURE_READAHEAD) &&
35662306a36Sopenharmony_ci		    (!strcmp(attr->attr.name, "readahead_count") ||
35762306a36Sopenharmony_ci		    !strcmp(attr->attr.name, "readahead_size") ||
35862306a36Sopenharmony_ci		    !strcmp(attr->attr.name, "readahead_count_size") ||
35962306a36Sopenharmony_ci		    !strcmp(attr->attr.name, "readahead_readcnt"))) {
36062306a36Sopenharmony_ci			rc = -EINVAL;
36162306a36Sopenharmony_ci			goto out;
36262306a36Sopenharmony_ci		}
36362306a36Sopenharmony_ci
36462306a36Sopenharmony_ci		if (!strcmp(attr->attr.name, "perf_history_size"))
36562306a36Sopenharmony_ci			new_op->upcall.req.param.op =
36662306a36Sopenharmony_ci				ORANGEFS_PARAM_REQUEST_OP_PERF_HISTORY_SIZE;
36762306a36Sopenharmony_ci		else if (!strcmp(attr->attr.name,
36862306a36Sopenharmony_ci				 "perf_time_interval_secs"))
36962306a36Sopenharmony_ci			new_op->upcall.req.param.op =
37062306a36Sopenharmony_ci				ORANGEFS_PARAM_REQUEST_OP_PERF_TIME_INTERVAL_SECS;
37162306a36Sopenharmony_ci		else if (!strcmp(attr->attr.name,
37262306a36Sopenharmony_ci				 "perf_counter_reset"))
37362306a36Sopenharmony_ci			new_op->upcall.req.param.op =
37462306a36Sopenharmony_ci				ORANGEFS_PARAM_REQUEST_OP_PERF_RESET;
37562306a36Sopenharmony_ci
37662306a36Sopenharmony_ci		else if (!strcmp(attr->attr.name,
37762306a36Sopenharmony_ci				 "readahead_count"))
37862306a36Sopenharmony_ci			new_op->upcall.req.param.op =
37962306a36Sopenharmony_ci				ORANGEFS_PARAM_REQUEST_OP_READAHEAD_COUNT;
38062306a36Sopenharmony_ci
38162306a36Sopenharmony_ci		else if (!strcmp(attr->attr.name,
38262306a36Sopenharmony_ci				 "readahead_size"))
38362306a36Sopenharmony_ci			new_op->upcall.req.param.op =
38462306a36Sopenharmony_ci				ORANGEFS_PARAM_REQUEST_OP_READAHEAD_SIZE;
38562306a36Sopenharmony_ci
38662306a36Sopenharmony_ci		else if (!strcmp(attr->attr.name,
38762306a36Sopenharmony_ci				 "readahead_count_size"))
38862306a36Sopenharmony_ci			new_op->upcall.req.param.op =
38962306a36Sopenharmony_ci				ORANGEFS_PARAM_REQUEST_OP_READAHEAD_COUNT_SIZE;
39062306a36Sopenharmony_ci
39162306a36Sopenharmony_ci		else if (!strcmp(attr->attr.name,
39262306a36Sopenharmony_ci				 "readahead_readcnt"))
39362306a36Sopenharmony_ci			new_op->upcall.req.param.op =
39462306a36Sopenharmony_ci				ORANGEFS_PARAM_REQUEST_OP_READAHEAD_READCNT;
39562306a36Sopenharmony_ci	} else if (!strcmp(kobj->name, ACACHE_KOBJ_ID)) {
39662306a36Sopenharmony_ci		if (!strcmp(attr->attr.name, "timeout_msecs"))
39762306a36Sopenharmony_ci			new_op->upcall.req.param.op =
39862306a36Sopenharmony_ci				ORANGEFS_PARAM_REQUEST_OP_ACACHE_TIMEOUT_MSECS;
39962306a36Sopenharmony_ci
40062306a36Sopenharmony_ci		if (!strcmp(attr->attr.name, "hard_limit"))
40162306a36Sopenharmony_ci			new_op->upcall.req.param.op =
40262306a36Sopenharmony_ci				ORANGEFS_PARAM_REQUEST_OP_ACACHE_HARD_LIMIT;
40362306a36Sopenharmony_ci
40462306a36Sopenharmony_ci		if (!strcmp(attr->attr.name, "soft_limit"))
40562306a36Sopenharmony_ci			new_op->upcall.req.param.op =
40662306a36Sopenharmony_ci				ORANGEFS_PARAM_REQUEST_OP_ACACHE_SOFT_LIMIT;
40762306a36Sopenharmony_ci
40862306a36Sopenharmony_ci		if (!strcmp(attr->attr.name, "reclaim_percentage"))
40962306a36Sopenharmony_ci			new_op->upcall.req.param.op =
41062306a36Sopenharmony_ci			  ORANGEFS_PARAM_REQUEST_OP_ACACHE_RECLAIM_PERCENTAGE;
41162306a36Sopenharmony_ci
41262306a36Sopenharmony_ci	} else if (!strcmp(kobj->name, CAPCACHE_KOBJ_ID)) {
41362306a36Sopenharmony_ci		if (!strcmp(attr->attr.name, "timeout_secs"))
41462306a36Sopenharmony_ci			new_op->upcall.req.param.op =
41562306a36Sopenharmony_ci				ORANGEFS_PARAM_REQUEST_OP_CAPCACHE_TIMEOUT_SECS;
41662306a36Sopenharmony_ci
41762306a36Sopenharmony_ci		if (!strcmp(attr->attr.name, "hard_limit"))
41862306a36Sopenharmony_ci			new_op->upcall.req.param.op =
41962306a36Sopenharmony_ci				ORANGEFS_PARAM_REQUEST_OP_CAPCACHE_HARD_LIMIT;
42062306a36Sopenharmony_ci
42162306a36Sopenharmony_ci		if (!strcmp(attr->attr.name, "soft_limit"))
42262306a36Sopenharmony_ci			new_op->upcall.req.param.op =
42362306a36Sopenharmony_ci				ORANGEFS_PARAM_REQUEST_OP_CAPCACHE_SOFT_LIMIT;
42462306a36Sopenharmony_ci
42562306a36Sopenharmony_ci		if (!strcmp(attr->attr.name, "reclaim_percentage"))
42662306a36Sopenharmony_ci			new_op->upcall.req.param.op =
42762306a36Sopenharmony_ci			  ORANGEFS_PARAM_REQUEST_OP_CAPCACHE_RECLAIM_PERCENTAGE;
42862306a36Sopenharmony_ci
42962306a36Sopenharmony_ci	} else if (!strcmp(kobj->name, CCACHE_KOBJ_ID)) {
43062306a36Sopenharmony_ci		if (!strcmp(attr->attr.name, "timeout_secs"))
43162306a36Sopenharmony_ci			new_op->upcall.req.param.op =
43262306a36Sopenharmony_ci				ORANGEFS_PARAM_REQUEST_OP_CCACHE_TIMEOUT_SECS;
43362306a36Sopenharmony_ci
43462306a36Sopenharmony_ci		if (!strcmp(attr->attr.name, "hard_limit"))
43562306a36Sopenharmony_ci			new_op->upcall.req.param.op =
43662306a36Sopenharmony_ci				ORANGEFS_PARAM_REQUEST_OP_CCACHE_HARD_LIMIT;
43762306a36Sopenharmony_ci
43862306a36Sopenharmony_ci		if (!strcmp(attr->attr.name, "soft_limit"))
43962306a36Sopenharmony_ci			new_op->upcall.req.param.op =
44062306a36Sopenharmony_ci				ORANGEFS_PARAM_REQUEST_OP_CCACHE_SOFT_LIMIT;
44162306a36Sopenharmony_ci
44262306a36Sopenharmony_ci		if (!strcmp(attr->attr.name, "reclaim_percentage"))
44362306a36Sopenharmony_ci			new_op->upcall.req.param.op =
44462306a36Sopenharmony_ci			  ORANGEFS_PARAM_REQUEST_OP_CCACHE_RECLAIM_PERCENTAGE;
44562306a36Sopenharmony_ci
44662306a36Sopenharmony_ci	} else if (!strcmp(kobj->name, NCACHE_KOBJ_ID)) {
44762306a36Sopenharmony_ci		if (!strcmp(attr->attr.name, "timeout_msecs"))
44862306a36Sopenharmony_ci			new_op->upcall.req.param.op =
44962306a36Sopenharmony_ci				ORANGEFS_PARAM_REQUEST_OP_NCACHE_TIMEOUT_MSECS;
45062306a36Sopenharmony_ci
45162306a36Sopenharmony_ci		if (!strcmp(attr->attr.name, "hard_limit"))
45262306a36Sopenharmony_ci			new_op->upcall.req.param.op =
45362306a36Sopenharmony_ci				ORANGEFS_PARAM_REQUEST_OP_NCACHE_HARD_LIMIT;
45462306a36Sopenharmony_ci
45562306a36Sopenharmony_ci		if (!strcmp(attr->attr.name, "soft_limit"))
45662306a36Sopenharmony_ci			new_op->upcall.req.param.op =
45762306a36Sopenharmony_ci				ORANGEFS_PARAM_REQUEST_OP_NCACHE_SOFT_LIMIT;
45862306a36Sopenharmony_ci
45962306a36Sopenharmony_ci		if (!strcmp(attr->attr.name, "reclaim_percentage"))
46062306a36Sopenharmony_ci			new_op->upcall.req.param.op =
46162306a36Sopenharmony_ci			  ORANGEFS_PARAM_REQUEST_OP_NCACHE_RECLAIM_PERCENTAGE;
46262306a36Sopenharmony_ci
46362306a36Sopenharmony_ci	} else if (!strcmp(kobj->name, PC_KOBJ_ID)) {
46462306a36Sopenharmony_ci		if (!strcmp(attr->attr.name, ACACHE_KOBJ_ID))
46562306a36Sopenharmony_ci			new_op->upcall.req.perf_count.type =
46662306a36Sopenharmony_ci				ORANGEFS_PERF_COUNT_REQUEST_ACACHE;
46762306a36Sopenharmony_ci
46862306a36Sopenharmony_ci		if (!strcmp(attr->attr.name, CAPCACHE_KOBJ_ID))
46962306a36Sopenharmony_ci			new_op->upcall.req.perf_count.type =
47062306a36Sopenharmony_ci				ORANGEFS_PERF_COUNT_REQUEST_CAPCACHE;
47162306a36Sopenharmony_ci
47262306a36Sopenharmony_ci		if (!strcmp(attr->attr.name, NCACHE_KOBJ_ID))
47362306a36Sopenharmony_ci			new_op->upcall.req.perf_count.type =
47462306a36Sopenharmony_ci				ORANGEFS_PERF_COUNT_REQUEST_NCACHE;
47562306a36Sopenharmony_ci
47662306a36Sopenharmony_ci	} else {
47762306a36Sopenharmony_ci		gossip_err("sysfs_service_op_show: unknown kobj_id:%s:\n",
47862306a36Sopenharmony_ci			   kobj->name);
47962306a36Sopenharmony_ci		rc = -EINVAL;
48062306a36Sopenharmony_ci		goto out;
48162306a36Sopenharmony_ci	}
48262306a36Sopenharmony_ci
48362306a36Sopenharmony_ci
48462306a36Sopenharmony_ci	if (strcmp(kobj->name, PC_KOBJ_ID))
48562306a36Sopenharmony_ci		ser_op_type = "orangefs_param";
48662306a36Sopenharmony_ci	else
48762306a36Sopenharmony_ci		ser_op_type = "orangefs_perf_count";
48862306a36Sopenharmony_ci
48962306a36Sopenharmony_ci	/*
49062306a36Sopenharmony_ci	 * The service_operation will return an errno return code on
49162306a36Sopenharmony_ci	 * error, and zero on success.
49262306a36Sopenharmony_ci	 */
49362306a36Sopenharmony_ci	rc = service_operation(new_op, ser_op_type, ORANGEFS_OP_INTERRUPTIBLE);
49462306a36Sopenharmony_ci
49562306a36Sopenharmony_ciout:
49662306a36Sopenharmony_ci	if (!rc) {
49762306a36Sopenharmony_ci		if (strcmp(kobj->name, PC_KOBJ_ID)) {
49862306a36Sopenharmony_ci			if (new_op->upcall.req.param.op ==
49962306a36Sopenharmony_ci			    ORANGEFS_PARAM_REQUEST_OP_READAHEAD_COUNT_SIZE) {
50062306a36Sopenharmony_ci				rc = scnprintf(buf, PAGE_SIZE, "%d %d\n",
50162306a36Sopenharmony_ci				    (int)new_op->downcall.resp.param.u.
50262306a36Sopenharmony_ci				    value32[0],
50362306a36Sopenharmony_ci				    (int)new_op->downcall.resp.param.u.
50462306a36Sopenharmony_ci				    value32[1]);
50562306a36Sopenharmony_ci			} else {
50662306a36Sopenharmony_ci				rc = scnprintf(buf, PAGE_SIZE, "%d\n",
50762306a36Sopenharmony_ci				    (int)new_op->downcall.resp.param.u.value64);
50862306a36Sopenharmony_ci			}
50962306a36Sopenharmony_ci		} else {
51062306a36Sopenharmony_ci			rc = scnprintf(
51162306a36Sopenharmony_ci				buf,
51262306a36Sopenharmony_ci				PAGE_SIZE,
51362306a36Sopenharmony_ci				"%s",
51462306a36Sopenharmony_ci				new_op->downcall.resp.perf_count.buffer);
51562306a36Sopenharmony_ci		}
51662306a36Sopenharmony_ci	}
51762306a36Sopenharmony_ci
51862306a36Sopenharmony_ci	op_release(new_op);
51962306a36Sopenharmony_ci
52062306a36Sopenharmony_ci	return rc;
52162306a36Sopenharmony_ci
52262306a36Sopenharmony_ci}
52362306a36Sopenharmony_ci
52462306a36Sopenharmony_ci/*
52562306a36Sopenharmony_ci * pass attribute values back to userspace with a service operation.
52662306a36Sopenharmony_ci *
52762306a36Sopenharmony_ci * We have to do a memory allocation, an sscanf and a service operation.
52862306a36Sopenharmony_ci * And we have to evaluate what the user entered, to make sure the
52962306a36Sopenharmony_ci * value is within the range supported by the attribute. So, there's
53062306a36Sopenharmony_ci * a lot of return code checking and mapping going on here.
53162306a36Sopenharmony_ci *
53262306a36Sopenharmony_ci * We want to return 1 if we think everything went OK, and
53362306a36Sopenharmony_ci * EINVAL if not.
53462306a36Sopenharmony_ci */
53562306a36Sopenharmony_cistatic ssize_t sysfs_service_op_store(struct kobject *kobj,
53662306a36Sopenharmony_ci    struct orangefs_attribute *attr, const char *buf, size_t count)
53762306a36Sopenharmony_ci{
53862306a36Sopenharmony_ci	struct orangefs_kernel_op_s *new_op = NULL;
53962306a36Sopenharmony_ci	int val = 0;
54062306a36Sopenharmony_ci	int rc = 0;
54162306a36Sopenharmony_ci
54262306a36Sopenharmony_ci	gossip_debug(GOSSIP_SYSFS_DEBUG,
54362306a36Sopenharmony_ci		     "sysfs_service_op_store: id:%s:\n",
54462306a36Sopenharmony_ci		     kobj->name);
54562306a36Sopenharmony_ci
54662306a36Sopenharmony_ci	new_op = op_alloc(ORANGEFS_VFS_OP_PARAM);
54762306a36Sopenharmony_ci	if (!new_op)
54862306a36Sopenharmony_ci		return -EINVAL; /* sic */
54962306a36Sopenharmony_ci
55062306a36Sopenharmony_ci	/* Can't do a service_operation if the client is not running... */
55162306a36Sopenharmony_ci	rc = is_daemon_in_service();
55262306a36Sopenharmony_ci	if (rc) {
55362306a36Sopenharmony_ci		pr_info("%s: Client not running :%d:\n",
55462306a36Sopenharmony_ci			__func__,
55562306a36Sopenharmony_ci			is_daemon_in_service());
55662306a36Sopenharmony_ci		goto out;
55762306a36Sopenharmony_ci	}
55862306a36Sopenharmony_ci
55962306a36Sopenharmony_ci	/*
56062306a36Sopenharmony_ci	 * The value we want to send back to userspace is in buf, unless this
56162306a36Sopenharmony_ci	 * there are two parameters, which is specially handled below.
56262306a36Sopenharmony_ci	 */
56362306a36Sopenharmony_ci	if (strcmp(kobj->name, ORANGEFS_KOBJ_ID) ||
56462306a36Sopenharmony_ci	    strcmp(attr->attr.name, "readahead_count_size")) {
56562306a36Sopenharmony_ci		rc = kstrtoint(buf, 0, &val);
56662306a36Sopenharmony_ci		if (rc)
56762306a36Sopenharmony_ci			goto out;
56862306a36Sopenharmony_ci	}
56962306a36Sopenharmony_ci
57062306a36Sopenharmony_ci	new_op->upcall.req.param.type = ORANGEFS_PARAM_REQUEST_SET;
57162306a36Sopenharmony_ci
57262306a36Sopenharmony_ci	if (!strcmp(kobj->name, ORANGEFS_KOBJ_ID)) {
57362306a36Sopenharmony_ci		/* Drop unsupported requests first. */
57462306a36Sopenharmony_ci		if (!(orangefs_features & ORANGEFS_FEATURE_READAHEAD) &&
57562306a36Sopenharmony_ci		    (!strcmp(attr->attr.name, "readahead_count") ||
57662306a36Sopenharmony_ci		    !strcmp(attr->attr.name, "readahead_size") ||
57762306a36Sopenharmony_ci		    !strcmp(attr->attr.name, "readahead_count_size") ||
57862306a36Sopenharmony_ci		    !strcmp(attr->attr.name, "readahead_readcnt"))) {
57962306a36Sopenharmony_ci			rc = -EINVAL;
58062306a36Sopenharmony_ci			goto out;
58162306a36Sopenharmony_ci		}
58262306a36Sopenharmony_ci
58362306a36Sopenharmony_ci		if (!strcmp(attr->attr.name, "perf_history_size")) {
58462306a36Sopenharmony_ci			if (val > 0) {
58562306a36Sopenharmony_ci				new_op->upcall.req.param.op =
58662306a36Sopenharmony_ci				  ORANGEFS_PARAM_REQUEST_OP_PERF_HISTORY_SIZE;
58762306a36Sopenharmony_ci			} else {
58862306a36Sopenharmony_ci				rc = 0;
58962306a36Sopenharmony_ci				goto out;
59062306a36Sopenharmony_ci			}
59162306a36Sopenharmony_ci		} else if (!strcmp(attr->attr.name,
59262306a36Sopenharmony_ci				   "perf_time_interval_secs")) {
59362306a36Sopenharmony_ci			if (val > 0) {
59462306a36Sopenharmony_ci				new_op->upcall.req.param.op =
59562306a36Sopenharmony_ci				ORANGEFS_PARAM_REQUEST_OP_PERF_TIME_INTERVAL_SECS;
59662306a36Sopenharmony_ci			} else {
59762306a36Sopenharmony_ci				rc = 0;
59862306a36Sopenharmony_ci				goto out;
59962306a36Sopenharmony_ci			}
60062306a36Sopenharmony_ci		} else if (!strcmp(attr->attr.name,
60162306a36Sopenharmony_ci				   "perf_counter_reset")) {
60262306a36Sopenharmony_ci			if ((val == 0) || (val == 1)) {
60362306a36Sopenharmony_ci				new_op->upcall.req.param.op =
60462306a36Sopenharmony_ci					ORANGEFS_PARAM_REQUEST_OP_PERF_RESET;
60562306a36Sopenharmony_ci			} else {
60662306a36Sopenharmony_ci				rc = 0;
60762306a36Sopenharmony_ci				goto out;
60862306a36Sopenharmony_ci			}
60962306a36Sopenharmony_ci		} else if (!strcmp(attr->attr.name,
61062306a36Sopenharmony_ci				   "readahead_count")) {
61162306a36Sopenharmony_ci			if ((val >= 0)) {
61262306a36Sopenharmony_ci				new_op->upcall.req.param.op =
61362306a36Sopenharmony_ci				ORANGEFS_PARAM_REQUEST_OP_READAHEAD_COUNT;
61462306a36Sopenharmony_ci			} else {
61562306a36Sopenharmony_ci				rc = 0;
61662306a36Sopenharmony_ci				goto out;
61762306a36Sopenharmony_ci			}
61862306a36Sopenharmony_ci		} else if (!strcmp(attr->attr.name,
61962306a36Sopenharmony_ci				   "readahead_size")) {
62062306a36Sopenharmony_ci			if ((val >= 0)) {
62162306a36Sopenharmony_ci				new_op->upcall.req.param.op =
62262306a36Sopenharmony_ci				ORANGEFS_PARAM_REQUEST_OP_READAHEAD_SIZE;
62362306a36Sopenharmony_ci			} else {
62462306a36Sopenharmony_ci				rc = 0;
62562306a36Sopenharmony_ci				goto out;
62662306a36Sopenharmony_ci			}
62762306a36Sopenharmony_ci		} else if (!strcmp(attr->attr.name,
62862306a36Sopenharmony_ci				   "readahead_count_size")) {
62962306a36Sopenharmony_ci			int val1, val2;
63062306a36Sopenharmony_ci			rc = sscanf(buf, "%d %d", &val1, &val2);
63162306a36Sopenharmony_ci			if (rc < 2) {
63262306a36Sopenharmony_ci				rc = 0;
63362306a36Sopenharmony_ci				goto out;
63462306a36Sopenharmony_ci			}
63562306a36Sopenharmony_ci			if ((val1 >= 0) && (val2 >= 0)) {
63662306a36Sopenharmony_ci				new_op->upcall.req.param.op =
63762306a36Sopenharmony_ci				ORANGEFS_PARAM_REQUEST_OP_READAHEAD_COUNT_SIZE;
63862306a36Sopenharmony_ci			} else {
63962306a36Sopenharmony_ci				rc = 0;
64062306a36Sopenharmony_ci				goto out;
64162306a36Sopenharmony_ci			}
64262306a36Sopenharmony_ci			new_op->upcall.req.param.u.value32[0] = val1;
64362306a36Sopenharmony_ci			new_op->upcall.req.param.u.value32[1] = val2;
64462306a36Sopenharmony_ci			goto value_set;
64562306a36Sopenharmony_ci		} else if (!strcmp(attr->attr.name,
64662306a36Sopenharmony_ci				   "readahead_readcnt")) {
64762306a36Sopenharmony_ci			if ((val >= 0)) {
64862306a36Sopenharmony_ci				new_op->upcall.req.param.op =
64962306a36Sopenharmony_ci				ORANGEFS_PARAM_REQUEST_OP_READAHEAD_READCNT;
65062306a36Sopenharmony_ci			} else {
65162306a36Sopenharmony_ci				rc = 0;
65262306a36Sopenharmony_ci				goto out;
65362306a36Sopenharmony_ci			}
65462306a36Sopenharmony_ci		}
65562306a36Sopenharmony_ci
65662306a36Sopenharmony_ci	} else if (!strcmp(kobj->name, ACACHE_KOBJ_ID)) {
65762306a36Sopenharmony_ci		if (!strcmp(attr->attr.name, "hard_limit")) {
65862306a36Sopenharmony_ci			if (val > -1) {
65962306a36Sopenharmony_ci				new_op->upcall.req.param.op =
66062306a36Sopenharmony_ci				  ORANGEFS_PARAM_REQUEST_OP_ACACHE_HARD_LIMIT;
66162306a36Sopenharmony_ci			} else {
66262306a36Sopenharmony_ci				rc = 0;
66362306a36Sopenharmony_ci				goto out;
66462306a36Sopenharmony_ci			}
66562306a36Sopenharmony_ci		} else if (!strcmp(attr->attr.name, "soft_limit")) {
66662306a36Sopenharmony_ci			if (val > -1) {
66762306a36Sopenharmony_ci				new_op->upcall.req.param.op =
66862306a36Sopenharmony_ci				  ORANGEFS_PARAM_REQUEST_OP_ACACHE_SOFT_LIMIT;
66962306a36Sopenharmony_ci			} else {
67062306a36Sopenharmony_ci				rc = 0;
67162306a36Sopenharmony_ci				goto out;
67262306a36Sopenharmony_ci			}
67362306a36Sopenharmony_ci		} else if (!strcmp(attr->attr.name,
67462306a36Sopenharmony_ci				   "reclaim_percentage")) {
67562306a36Sopenharmony_ci			if ((val > -1) && (val < 101)) {
67662306a36Sopenharmony_ci				new_op->upcall.req.param.op =
67762306a36Sopenharmony_ci				  ORANGEFS_PARAM_REQUEST_OP_ACACHE_RECLAIM_PERCENTAGE;
67862306a36Sopenharmony_ci			} else {
67962306a36Sopenharmony_ci				rc = 0;
68062306a36Sopenharmony_ci				goto out;
68162306a36Sopenharmony_ci			}
68262306a36Sopenharmony_ci		} else if (!strcmp(attr->attr.name, "timeout_msecs")) {
68362306a36Sopenharmony_ci			if (val > -1) {
68462306a36Sopenharmony_ci				new_op->upcall.req.param.op =
68562306a36Sopenharmony_ci				  ORANGEFS_PARAM_REQUEST_OP_ACACHE_TIMEOUT_MSECS;
68662306a36Sopenharmony_ci			} else {
68762306a36Sopenharmony_ci				rc = 0;
68862306a36Sopenharmony_ci				goto out;
68962306a36Sopenharmony_ci			}
69062306a36Sopenharmony_ci		}
69162306a36Sopenharmony_ci
69262306a36Sopenharmony_ci	} else if (!strcmp(kobj->name, CAPCACHE_KOBJ_ID)) {
69362306a36Sopenharmony_ci		if (!strcmp(attr->attr.name, "hard_limit")) {
69462306a36Sopenharmony_ci			if (val > -1) {
69562306a36Sopenharmony_ci				new_op->upcall.req.param.op =
69662306a36Sopenharmony_ci				  ORANGEFS_PARAM_REQUEST_OP_CAPCACHE_HARD_LIMIT;
69762306a36Sopenharmony_ci			} else {
69862306a36Sopenharmony_ci				rc = 0;
69962306a36Sopenharmony_ci				goto out;
70062306a36Sopenharmony_ci			}
70162306a36Sopenharmony_ci		} else if (!strcmp(attr->attr.name, "soft_limit")) {
70262306a36Sopenharmony_ci			if (val > -1) {
70362306a36Sopenharmony_ci				new_op->upcall.req.param.op =
70462306a36Sopenharmony_ci				  ORANGEFS_PARAM_REQUEST_OP_CAPCACHE_SOFT_LIMIT;
70562306a36Sopenharmony_ci			} else {
70662306a36Sopenharmony_ci				rc = 0;
70762306a36Sopenharmony_ci				goto out;
70862306a36Sopenharmony_ci			}
70962306a36Sopenharmony_ci		} else if (!strcmp(attr->attr.name,
71062306a36Sopenharmony_ci				   "reclaim_percentage")) {
71162306a36Sopenharmony_ci			if ((val > -1) && (val < 101)) {
71262306a36Sopenharmony_ci				new_op->upcall.req.param.op =
71362306a36Sopenharmony_ci				  ORANGEFS_PARAM_REQUEST_OP_CAPCACHE_RECLAIM_PERCENTAGE;
71462306a36Sopenharmony_ci			} else {
71562306a36Sopenharmony_ci				rc = 0;
71662306a36Sopenharmony_ci				goto out;
71762306a36Sopenharmony_ci			}
71862306a36Sopenharmony_ci		} else if (!strcmp(attr->attr.name, "timeout_secs")) {
71962306a36Sopenharmony_ci			if (val > -1) {
72062306a36Sopenharmony_ci				new_op->upcall.req.param.op =
72162306a36Sopenharmony_ci				  ORANGEFS_PARAM_REQUEST_OP_CAPCACHE_TIMEOUT_SECS;
72262306a36Sopenharmony_ci			} else {
72362306a36Sopenharmony_ci				rc = 0;
72462306a36Sopenharmony_ci				goto out;
72562306a36Sopenharmony_ci			}
72662306a36Sopenharmony_ci		}
72762306a36Sopenharmony_ci
72862306a36Sopenharmony_ci	} else if (!strcmp(kobj->name, CCACHE_KOBJ_ID)) {
72962306a36Sopenharmony_ci		if (!strcmp(attr->attr.name, "hard_limit")) {
73062306a36Sopenharmony_ci			if (val > -1) {
73162306a36Sopenharmony_ci				new_op->upcall.req.param.op =
73262306a36Sopenharmony_ci				  ORANGEFS_PARAM_REQUEST_OP_CCACHE_HARD_LIMIT;
73362306a36Sopenharmony_ci			} else {
73462306a36Sopenharmony_ci				rc = 0;
73562306a36Sopenharmony_ci				goto out;
73662306a36Sopenharmony_ci			}
73762306a36Sopenharmony_ci		} else if (!strcmp(attr->attr.name, "soft_limit")) {
73862306a36Sopenharmony_ci			if (val > -1) {
73962306a36Sopenharmony_ci				new_op->upcall.req.param.op =
74062306a36Sopenharmony_ci				  ORANGEFS_PARAM_REQUEST_OP_CCACHE_SOFT_LIMIT;
74162306a36Sopenharmony_ci			} else {
74262306a36Sopenharmony_ci				rc = 0;
74362306a36Sopenharmony_ci				goto out;
74462306a36Sopenharmony_ci			}
74562306a36Sopenharmony_ci		} else if (!strcmp(attr->attr.name,
74662306a36Sopenharmony_ci				   "reclaim_percentage")) {
74762306a36Sopenharmony_ci			if ((val > -1) && (val < 101)) {
74862306a36Sopenharmony_ci				new_op->upcall.req.param.op =
74962306a36Sopenharmony_ci				  ORANGEFS_PARAM_REQUEST_OP_CCACHE_RECLAIM_PERCENTAGE;
75062306a36Sopenharmony_ci			} else {
75162306a36Sopenharmony_ci				rc = 0;
75262306a36Sopenharmony_ci				goto out;
75362306a36Sopenharmony_ci			}
75462306a36Sopenharmony_ci		} else if (!strcmp(attr->attr.name, "timeout_secs")) {
75562306a36Sopenharmony_ci			if (val > -1) {
75662306a36Sopenharmony_ci				new_op->upcall.req.param.op =
75762306a36Sopenharmony_ci				  ORANGEFS_PARAM_REQUEST_OP_CCACHE_TIMEOUT_SECS;
75862306a36Sopenharmony_ci			} else {
75962306a36Sopenharmony_ci				rc = 0;
76062306a36Sopenharmony_ci				goto out;
76162306a36Sopenharmony_ci			}
76262306a36Sopenharmony_ci		}
76362306a36Sopenharmony_ci
76462306a36Sopenharmony_ci	} else if (!strcmp(kobj->name, NCACHE_KOBJ_ID)) {
76562306a36Sopenharmony_ci		if (!strcmp(attr->attr.name, "hard_limit")) {
76662306a36Sopenharmony_ci			if (val > -1) {
76762306a36Sopenharmony_ci				new_op->upcall.req.param.op =
76862306a36Sopenharmony_ci				  ORANGEFS_PARAM_REQUEST_OP_NCACHE_HARD_LIMIT;
76962306a36Sopenharmony_ci			} else {
77062306a36Sopenharmony_ci				rc = 0;
77162306a36Sopenharmony_ci				goto out;
77262306a36Sopenharmony_ci			}
77362306a36Sopenharmony_ci		} else if (!strcmp(attr->attr.name, "soft_limit")) {
77462306a36Sopenharmony_ci			if (val > -1) {
77562306a36Sopenharmony_ci				new_op->upcall.req.param.op =
77662306a36Sopenharmony_ci				  ORANGEFS_PARAM_REQUEST_OP_NCACHE_SOFT_LIMIT;
77762306a36Sopenharmony_ci			} else {
77862306a36Sopenharmony_ci				rc = 0;
77962306a36Sopenharmony_ci				goto out;
78062306a36Sopenharmony_ci			}
78162306a36Sopenharmony_ci		} else if (!strcmp(attr->attr.name,
78262306a36Sopenharmony_ci				   "reclaim_percentage")) {
78362306a36Sopenharmony_ci			if ((val > -1) && (val < 101)) {
78462306a36Sopenharmony_ci				new_op->upcall.req.param.op =
78562306a36Sopenharmony_ci					ORANGEFS_PARAM_REQUEST_OP_NCACHE_RECLAIM_PERCENTAGE;
78662306a36Sopenharmony_ci			} else {
78762306a36Sopenharmony_ci				rc = 0;
78862306a36Sopenharmony_ci				goto out;
78962306a36Sopenharmony_ci			}
79062306a36Sopenharmony_ci		} else if (!strcmp(attr->attr.name, "timeout_msecs")) {
79162306a36Sopenharmony_ci			if (val > -1) {
79262306a36Sopenharmony_ci				new_op->upcall.req.param.op =
79362306a36Sopenharmony_ci				  ORANGEFS_PARAM_REQUEST_OP_NCACHE_TIMEOUT_MSECS;
79462306a36Sopenharmony_ci			} else {
79562306a36Sopenharmony_ci				rc = 0;
79662306a36Sopenharmony_ci				goto out;
79762306a36Sopenharmony_ci			}
79862306a36Sopenharmony_ci		}
79962306a36Sopenharmony_ci
80062306a36Sopenharmony_ci	} else {
80162306a36Sopenharmony_ci		gossip_err("sysfs_service_op_store: unknown kobj_id:%s:\n",
80262306a36Sopenharmony_ci			   kobj->name);
80362306a36Sopenharmony_ci		rc = -EINVAL;
80462306a36Sopenharmony_ci		goto out;
80562306a36Sopenharmony_ci	}
80662306a36Sopenharmony_ci
80762306a36Sopenharmony_ci	new_op->upcall.req.param.u.value64 = val;
80862306a36Sopenharmony_civalue_set:
80962306a36Sopenharmony_ci
81062306a36Sopenharmony_ci	/*
81162306a36Sopenharmony_ci	 * The service_operation will return a errno return code on
81262306a36Sopenharmony_ci	 * error, and zero on success.
81362306a36Sopenharmony_ci	 */
81462306a36Sopenharmony_ci	rc = service_operation(new_op, "orangefs_param", ORANGEFS_OP_INTERRUPTIBLE);
81562306a36Sopenharmony_ci
81662306a36Sopenharmony_ci	if (rc < 0) {
81762306a36Sopenharmony_ci		gossip_err("sysfs_service_op_store: service op returned:%d:\n",
81862306a36Sopenharmony_ci			rc);
81962306a36Sopenharmony_ci		rc = 0;
82062306a36Sopenharmony_ci	} else {
82162306a36Sopenharmony_ci		rc = count;
82262306a36Sopenharmony_ci	}
82362306a36Sopenharmony_ci
82462306a36Sopenharmony_ciout:
82562306a36Sopenharmony_ci	op_release(new_op);
82662306a36Sopenharmony_ci
82762306a36Sopenharmony_ci	if (rc == -ENOMEM || rc == 0)
82862306a36Sopenharmony_ci		rc = -EINVAL;
82962306a36Sopenharmony_ci
83062306a36Sopenharmony_ci	return rc;
83162306a36Sopenharmony_ci}
83262306a36Sopenharmony_ci
83362306a36Sopenharmony_cistatic struct orangefs_attribute op_timeout_secs_attribute =
83462306a36Sopenharmony_ci	__ATTR(op_timeout_secs, 0664, sysfs_int_show, sysfs_int_store);
83562306a36Sopenharmony_ci
83662306a36Sopenharmony_cistatic struct orangefs_attribute slot_timeout_secs_attribute =
83762306a36Sopenharmony_ci	__ATTR(slot_timeout_secs, 0664, sysfs_int_show, sysfs_int_store);
83862306a36Sopenharmony_ci
83962306a36Sopenharmony_cistatic struct orangefs_attribute cache_timeout_msecs_attribute =
84062306a36Sopenharmony_ci	__ATTR(cache_timeout_msecs, 0664, sysfs_int_show, sysfs_int_store);
84162306a36Sopenharmony_ci
84262306a36Sopenharmony_cistatic struct orangefs_attribute dcache_timeout_msecs_attribute =
84362306a36Sopenharmony_ci	__ATTR(dcache_timeout_msecs, 0664, sysfs_int_show, sysfs_int_store);
84462306a36Sopenharmony_ci
84562306a36Sopenharmony_cistatic struct orangefs_attribute getattr_timeout_msecs_attribute =
84662306a36Sopenharmony_ci	__ATTR(getattr_timeout_msecs, 0664, sysfs_int_show, sysfs_int_store);
84762306a36Sopenharmony_ci
84862306a36Sopenharmony_cistatic struct orangefs_attribute readahead_count_attribute =
84962306a36Sopenharmony_ci	__ATTR(readahead_count, 0664, sysfs_service_op_show,
85062306a36Sopenharmony_ci	       sysfs_service_op_store);
85162306a36Sopenharmony_ci
85262306a36Sopenharmony_cistatic struct orangefs_attribute readahead_size_attribute =
85362306a36Sopenharmony_ci	__ATTR(readahead_size, 0664, sysfs_service_op_show,
85462306a36Sopenharmony_ci	       sysfs_service_op_store);
85562306a36Sopenharmony_ci
85662306a36Sopenharmony_cistatic struct orangefs_attribute readahead_count_size_attribute =
85762306a36Sopenharmony_ci	__ATTR(readahead_count_size, 0664, sysfs_service_op_show,
85862306a36Sopenharmony_ci	       sysfs_service_op_store);
85962306a36Sopenharmony_ci
86062306a36Sopenharmony_cistatic struct orangefs_attribute readahead_readcnt_attribute =
86162306a36Sopenharmony_ci	__ATTR(readahead_readcnt, 0664, sysfs_service_op_show,
86262306a36Sopenharmony_ci	       sysfs_service_op_store);
86362306a36Sopenharmony_ci
86462306a36Sopenharmony_cistatic struct orangefs_attribute perf_counter_reset_attribute =
86562306a36Sopenharmony_ci	__ATTR(perf_counter_reset,
86662306a36Sopenharmony_ci	       0664,
86762306a36Sopenharmony_ci	       sysfs_service_op_show,
86862306a36Sopenharmony_ci	       sysfs_service_op_store);
86962306a36Sopenharmony_ci
87062306a36Sopenharmony_cistatic struct orangefs_attribute perf_history_size_attribute =
87162306a36Sopenharmony_ci	__ATTR(perf_history_size,
87262306a36Sopenharmony_ci	       0664,
87362306a36Sopenharmony_ci	       sysfs_service_op_show,
87462306a36Sopenharmony_ci	       sysfs_service_op_store);
87562306a36Sopenharmony_ci
87662306a36Sopenharmony_cistatic struct orangefs_attribute perf_time_interval_secs_attribute =
87762306a36Sopenharmony_ci	__ATTR(perf_time_interval_secs,
87862306a36Sopenharmony_ci	       0664,
87962306a36Sopenharmony_ci	       sysfs_service_op_show,
88062306a36Sopenharmony_ci	       sysfs_service_op_store);
88162306a36Sopenharmony_ci
88262306a36Sopenharmony_cistatic struct attribute *orangefs_default_attrs[] = {
88362306a36Sopenharmony_ci	&op_timeout_secs_attribute.attr,
88462306a36Sopenharmony_ci	&slot_timeout_secs_attribute.attr,
88562306a36Sopenharmony_ci	&cache_timeout_msecs_attribute.attr,
88662306a36Sopenharmony_ci	&dcache_timeout_msecs_attribute.attr,
88762306a36Sopenharmony_ci	&getattr_timeout_msecs_attribute.attr,
88862306a36Sopenharmony_ci	&readahead_count_attribute.attr,
88962306a36Sopenharmony_ci	&readahead_size_attribute.attr,
89062306a36Sopenharmony_ci	&readahead_count_size_attribute.attr,
89162306a36Sopenharmony_ci	&readahead_readcnt_attribute.attr,
89262306a36Sopenharmony_ci	&perf_counter_reset_attribute.attr,
89362306a36Sopenharmony_ci	&perf_history_size_attribute.attr,
89462306a36Sopenharmony_ci	&perf_time_interval_secs_attribute.attr,
89562306a36Sopenharmony_ci	NULL,
89662306a36Sopenharmony_ci};
89762306a36Sopenharmony_ciATTRIBUTE_GROUPS(orangefs_default);
89862306a36Sopenharmony_ci
89962306a36Sopenharmony_cistatic struct kobject *orangefs_obj;
90062306a36Sopenharmony_ci
90162306a36Sopenharmony_cistatic void orangefs_obj_release(struct kobject *kobj)
90262306a36Sopenharmony_ci{
90362306a36Sopenharmony_ci	kfree(orangefs_obj);
90462306a36Sopenharmony_ci	orangefs_obj = NULL;
90562306a36Sopenharmony_ci}
90662306a36Sopenharmony_ci
90762306a36Sopenharmony_cistatic struct kobj_type orangefs_ktype = {
90862306a36Sopenharmony_ci	.sysfs_ops = &orangefs_sysfs_ops,
90962306a36Sopenharmony_ci	.default_groups = orangefs_default_groups,
91062306a36Sopenharmony_ci	.release = orangefs_obj_release,
91162306a36Sopenharmony_ci};
91262306a36Sopenharmony_ci
91362306a36Sopenharmony_cistatic struct orangefs_attribute acache_hard_limit_attribute =
91462306a36Sopenharmony_ci	__ATTR(hard_limit,
91562306a36Sopenharmony_ci	       0664,
91662306a36Sopenharmony_ci	       sysfs_service_op_show,
91762306a36Sopenharmony_ci	       sysfs_service_op_store);
91862306a36Sopenharmony_ci
91962306a36Sopenharmony_cistatic struct orangefs_attribute acache_reclaim_percent_attribute =
92062306a36Sopenharmony_ci	__ATTR(reclaim_percentage,
92162306a36Sopenharmony_ci	       0664,
92262306a36Sopenharmony_ci	       sysfs_service_op_show,
92362306a36Sopenharmony_ci	       sysfs_service_op_store);
92462306a36Sopenharmony_ci
92562306a36Sopenharmony_cistatic struct orangefs_attribute acache_soft_limit_attribute =
92662306a36Sopenharmony_ci	__ATTR(soft_limit,
92762306a36Sopenharmony_ci	       0664,
92862306a36Sopenharmony_ci	       sysfs_service_op_show,
92962306a36Sopenharmony_ci	       sysfs_service_op_store);
93062306a36Sopenharmony_ci
93162306a36Sopenharmony_cistatic struct orangefs_attribute acache_timeout_msecs_attribute =
93262306a36Sopenharmony_ci	__ATTR(timeout_msecs,
93362306a36Sopenharmony_ci	       0664,
93462306a36Sopenharmony_ci	       sysfs_service_op_show,
93562306a36Sopenharmony_ci	       sysfs_service_op_store);
93662306a36Sopenharmony_ci
93762306a36Sopenharmony_cistatic struct attribute *acache_orangefs_default_attrs[] = {
93862306a36Sopenharmony_ci	&acache_hard_limit_attribute.attr,
93962306a36Sopenharmony_ci	&acache_reclaim_percent_attribute.attr,
94062306a36Sopenharmony_ci	&acache_soft_limit_attribute.attr,
94162306a36Sopenharmony_ci	&acache_timeout_msecs_attribute.attr,
94262306a36Sopenharmony_ci	NULL,
94362306a36Sopenharmony_ci};
94462306a36Sopenharmony_ciATTRIBUTE_GROUPS(acache_orangefs_default);
94562306a36Sopenharmony_ci
94662306a36Sopenharmony_cistatic struct kobject *acache_orangefs_obj;
94762306a36Sopenharmony_ci
94862306a36Sopenharmony_cistatic void acache_orangefs_obj_release(struct kobject *kobj)
94962306a36Sopenharmony_ci{
95062306a36Sopenharmony_ci	kfree(acache_orangefs_obj);
95162306a36Sopenharmony_ci	acache_orangefs_obj = NULL;
95262306a36Sopenharmony_ci}
95362306a36Sopenharmony_ci
95462306a36Sopenharmony_cistatic struct kobj_type acache_orangefs_ktype = {
95562306a36Sopenharmony_ci	.sysfs_ops = &orangefs_sysfs_ops,
95662306a36Sopenharmony_ci	.default_groups = acache_orangefs_default_groups,
95762306a36Sopenharmony_ci	.release = acache_orangefs_obj_release,
95862306a36Sopenharmony_ci};
95962306a36Sopenharmony_ci
96062306a36Sopenharmony_cistatic struct orangefs_attribute capcache_hard_limit_attribute =
96162306a36Sopenharmony_ci	__ATTR(hard_limit,
96262306a36Sopenharmony_ci	       0664,
96362306a36Sopenharmony_ci	       sysfs_service_op_show,
96462306a36Sopenharmony_ci	       sysfs_service_op_store);
96562306a36Sopenharmony_ci
96662306a36Sopenharmony_cistatic struct orangefs_attribute capcache_reclaim_percent_attribute =
96762306a36Sopenharmony_ci	__ATTR(reclaim_percentage,
96862306a36Sopenharmony_ci	       0664,
96962306a36Sopenharmony_ci	       sysfs_service_op_show,
97062306a36Sopenharmony_ci	       sysfs_service_op_store);
97162306a36Sopenharmony_ci
97262306a36Sopenharmony_cistatic struct orangefs_attribute capcache_soft_limit_attribute =
97362306a36Sopenharmony_ci	__ATTR(soft_limit,
97462306a36Sopenharmony_ci	       0664,
97562306a36Sopenharmony_ci	       sysfs_service_op_show,
97662306a36Sopenharmony_ci	       sysfs_service_op_store);
97762306a36Sopenharmony_ci
97862306a36Sopenharmony_cistatic struct orangefs_attribute capcache_timeout_secs_attribute =
97962306a36Sopenharmony_ci	__ATTR(timeout_secs,
98062306a36Sopenharmony_ci	       0664,
98162306a36Sopenharmony_ci	       sysfs_service_op_show,
98262306a36Sopenharmony_ci	       sysfs_service_op_store);
98362306a36Sopenharmony_ci
98462306a36Sopenharmony_cistatic struct attribute *capcache_orangefs_default_attrs[] = {
98562306a36Sopenharmony_ci	&capcache_hard_limit_attribute.attr,
98662306a36Sopenharmony_ci	&capcache_reclaim_percent_attribute.attr,
98762306a36Sopenharmony_ci	&capcache_soft_limit_attribute.attr,
98862306a36Sopenharmony_ci	&capcache_timeout_secs_attribute.attr,
98962306a36Sopenharmony_ci	NULL,
99062306a36Sopenharmony_ci};
99162306a36Sopenharmony_ciATTRIBUTE_GROUPS(capcache_orangefs_default);
99262306a36Sopenharmony_ci
99362306a36Sopenharmony_cistatic struct kobject *capcache_orangefs_obj;
99462306a36Sopenharmony_ci
99562306a36Sopenharmony_cistatic void capcache_orangefs_obj_release(struct kobject *kobj)
99662306a36Sopenharmony_ci{
99762306a36Sopenharmony_ci	kfree(capcache_orangefs_obj);
99862306a36Sopenharmony_ci	capcache_orangefs_obj = NULL;
99962306a36Sopenharmony_ci}
100062306a36Sopenharmony_ci
100162306a36Sopenharmony_cistatic struct kobj_type capcache_orangefs_ktype = {
100262306a36Sopenharmony_ci	.sysfs_ops = &orangefs_sysfs_ops,
100362306a36Sopenharmony_ci	.default_groups = capcache_orangefs_default_groups,
100462306a36Sopenharmony_ci	.release = capcache_orangefs_obj_release,
100562306a36Sopenharmony_ci};
100662306a36Sopenharmony_ci
100762306a36Sopenharmony_cistatic struct orangefs_attribute ccache_hard_limit_attribute =
100862306a36Sopenharmony_ci	__ATTR(hard_limit,
100962306a36Sopenharmony_ci	       0664,
101062306a36Sopenharmony_ci	       sysfs_service_op_show,
101162306a36Sopenharmony_ci	       sysfs_service_op_store);
101262306a36Sopenharmony_ci
101362306a36Sopenharmony_cistatic struct orangefs_attribute ccache_reclaim_percent_attribute =
101462306a36Sopenharmony_ci	__ATTR(reclaim_percentage,
101562306a36Sopenharmony_ci	       0664,
101662306a36Sopenharmony_ci	       sysfs_service_op_show,
101762306a36Sopenharmony_ci	       sysfs_service_op_store);
101862306a36Sopenharmony_ci
101962306a36Sopenharmony_cistatic struct orangefs_attribute ccache_soft_limit_attribute =
102062306a36Sopenharmony_ci	__ATTR(soft_limit,
102162306a36Sopenharmony_ci	       0664,
102262306a36Sopenharmony_ci	       sysfs_service_op_show,
102362306a36Sopenharmony_ci	       sysfs_service_op_store);
102462306a36Sopenharmony_ci
102562306a36Sopenharmony_cistatic struct orangefs_attribute ccache_timeout_secs_attribute =
102662306a36Sopenharmony_ci	__ATTR(timeout_secs,
102762306a36Sopenharmony_ci	       0664,
102862306a36Sopenharmony_ci	       sysfs_service_op_show,
102962306a36Sopenharmony_ci	       sysfs_service_op_store);
103062306a36Sopenharmony_ci
103162306a36Sopenharmony_cistatic struct attribute *ccache_orangefs_default_attrs[] = {
103262306a36Sopenharmony_ci	&ccache_hard_limit_attribute.attr,
103362306a36Sopenharmony_ci	&ccache_reclaim_percent_attribute.attr,
103462306a36Sopenharmony_ci	&ccache_soft_limit_attribute.attr,
103562306a36Sopenharmony_ci	&ccache_timeout_secs_attribute.attr,
103662306a36Sopenharmony_ci	NULL,
103762306a36Sopenharmony_ci};
103862306a36Sopenharmony_ciATTRIBUTE_GROUPS(ccache_orangefs_default);
103962306a36Sopenharmony_ci
104062306a36Sopenharmony_cistatic struct kobject *ccache_orangefs_obj;
104162306a36Sopenharmony_ci
104262306a36Sopenharmony_cistatic void ccache_orangefs_obj_release(struct kobject *kobj)
104362306a36Sopenharmony_ci{
104462306a36Sopenharmony_ci	kfree(ccache_orangefs_obj);
104562306a36Sopenharmony_ci	ccache_orangefs_obj = NULL;
104662306a36Sopenharmony_ci}
104762306a36Sopenharmony_ci
104862306a36Sopenharmony_cistatic struct kobj_type ccache_orangefs_ktype = {
104962306a36Sopenharmony_ci	.sysfs_ops = &orangefs_sysfs_ops,
105062306a36Sopenharmony_ci	.default_groups = ccache_orangefs_default_groups,
105162306a36Sopenharmony_ci	.release = ccache_orangefs_obj_release,
105262306a36Sopenharmony_ci};
105362306a36Sopenharmony_ci
105462306a36Sopenharmony_cistatic struct orangefs_attribute ncache_hard_limit_attribute =
105562306a36Sopenharmony_ci	__ATTR(hard_limit,
105662306a36Sopenharmony_ci	       0664,
105762306a36Sopenharmony_ci	       sysfs_service_op_show,
105862306a36Sopenharmony_ci	       sysfs_service_op_store);
105962306a36Sopenharmony_ci
106062306a36Sopenharmony_cistatic struct orangefs_attribute ncache_reclaim_percent_attribute =
106162306a36Sopenharmony_ci	__ATTR(reclaim_percentage,
106262306a36Sopenharmony_ci	       0664,
106362306a36Sopenharmony_ci	       sysfs_service_op_show,
106462306a36Sopenharmony_ci	       sysfs_service_op_store);
106562306a36Sopenharmony_ci
106662306a36Sopenharmony_cistatic struct orangefs_attribute ncache_soft_limit_attribute =
106762306a36Sopenharmony_ci	__ATTR(soft_limit,
106862306a36Sopenharmony_ci	       0664,
106962306a36Sopenharmony_ci	       sysfs_service_op_show,
107062306a36Sopenharmony_ci	       sysfs_service_op_store);
107162306a36Sopenharmony_ci
107262306a36Sopenharmony_cistatic struct orangefs_attribute ncache_timeout_msecs_attribute =
107362306a36Sopenharmony_ci	__ATTR(timeout_msecs,
107462306a36Sopenharmony_ci	       0664,
107562306a36Sopenharmony_ci	       sysfs_service_op_show,
107662306a36Sopenharmony_ci	       sysfs_service_op_store);
107762306a36Sopenharmony_ci
107862306a36Sopenharmony_cistatic struct attribute *ncache_orangefs_default_attrs[] = {
107962306a36Sopenharmony_ci	&ncache_hard_limit_attribute.attr,
108062306a36Sopenharmony_ci	&ncache_reclaim_percent_attribute.attr,
108162306a36Sopenharmony_ci	&ncache_soft_limit_attribute.attr,
108262306a36Sopenharmony_ci	&ncache_timeout_msecs_attribute.attr,
108362306a36Sopenharmony_ci	NULL,
108462306a36Sopenharmony_ci};
108562306a36Sopenharmony_ciATTRIBUTE_GROUPS(ncache_orangefs_default);
108662306a36Sopenharmony_ci
108762306a36Sopenharmony_cistatic struct kobject *ncache_orangefs_obj;
108862306a36Sopenharmony_ci
108962306a36Sopenharmony_cistatic void ncache_orangefs_obj_release(struct kobject *kobj)
109062306a36Sopenharmony_ci{
109162306a36Sopenharmony_ci	kfree(ncache_orangefs_obj);
109262306a36Sopenharmony_ci	ncache_orangefs_obj = NULL;
109362306a36Sopenharmony_ci}
109462306a36Sopenharmony_ci
109562306a36Sopenharmony_cistatic struct kobj_type ncache_orangefs_ktype = {
109662306a36Sopenharmony_ci	.sysfs_ops = &orangefs_sysfs_ops,
109762306a36Sopenharmony_ci	.default_groups = ncache_orangefs_default_groups,
109862306a36Sopenharmony_ci	.release = ncache_orangefs_obj_release,
109962306a36Sopenharmony_ci};
110062306a36Sopenharmony_ci
110162306a36Sopenharmony_cistatic struct orangefs_attribute pc_acache_attribute =
110262306a36Sopenharmony_ci	__ATTR(acache,
110362306a36Sopenharmony_ci	       0664,
110462306a36Sopenharmony_ci	       sysfs_service_op_show,
110562306a36Sopenharmony_ci	       NULL);
110662306a36Sopenharmony_ci
110762306a36Sopenharmony_cistatic struct orangefs_attribute pc_capcache_attribute =
110862306a36Sopenharmony_ci	__ATTR(capcache,
110962306a36Sopenharmony_ci	       0664,
111062306a36Sopenharmony_ci	       sysfs_service_op_show,
111162306a36Sopenharmony_ci	       NULL);
111262306a36Sopenharmony_ci
111362306a36Sopenharmony_cistatic struct orangefs_attribute pc_ncache_attribute =
111462306a36Sopenharmony_ci	__ATTR(ncache,
111562306a36Sopenharmony_ci	       0664,
111662306a36Sopenharmony_ci	       sysfs_service_op_show,
111762306a36Sopenharmony_ci	       NULL);
111862306a36Sopenharmony_ci
111962306a36Sopenharmony_cistatic struct attribute *pc_orangefs_default_attrs[] = {
112062306a36Sopenharmony_ci	&pc_acache_attribute.attr,
112162306a36Sopenharmony_ci	&pc_capcache_attribute.attr,
112262306a36Sopenharmony_ci	&pc_ncache_attribute.attr,
112362306a36Sopenharmony_ci	NULL,
112462306a36Sopenharmony_ci};
112562306a36Sopenharmony_ciATTRIBUTE_GROUPS(pc_orangefs_default);
112662306a36Sopenharmony_ci
112762306a36Sopenharmony_cistatic struct kobject *pc_orangefs_obj;
112862306a36Sopenharmony_ci
112962306a36Sopenharmony_cistatic void pc_orangefs_obj_release(struct kobject *kobj)
113062306a36Sopenharmony_ci{
113162306a36Sopenharmony_ci	kfree(pc_orangefs_obj);
113262306a36Sopenharmony_ci	pc_orangefs_obj = NULL;
113362306a36Sopenharmony_ci}
113462306a36Sopenharmony_ci
113562306a36Sopenharmony_cistatic struct kobj_type pc_orangefs_ktype = {
113662306a36Sopenharmony_ci	.sysfs_ops = &orangefs_sysfs_ops,
113762306a36Sopenharmony_ci	.default_groups = pc_orangefs_default_groups,
113862306a36Sopenharmony_ci	.release = pc_orangefs_obj_release,
113962306a36Sopenharmony_ci};
114062306a36Sopenharmony_ci
114162306a36Sopenharmony_cistatic struct orangefs_attribute stats_reads_attribute =
114262306a36Sopenharmony_ci	__ATTR(reads,
114362306a36Sopenharmony_ci	       0664,
114462306a36Sopenharmony_ci	       sysfs_int_show,
114562306a36Sopenharmony_ci	       NULL);
114662306a36Sopenharmony_ci
114762306a36Sopenharmony_cistatic struct orangefs_attribute stats_writes_attribute =
114862306a36Sopenharmony_ci	__ATTR(writes,
114962306a36Sopenharmony_ci	       0664,
115062306a36Sopenharmony_ci	       sysfs_int_show,
115162306a36Sopenharmony_ci	       NULL);
115262306a36Sopenharmony_ci
115362306a36Sopenharmony_cistatic struct attribute *stats_orangefs_default_attrs[] = {
115462306a36Sopenharmony_ci	&stats_reads_attribute.attr,
115562306a36Sopenharmony_ci	&stats_writes_attribute.attr,
115662306a36Sopenharmony_ci	NULL,
115762306a36Sopenharmony_ci};
115862306a36Sopenharmony_ciATTRIBUTE_GROUPS(stats_orangefs_default);
115962306a36Sopenharmony_ci
116062306a36Sopenharmony_cistatic struct kobject *stats_orangefs_obj;
116162306a36Sopenharmony_ci
116262306a36Sopenharmony_cistatic void stats_orangefs_obj_release(struct kobject *kobj)
116362306a36Sopenharmony_ci{
116462306a36Sopenharmony_ci	kfree(stats_orangefs_obj);
116562306a36Sopenharmony_ci	stats_orangefs_obj = NULL;
116662306a36Sopenharmony_ci}
116762306a36Sopenharmony_ci
116862306a36Sopenharmony_cistatic struct kobj_type stats_orangefs_ktype = {
116962306a36Sopenharmony_ci	.sysfs_ops = &orangefs_sysfs_ops,
117062306a36Sopenharmony_ci	.default_groups = stats_orangefs_default_groups,
117162306a36Sopenharmony_ci	.release = stats_orangefs_obj_release,
117262306a36Sopenharmony_ci};
117362306a36Sopenharmony_ci
117462306a36Sopenharmony_ciint orangefs_sysfs_init(void)
117562306a36Sopenharmony_ci{
117662306a36Sopenharmony_ci	int rc = -EINVAL;
117762306a36Sopenharmony_ci
117862306a36Sopenharmony_ci	gossip_debug(GOSSIP_SYSFS_DEBUG, "orangefs_sysfs_init: start\n");
117962306a36Sopenharmony_ci
118062306a36Sopenharmony_ci	/* create /sys/fs/orangefs. */
118162306a36Sopenharmony_ci	orangefs_obj = kzalloc(sizeof(*orangefs_obj), GFP_KERNEL);
118262306a36Sopenharmony_ci	if (!orangefs_obj)
118362306a36Sopenharmony_ci		goto out;
118462306a36Sopenharmony_ci
118562306a36Sopenharmony_ci	rc = kobject_init_and_add(orangefs_obj,
118662306a36Sopenharmony_ci				  &orangefs_ktype,
118762306a36Sopenharmony_ci				  fs_kobj,
118862306a36Sopenharmony_ci				  ORANGEFS_KOBJ_ID);
118962306a36Sopenharmony_ci
119062306a36Sopenharmony_ci	if (rc)
119162306a36Sopenharmony_ci		goto ofs_obj_bail;
119262306a36Sopenharmony_ci
119362306a36Sopenharmony_ci	kobject_uevent(orangefs_obj, KOBJ_ADD);
119462306a36Sopenharmony_ci
119562306a36Sopenharmony_ci	/* create /sys/fs/orangefs/acache. */
119662306a36Sopenharmony_ci	acache_orangefs_obj = kzalloc(sizeof(*acache_orangefs_obj), GFP_KERNEL);
119762306a36Sopenharmony_ci	if (!acache_orangefs_obj) {
119862306a36Sopenharmony_ci		rc = -EINVAL;
119962306a36Sopenharmony_ci		goto ofs_obj_bail;
120062306a36Sopenharmony_ci	}
120162306a36Sopenharmony_ci
120262306a36Sopenharmony_ci	rc = kobject_init_and_add(acache_orangefs_obj,
120362306a36Sopenharmony_ci				  &acache_orangefs_ktype,
120462306a36Sopenharmony_ci				  orangefs_obj,
120562306a36Sopenharmony_ci				  ACACHE_KOBJ_ID);
120662306a36Sopenharmony_ci
120762306a36Sopenharmony_ci	if (rc)
120862306a36Sopenharmony_ci		goto acache_obj_bail;
120962306a36Sopenharmony_ci
121062306a36Sopenharmony_ci	kobject_uevent(acache_orangefs_obj, KOBJ_ADD);
121162306a36Sopenharmony_ci
121262306a36Sopenharmony_ci	/* create /sys/fs/orangefs/capcache. */
121362306a36Sopenharmony_ci	capcache_orangefs_obj =
121462306a36Sopenharmony_ci		kzalloc(sizeof(*capcache_orangefs_obj), GFP_KERNEL);
121562306a36Sopenharmony_ci	if (!capcache_orangefs_obj) {
121662306a36Sopenharmony_ci		rc = -EINVAL;
121762306a36Sopenharmony_ci		goto acache_obj_bail;
121862306a36Sopenharmony_ci	}
121962306a36Sopenharmony_ci
122062306a36Sopenharmony_ci	rc = kobject_init_and_add(capcache_orangefs_obj,
122162306a36Sopenharmony_ci				  &capcache_orangefs_ktype,
122262306a36Sopenharmony_ci				  orangefs_obj,
122362306a36Sopenharmony_ci				  CAPCACHE_KOBJ_ID);
122462306a36Sopenharmony_ci	if (rc)
122562306a36Sopenharmony_ci		goto capcache_obj_bail;
122662306a36Sopenharmony_ci
122762306a36Sopenharmony_ci	kobject_uevent(capcache_orangefs_obj, KOBJ_ADD);
122862306a36Sopenharmony_ci
122962306a36Sopenharmony_ci	/* create /sys/fs/orangefs/ccache. */
123062306a36Sopenharmony_ci	ccache_orangefs_obj =
123162306a36Sopenharmony_ci		kzalloc(sizeof(*ccache_orangefs_obj), GFP_KERNEL);
123262306a36Sopenharmony_ci	if (!ccache_orangefs_obj) {
123362306a36Sopenharmony_ci		rc = -EINVAL;
123462306a36Sopenharmony_ci		goto capcache_obj_bail;
123562306a36Sopenharmony_ci	}
123662306a36Sopenharmony_ci
123762306a36Sopenharmony_ci	rc = kobject_init_and_add(ccache_orangefs_obj,
123862306a36Sopenharmony_ci				  &ccache_orangefs_ktype,
123962306a36Sopenharmony_ci				  orangefs_obj,
124062306a36Sopenharmony_ci				  CCACHE_KOBJ_ID);
124162306a36Sopenharmony_ci	if (rc)
124262306a36Sopenharmony_ci		goto ccache_obj_bail;
124362306a36Sopenharmony_ci
124462306a36Sopenharmony_ci	kobject_uevent(ccache_orangefs_obj, KOBJ_ADD);
124562306a36Sopenharmony_ci
124662306a36Sopenharmony_ci	/* create /sys/fs/orangefs/ncache. */
124762306a36Sopenharmony_ci	ncache_orangefs_obj = kzalloc(sizeof(*ncache_orangefs_obj), GFP_KERNEL);
124862306a36Sopenharmony_ci	if (!ncache_orangefs_obj) {
124962306a36Sopenharmony_ci		rc = -EINVAL;
125062306a36Sopenharmony_ci		goto ccache_obj_bail;
125162306a36Sopenharmony_ci	}
125262306a36Sopenharmony_ci
125362306a36Sopenharmony_ci	rc = kobject_init_and_add(ncache_orangefs_obj,
125462306a36Sopenharmony_ci				  &ncache_orangefs_ktype,
125562306a36Sopenharmony_ci				  orangefs_obj,
125662306a36Sopenharmony_ci				  NCACHE_KOBJ_ID);
125762306a36Sopenharmony_ci
125862306a36Sopenharmony_ci	if (rc)
125962306a36Sopenharmony_ci		goto ncache_obj_bail;
126062306a36Sopenharmony_ci
126162306a36Sopenharmony_ci	kobject_uevent(ncache_orangefs_obj, KOBJ_ADD);
126262306a36Sopenharmony_ci
126362306a36Sopenharmony_ci	/* create /sys/fs/orangefs/perf_counters. */
126462306a36Sopenharmony_ci	pc_orangefs_obj = kzalloc(sizeof(*pc_orangefs_obj), GFP_KERNEL);
126562306a36Sopenharmony_ci	if (!pc_orangefs_obj) {
126662306a36Sopenharmony_ci		rc = -EINVAL;
126762306a36Sopenharmony_ci		goto ncache_obj_bail;
126862306a36Sopenharmony_ci	}
126962306a36Sopenharmony_ci
127062306a36Sopenharmony_ci	rc = kobject_init_and_add(pc_orangefs_obj,
127162306a36Sopenharmony_ci				  &pc_orangefs_ktype,
127262306a36Sopenharmony_ci				  orangefs_obj,
127362306a36Sopenharmony_ci				  "perf_counters");
127462306a36Sopenharmony_ci
127562306a36Sopenharmony_ci	if (rc)
127662306a36Sopenharmony_ci		goto pc_obj_bail;
127762306a36Sopenharmony_ci
127862306a36Sopenharmony_ci	kobject_uevent(pc_orangefs_obj, KOBJ_ADD);
127962306a36Sopenharmony_ci
128062306a36Sopenharmony_ci	/* create /sys/fs/orangefs/stats. */
128162306a36Sopenharmony_ci	stats_orangefs_obj = kzalloc(sizeof(*stats_orangefs_obj), GFP_KERNEL);
128262306a36Sopenharmony_ci	if (!stats_orangefs_obj) {
128362306a36Sopenharmony_ci		rc = -EINVAL;
128462306a36Sopenharmony_ci		goto pc_obj_bail;
128562306a36Sopenharmony_ci	}
128662306a36Sopenharmony_ci
128762306a36Sopenharmony_ci	rc = kobject_init_and_add(stats_orangefs_obj,
128862306a36Sopenharmony_ci				  &stats_orangefs_ktype,
128962306a36Sopenharmony_ci				  orangefs_obj,
129062306a36Sopenharmony_ci				  STATS_KOBJ_ID);
129162306a36Sopenharmony_ci
129262306a36Sopenharmony_ci	if (rc)
129362306a36Sopenharmony_ci		goto stats_obj_bail;
129462306a36Sopenharmony_ci
129562306a36Sopenharmony_ci	kobject_uevent(stats_orangefs_obj, KOBJ_ADD);
129662306a36Sopenharmony_ci	goto out;
129762306a36Sopenharmony_ci
129862306a36Sopenharmony_cistats_obj_bail:
129962306a36Sopenharmony_ci		kobject_put(stats_orangefs_obj);
130062306a36Sopenharmony_cipc_obj_bail:
130162306a36Sopenharmony_ci		kobject_put(pc_orangefs_obj);
130262306a36Sopenharmony_cincache_obj_bail:
130362306a36Sopenharmony_ci		kobject_put(ncache_orangefs_obj);
130462306a36Sopenharmony_ciccache_obj_bail:
130562306a36Sopenharmony_ci		kobject_put(ccache_orangefs_obj);
130662306a36Sopenharmony_cicapcache_obj_bail:
130762306a36Sopenharmony_ci		kobject_put(capcache_orangefs_obj);
130862306a36Sopenharmony_ciacache_obj_bail:
130962306a36Sopenharmony_ci		kobject_put(acache_orangefs_obj);
131062306a36Sopenharmony_ciofs_obj_bail:
131162306a36Sopenharmony_ci		kobject_put(orangefs_obj);
131262306a36Sopenharmony_ciout:
131362306a36Sopenharmony_ci	return rc;
131462306a36Sopenharmony_ci}
131562306a36Sopenharmony_ci
131662306a36Sopenharmony_civoid orangefs_sysfs_exit(void)
131762306a36Sopenharmony_ci{
131862306a36Sopenharmony_ci	gossip_debug(GOSSIP_SYSFS_DEBUG, "orangefs_sysfs_exit: start\n");
131962306a36Sopenharmony_ci	kobject_put(acache_orangefs_obj);
132062306a36Sopenharmony_ci	kobject_put(capcache_orangefs_obj);
132162306a36Sopenharmony_ci	kobject_put(ccache_orangefs_obj);
132262306a36Sopenharmony_ci	kobject_put(ncache_orangefs_obj);
132362306a36Sopenharmony_ci	kobject_put(pc_orangefs_obj);
132462306a36Sopenharmony_ci	kobject_put(stats_orangefs_obj);
132562306a36Sopenharmony_ci	kobject_put(orangefs_obj);
132662306a36Sopenharmony_ci}
1327