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