1 // SPDX-License-Identifier: GPL-2.0
3 * Documentation/ABI/stable/sysfs-fs-orangefs:
5 * What: /sys/fs/orangefs/perf_counter_reset
7 * Contact: Mike Marshall <hubcap@omnibond.com>
9 * echo a 0 or a 1 into perf_counter_reset to
10 * reset all the counters in
11 * /sys/fs/orangefs/perf_counters
12 * except ones with PINT_PERF_PRESERVE set.
15 * What: /sys/fs/orangefs/perf_counters/...
17 * Contact: Mike Marshall <hubcap@omnibond.com>
19 * Counters and settings for various caches.
23 * What: /sys/fs/orangefs/perf_time_interval_secs
25 * Contact: Mike Marshall <hubcap@omnibond.com>
27 * Length of perf counter intervals in
31 * What: /sys/fs/orangefs/perf_history_size
33 * Contact: Mike Marshall <hubcap@omnibond.com>
35 * The perf_counters cache statistics have N, or
36 * perf_history_size, samples. The default is
39 * Every perf_time_interval_secs the (first)
42 * If N is greater than one, the "current" set
43 * of samples is reset, and the samples from the
44 * other N-1 intervals remain available.
47 * What: /sys/fs/orangefs/op_timeout_secs
49 * Contact: Mike Marshall <hubcap@omnibond.com>
51 * Service operation timeout in seconds.
54 * What: /sys/fs/orangefs/slot_timeout_secs
56 * Contact: Mike Marshall <hubcap@omnibond.com>
58 * "Slot" timeout in seconds. A "slot"
59 * is an indexed buffer in the shared
60 * memory segment used for communication
61 * between the kernel module and userspace.
62 * Slots are requested and waited for,
63 * the wait times out after slot_timeout_secs.
65 * What: /sys/fs/orangefs/cache_timeout_msecs
67 * Contact: Martin Brandenburg <martin@omnibond.com>
69 * Time in milliseconds between which
70 * orangefs_revalidate_mapping will invalidate the page
73 * What: /sys/fs/orangefs/dcache_timeout_msecs
75 * Contact: Martin Brandenburg <martin@omnibond.com>
77 * Time lookup is valid in milliseconds.
79 * What: /sys/fs/orangefs/getattr_timeout_msecs
81 * Contact: Martin Brandenburg <martin@omnibond.com>
83 * Time getattr is valid in milliseconds.
85 * What: /sys/fs/orangefs/readahead_count
87 * Contact: Martin Brandenburg <martin@omnibond.com>
89 * Readahead cache buffer count.
91 * What: /sys/fs/orangefs/readahead_size
93 * Contact: Martin Brandenburg <martin@omnibond.com>
95 * Readahead cache buffer size.
97 * What: /sys/fs/orangefs/readahead_count_size
99 * Contact: Martin Brandenburg <martin@omnibond.com>
101 * Readahead cache buffer count and size.
103 * What: /sys/fs/orangefs/readahead_readcnt
105 * Contact: Martin Brandenburg <martin@omnibond.com>
107 * Number of buffers (in multiples of readahead_size)
108 * which can be read ahead for a single file at once.
110 * What: /sys/fs/orangefs/acache/...
112 * Contact: Martin Brandenburg <martin@omnibond.com>
114 * Attribute cache configurable settings.
117 * What: /sys/fs/orangefs/ncache/...
119 * Contact: Mike Marshall <hubcap@omnibond.com>
121 * Name cache configurable settings.
124 * What: /sys/fs/orangefs/capcache/...
126 * Contact: Mike Marshall <hubcap@omnibond.com>
128 * Capability cache configurable settings.
131 * What: /sys/fs/orangefs/ccache/...
133 * Contact: Mike Marshall <hubcap@omnibond.com>
135 * Credential cache configurable settings.
139 #include <linux/fs.h>
140 #include <linux/kobject.h>
141 #include <linux/string.h>
142 #include <linux/sysfs.h>
143 #include <linux/module.h>
144 #include <linux/init.h>
146 #include "protocol.h"
147 #include "orangefs-kernel.h"
148 #include "orangefs-sysfs.h"
150 #define ORANGEFS_KOBJ_ID "orangefs"
151 #define ACACHE_KOBJ_ID "acache"
152 #define CAPCACHE_KOBJ_ID "capcache"
153 #define CCACHE_KOBJ_ID "ccache"
154 #define NCACHE_KOBJ_ID "ncache"
155 #define PC_KOBJ_ID "pc"
156 #define STATS_KOBJ_ID "stats"
159 * Every item calls orangefs_attr_show and orangefs_attr_store through
160 * orangefs_sysfs_ops. They look at the orangefs_attributes further below to
161 * call one of sysfs_int_show, sysfs_int_store, sysfs_service_op_show, or
162 * sysfs_service_op_store.
165 struct orangefs_attribute {
166 struct attribute attr;
167 ssize_t (*show)(struct kobject *kobj,
168 struct orangefs_attribute *attr,
170 ssize_t (*store)(struct kobject *kobj,
171 struct orangefs_attribute *attr,
176 static ssize_t orangefs_attr_show(struct kobject *kobj,
177 struct attribute *attr,
180 struct orangefs_attribute *attribute;
182 attribute = container_of(attr, struct orangefs_attribute, attr);
183 if (!attribute->show)
185 return attribute->show(kobj, attribute, buf);
188 static ssize_t orangefs_attr_store(struct kobject *kobj,
189 struct attribute *attr,
193 struct orangefs_attribute *attribute;
195 if (!strcmp(kobj->name, PC_KOBJ_ID) ||
196 !strcmp(kobj->name, STATS_KOBJ_ID))
199 attribute = container_of(attr, struct orangefs_attribute, attr);
200 if (!attribute->store)
202 return attribute->store(kobj, attribute, buf, len);
205 static const struct sysfs_ops orangefs_sysfs_ops = {
206 .show = orangefs_attr_show,
207 .store = orangefs_attr_store,
210 static ssize_t sysfs_int_show(struct kobject *kobj,
211 struct orangefs_attribute *attr, char *buf)
215 gossip_debug(GOSSIP_SYSFS_DEBUG, "sysfs_int_show: id:%s:\n",
218 if (!strcmp(kobj->name, ORANGEFS_KOBJ_ID)) {
219 if (!strcmp(attr->attr.name, "op_timeout_secs")) {
225 } else if (!strcmp(attr->attr.name,
226 "slot_timeout_secs")) {
232 } else if (!strcmp(attr->attr.name,
233 "cache_timeout_msecs")) {
237 orangefs_cache_timeout_msecs);
239 } else if (!strcmp(attr->attr.name,
240 "dcache_timeout_msecs")) {
244 orangefs_dcache_timeout_msecs);
246 } else if (!strcmp(attr->attr.name,
247 "getattr_timeout_msecs")) {
251 orangefs_getattr_timeout_msecs);
257 } else if (!strcmp(kobj->name, STATS_KOBJ_ID)) {
258 if (!strcmp(attr->attr.name, "reads")) {
262 orangefs_stats.reads);
264 } else if (!strcmp(attr->attr.name, "writes")) {
268 orangefs_stats.writes);
280 static ssize_t sysfs_int_store(struct kobject *kobj,
281 struct orangefs_attribute *attr, const char *buf, size_t count)
285 gossip_debug(GOSSIP_SYSFS_DEBUG,
286 "sysfs_int_store: start attr->attr.name:%s: buf:%s:\n",
287 attr->attr.name, buf);
289 if (!strcmp(attr->attr.name, "op_timeout_secs")) {
290 rc = kstrtoint(buf, 0, &op_timeout_secs);
292 } else if (!strcmp(attr->attr.name, "slot_timeout_secs")) {
293 rc = kstrtoint(buf, 0, &slot_timeout_secs);
295 } else if (!strcmp(attr->attr.name, "cache_timeout_msecs")) {
296 rc = kstrtoint(buf, 0, &orangefs_cache_timeout_msecs);
298 } else if (!strcmp(attr->attr.name, "dcache_timeout_msecs")) {
299 rc = kstrtoint(buf, 0, &orangefs_dcache_timeout_msecs);
301 } else if (!strcmp(attr->attr.name, "getattr_timeout_msecs")) {
302 rc = kstrtoint(buf, 0, &orangefs_getattr_timeout_msecs);
318 * obtain attribute values from userspace with a service operation.
320 static ssize_t sysfs_service_op_show(struct kobject *kobj,
321 struct orangefs_attribute *attr, char *buf)
323 struct orangefs_kernel_op_s *new_op = NULL;
325 char *ser_op_type = NULL;
328 gossip_debug(GOSSIP_SYSFS_DEBUG,
329 "sysfs_service_op_show: id:%s:\n",
332 if (strcmp(kobj->name, PC_KOBJ_ID))
333 op_alloc_type = ORANGEFS_VFS_OP_PARAM;
335 op_alloc_type = ORANGEFS_VFS_OP_PERF_COUNT;
337 new_op = op_alloc(op_alloc_type);
341 /* Can't do a service_operation if the client is not running... */
342 rc = is_daemon_in_service();
344 pr_info_ratelimited("%s: Client not running :%d:\n",
346 is_daemon_in_service());
350 if (strcmp(kobj->name, PC_KOBJ_ID))
351 new_op->upcall.req.param.type = ORANGEFS_PARAM_REQUEST_GET;
353 if (!strcmp(kobj->name, ORANGEFS_KOBJ_ID)) {
354 /* Drop unsupported requests first. */
355 if (!(orangefs_features & ORANGEFS_FEATURE_READAHEAD) &&
356 (!strcmp(attr->attr.name, "readahead_count") ||
357 !strcmp(attr->attr.name, "readahead_size") ||
358 !strcmp(attr->attr.name, "readahead_count_size") ||
359 !strcmp(attr->attr.name, "readahead_readcnt"))) {
364 if (!strcmp(attr->attr.name, "perf_history_size"))
365 new_op->upcall.req.param.op =
366 ORANGEFS_PARAM_REQUEST_OP_PERF_HISTORY_SIZE;
367 else if (!strcmp(attr->attr.name,
368 "perf_time_interval_secs"))
369 new_op->upcall.req.param.op =
370 ORANGEFS_PARAM_REQUEST_OP_PERF_TIME_INTERVAL_SECS;
371 else if (!strcmp(attr->attr.name,
372 "perf_counter_reset"))
373 new_op->upcall.req.param.op =
374 ORANGEFS_PARAM_REQUEST_OP_PERF_RESET;
376 else if (!strcmp(attr->attr.name,
378 new_op->upcall.req.param.op =
379 ORANGEFS_PARAM_REQUEST_OP_READAHEAD_COUNT;
381 else if (!strcmp(attr->attr.name,
383 new_op->upcall.req.param.op =
384 ORANGEFS_PARAM_REQUEST_OP_READAHEAD_SIZE;
386 else if (!strcmp(attr->attr.name,
387 "readahead_count_size"))
388 new_op->upcall.req.param.op =
389 ORANGEFS_PARAM_REQUEST_OP_READAHEAD_COUNT_SIZE;
391 else if (!strcmp(attr->attr.name,
392 "readahead_readcnt"))
393 new_op->upcall.req.param.op =
394 ORANGEFS_PARAM_REQUEST_OP_READAHEAD_READCNT;
395 } else if (!strcmp(kobj->name, ACACHE_KOBJ_ID)) {
396 if (!strcmp(attr->attr.name, "timeout_msecs"))
397 new_op->upcall.req.param.op =
398 ORANGEFS_PARAM_REQUEST_OP_ACACHE_TIMEOUT_MSECS;
400 if (!strcmp(attr->attr.name, "hard_limit"))
401 new_op->upcall.req.param.op =
402 ORANGEFS_PARAM_REQUEST_OP_ACACHE_HARD_LIMIT;
404 if (!strcmp(attr->attr.name, "soft_limit"))
405 new_op->upcall.req.param.op =
406 ORANGEFS_PARAM_REQUEST_OP_ACACHE_SOFT_LIMIT;
408 if (!strcmp(attr->attr.name, "reclaim_percentage"))
409 new_op->upcall.req.param.op =
410 ORANGEFS_PARAM_REQUEST_OP_ACACHE_RECLAIM_PERCENTAGE;
412 } else if (!strcmp(kobj->name, CAPCACHE_KOBJ_ID)) {
413 if (!strcmp(attr->attr.name, "timeout_secs"))
414 new_op->upcall.req.param.op =
415 ORANGEFS_PARAM_REQUEST_OP_CAPCACHE_TIMEOUT_SECS;
417 if (!strcmp(attr->attr.name, "hard_limit"))
418 new_op->upcall.req.param.op =
419 ORANGEFS_PARAM_REQUEST_OP_CAPCACHE_HARD_LIMIT;
421 if (!strcmp(attr->attr.name, "soft_limit"))
422 new_op->upcall.req.param.op =
423 ORANGEFS_PARAM_REQUEST_OP_CAPCACHE_SOFT_LIMIT;
425 if (!strcmp(attr->attr.name, "reclaim_percentage"))
426 new_op->upcall.req.param.op =
427 ORANGEFS_PARAM_REQUEST_OP_CAPCACHE_RECLAIM_PERCENTAGE;
429 } else if (!strcmp(kobj->name, CCACHE_KOBJ_ID)) {
430 if (!strcmp(attr->attr.name, "timeout_secs"))
431 new_op->upcall.req.param.op =
432 ORANGEFS_PARAM_REQUEST_OP_CCACHE_TIMEOUT_SECS;
434 if (!strcmp(attr->attr.name, "hard_limit"))
435 new_op->upcall.req.param.op =
436 ORANGEFS_PARAM_REQUEST_OP_CCACHE_HARD_LIMIT;
438 if (!strcmp(attr->attr.name, "soft_limit"))
439 new_op->upcall.req.param.op =
440 ORANGEFS_PARAM_REQUEST_OP_CCACHE_SOFT_LIMIT;
442 if (!strcmp(attr->attr.name, "reclaim_percentage"))
443 new_op->upcall.req.param.op =
444 ORANGEFS_PARAM_REQUEST_OP_CCACHE_RECLAIM_PERCENTAGE;
446 } else if (!strcmp(kobj->name, NCACHE_KOBJ_ID)) {
447 if (!strcmp(attr->attr.name, "timeout_msecs"))
448 new_op->upcall.req.param.op =
449 ORANGEFS_PARAM_REQUEST_OP_NCACHE_TIMEOUT_MSECS;
451 if (!strcmp(attr->attr.name, "hard_limit"))
452 new_op->upcall.req.param.op =
453 ORANGEFS_PARAM_REQUEST_OP_NCACHE_HARD_LIMIT;
455 if (!strcmp(attr->attr.name, "soft_limit"))
456 new_op->upcall.req.param.op =
457 ORANGEFS_PARAM_REQUEST_OP_NCACHE_SOFT_LIMIT;
459 if (!strcmp(attr->attr.name, "reclaim_percentage"))
460 new_op->upcall.req.param.op =
461 ORANGEFS_PARAM_REQUEST_OP_NCACHE_RECLAIM_PERCENTAGE;
463 } else if (!strcmp(kobj->name, PC_KOBJ_ID)) {
464 if (!strcmp(attr->attr.name, ACACHE_KOBJ_ID))
465 new_op->upcall.req.perf_count.type =
466 ORANGEFS_PERF_COUNT_REQUEST_ACACHE;
468 if (!strcmp(attr->attr.name, CAPCACHE_KOBJ_ID))
469 new_op->upcall.req.perf_count.type =
470 ORANGEFS_PERF_COUNT_REQUEST_CAPCACHE;
472 if (!strcmp(attr->attr.name, NCACHE_KOBJ_ID))
473 new_op->upcall.req.perf_count.type =
474 ORANGEFS_PERF_COUNT_REQUEST_NCACHE;
477 gossip_err("sysfs_service_op_show: unknown kobj_id:%s:\n",
484 if (strcmp(kobj->name, PC_KOBJ_ID))
485 ser_op_type = "orangefs_param";
487 ser_op_type = "orangefs_perf_count";
490 * The service_operation will return an errno return code on
491 * error, and zero on success.
493 rc = service_operation(new_op, ser_op_type, ORANGEFS_OP_INTERRUPTIBLE);
497 if (strcmp(kobj->name, PC_KOBJ_ID)) {
498 if (new_op->upcall.req.param.op ==
499 ORANGEFS_PARAM_REQUEST_OP_READAHEAD_COUNT_SIZE) {
500 rc = scnprintf(buf, PAGE_SIZE, "%d %d\n",
501 (int)new_op->downcall.resp.param.u.
503 (int)new_op->downcall.resp.param.u.
506 rc = scnprintf(buf, PAGE_SIZE, "%d\n",
507 (int)new_op->downcall.resp.param.u.value64);
514 new_op->downcall.resp.perf_count.buffer);
525 * pass attribute values back to userspace with a service operation.
527 * We have to do a memory allocation, an sscanf and a service operation.
528 * And we have to evaluate what the user entered, to make sure the
529 * value is within the range supported by the attribute. So, there's
530 * a lot of return code checking and mapping going on here.
532 * We want to return 1 if we think everything went OK, and
535 static ssize_t sysfs_service_op_store(struct kobject *kobj,
536 struct orangefs_attribute *attr, const char *buf, size_t count)
538 struct orangefs_kernel_op_s *new_op = NULL;
542 gossip_debug(GOSSIP_SYSFS_DEBUG,
543 "sysfs_service_op_store: id:%s:\n",
546 new_op = op_alloc(ORANGEFS_VFS_OP_PARAM);
548 return -EINVAL; /* sic */
550 /* Can't do a service_operation if the client is not running... */
551 rc = is_daemon_in_service();
553 pr_info("%s: Client not running :%d:\n",
555 is_daemon_in_service());
560 * The value we want to send back to userspace is in buf, unless this
561 * there are two parameters, which is specially handled below.
563 if (strcmp(kobj->name, ORANGEFS_KOBJ_ID) ||
564 strcmp(attr->attr.name, "readahead_count_size")) {
565 rc = kstrtoint(buf, 0, &val);
570 new_op->upcall.req.param.type = ORANGEFS_PARAM_REQUEST_SET;
572 if (!strcmp(kobj->name, ORANGEFS_KOBJ_ID)) {
573 /* Drop unsupported requests first. */
574 if (!(orangefs_features & ORANGEFS_FEATURE_READAHEAD) &&
575 (!strcmp(attr->attr.name, "readahead_count") ||
576 !strcmp(attr->attr.name, "readahead_size") ||
577 !strcmp(attr->attr.name, "readahead_count_size") ||
578 !strcmp(attr->attr.name, "readahead_readcnt"))) {
583 if (!strcmp(attr->attr.name, "perf_history_size")) {
585 new_op->upcall.req.param.op =
586 ORANGEFS_PARAM_REQUEST_OP_PERF_HISTORY_SIZE;
591 } else if (!strcmp(attr->attr.name,
592 "perf_time_interval_secs")) {
594 new_op->upcall.req.param.op =
595 ORANGEFS_PARAM_REQUEST_OP_PERF_TIME_INTERVAL_SECS;
600 } else if (!strcmp(attr->attr.name,
601 "perf_counter_reset")) {
602 if ((val == 0) || (val == 1)) {
603 new_op->upcall.req.param.op =
604 ORANGEFS_PARAM_REQUEST_OP_PERF_RESET;
609 } else if (!strcmp(attr->attr.name,
610 "readahead_count")) {
612 new_op->upcall.req.param.op =
613 ORANGEFS_PARAM_REQUEST_OP_READAHEAD_COUNT;
618 } else if (!strcmp(attr->attr.name,
621 new_op->upcall.req.param.op =
622 ORANGEFS_PARAM_REQUEST_OP_READAHEAD_SIZE;
627 } else if (!strcmp(attr->attr.name,
628 "readahead_count_size")) {
630 rc = sscanf(buf, "%d %d", &val1, &val2);
635 if ((val1 >= 0) && (val2 >= 0)) {
636 new_op->upcall.req.param.op =
637 ORANGEFS_PARAM_REQUEST_OP_READAHEAD_COUNT_SIZE;
642 new_op->upcall.req.param.u.value32[0] = val1;
643 new_op->upcall.req.param.u.value32[1] = val2;
645 } else if (!strcmp(attr->attr.name,
646 "readahead_readcnt")) {
648 new_op->upcall.req.param.op =
649 ORANGEFS_PARAM_REQUEST_OP_READAHEAD_READCNT;
656 } else if (!strcmp(kobj->name, ACACHE_KOBJ_ID)) {
657 if (!strcmp(attr->attr.name, "hard_limit")) {
659 new_op->upcall.req.param.op =
660 ORANGEFS_PARAM_REQUEST_OP_ACACHE_HARD_LIMIT;
665 } else if (!strcmp(attr->attr.name, "soft_limit")) {
667 new_op->upcall.req.param.op =
668 ORANGEFS_PARAM_REQUEST_OP_ACACHE_SOFT_LIMIT;
673 } else if (!strcmp(attr->attr.name,
674 "reclaim_percentage")) {
675 if ((val > -1) && (val < 101)) {
676 new_op->upcall.req.param.op =
677 ORANGEFS_PARAM_REQUEST_OP_ACACHE_RECLAIM_PERCENTAGE;
682 } else if (!strcmp(attr->attr.name, "timeout_msecs")) {
684 new_op->upcall.req.param.op =
685 ORANGEFS_PARAM_REQUEST_OP_ACACHE_TIMEOUT_MSECS;
692 } else if (!strcmp(kobj->name, CAPCACHE_KOBJ_ID)) {
693 if (!strcmp(attr->attr.name, "hard_limit")) {
695 new_op->upcall.req.param.op =
696 ORANGEFS_PARAM_REQUEST_OP_CAPCACHE_HARD_LIMIT;
701 } else if (!strcmp(attr->attr.name, "soft_limit")) {
703 new_op->upcall.req.param.op =
704 ORANGEFS_PARAM_REQUEST_OP_CAPCACHE_SOFT_LIMIT;
709 } else if (!strcmp(attr->attr.name,
710 "reclaim_percentage")) {
711 if ((val > -1) && (val < 101)) {
712 new_op->upcall.req.param.op =
713 ORANGEFS_PARAM_REQUEST_OP_CAPCACHE_RECLAIM_PERCENTAGE;
718 } else if (!strcmp(attr->attr.name, "timeout_secs")) {
720 new_op->upcall.req.param.op =
721 ORANGEFS_PARAM_REQUEST_OP_CAPCACHE_TIMEOUT_SECS;
728 } else if (!strcmp(kobj->name, CCACHE_KOBJ_ID)) {
729 if (!strcmp(attr->attr.name, "hard_limit")) {
731 new_op->upcall.req.param.op =
732 ORANGEFS_PARAM_REQUEST_OP_CCACHE_HARD_LIMIT;
737 } else if (!strcmp(attr->attr.name, "soft_limit")) {
739 new_op->upcall.req.param.op =
740 ORANGEFS_PARAM_REQUEST_OP_CCACHE_SOFT_LIMIT;
745 } else if (!strcmp(attr->attr.name,
746 "reclaim_percentage")) {
747 if ((val > -1) && (val < 101)) {
748 new_op->upcall.req.param.op =
749 ORANGEFS_PARAM_REQUEST_OP_CCACHE_RECLAIM_PERCENTAGE;
754 } else if (!strcmp(attr->attr.name, "timeout_secs")) {
756 new_op->upcall.req.param.op =
757 ORANGEFS_PARAM_REQUEST_OP_CCACHE_TIMEOUT_SECS;
764 } else if (!strcmp(kobj->name, NCACHE_KOBJ_ID)) {
765 if (!strcmp(attr->attr.name, "hard_limit")) {
767 new_op->upcall.req.param.op =
768 ORANGEFS_PARAM_REQUEST_OP_NCACHE_HARD_LIMIT;
773 } else if (!strcmp(attr->attr.name, "soft_limit")) {
775 new_op->upcall.req.param.op =
776 ORANGEFS_PARAM_REQUEST_OP_NCACHE_SOFT_LIMIT;
781 } else if (!strcmp(attr->attr.name,
782 "reclaim_percentage")) {
783 if ((val > -1) && (val < 101)) {
784 new_op->upcall.req.param.op =
785 ORANGEFS_PARAM_REQUEST_OP_NCACHE_RECLAIM_PERCENTAGE;
790 } else if (!strcmp(attr->attr.name, "timeout_msecs")) {
792 new_op->upcall.req.param.op =
793 ORANGEFS_PARAM_REQUEST_OP_NCACHE_TIMEOUT_MSECS;
801 gossip_err("sysfs_service_op_store: unknown kobj_id:%s:\n",
807 new_op->upcall.req.param.u.value64 = val;
811 * The service_operation will return a errno return code on
812 * error, and zero on success.
814 rc = service_operation(new_op, "orangefs_param", ORANGEFS_OP_INTERRUPTIBLE);
817 gossip_err("sysfs_service_op_store: service op returned:%d:\n",
827 if (rc == -ENOMEM || rc == 0)
833 static struct orangefs_attribute op_timeout_secs_attribute =
834 __ATTR(op_timeout_secs, 0664, sysfs_int_show, sysfs_int_store);
836 static struct orangefs_attribute slot_timeout_secs_attribute =
837 __ATTR(slot_timeout_secs, 0664, sysfs_int_show, sysfs_int_store);
839 static struct orangefs_attribute cache_timeout_msecs_attribute =
840 __ATTR(cache_timeout_msecs, 0664, sysfs_int_show, sysfs_int_store);
842 static struct orangefs_attribute dcache_timeout_msecs_attribute =
843 __ATTR(dcache_timeout_msecs, 0664, sysfs_int_show, sysfs_int_store);
845 static struct orangefs_attribute getattr_timeout_msecs_attribute =
846 __ATTR(getattr_timeout_msecs, 0664, sysfs_int_show, sysfs_int_store);
848 static struct orangefs_attribute readahead_count_attribute =
849 __ATTR(readahead_count, 0664, sysfs_service_op_show,
850 sysfs_service_op_store);
852 static struct orangefs_attribute readahead_size_attribute =
853 __ATTR(readahead_size, 0664, sysfs_service_op_show,
854 sysfs_service_op_store);
856 static struct orangefs_attribute readahead_count_size_attribute =
857 __ATTR(readahead_count_size, 0664, sysfs_service_op_show,
858 sysfs_service_op_store);
860 static struct orangefs_attribute readahead_readcnt_attribute =
861 __ATTR(readahead_readcnt, 0664, sysfs_service_op_show,
862 sysfs_service_op_store);
864 static struct orangefs_attribute perf_counter_reset_attribute =
865 __ATTR(perf_counter_reset,
867 sysfs_service_op_show,
868 sysfs_service_op_store);
870 static struct orangefs_attribute perf_history_size_attribute =
871 __ATTR(perf_history_size,
873 sysfs_service_op_show,
874 sysfs_service_op_store);
876 static struct orangefs_attribute perf_time_interval_secs_attribute =
877 __ATTR(perf_time_interval_secs,
879 sysfs_service_op_show,
880 sysfs_service_op_store);
882 static struct attribute *orangefs_default_attrs[] = {
883 &op_timeout_secs_attribute.attr,
884 &slot_timeout_secs_attribute.attr,
885 &cache_timeout_msecs_attribute.attr,
886 &dcache_timeout_msecs_attribute.attr,
887 &getattr_timeout_msecs_attribute.attr,
888 &readahead_count_attribute.attr,
889 &readahead_size_attribute.attr,
890 &readahead_count_size_attribute.attr,
891 &readahead_readcnt_attribute.attr,
892 &perf_counter_reset_attribute.attr,
893 &perf_history_size_attribute.attr,
894 &perf_time_interval_secs_attribute.attr,
897 ATTRIBUTE_GROUPS(orangefs_default);
899 static struct kobject *orangefs_obj;
901 static void orangefs_obj_release(struct kobject *kobj)
907 static struct kobj_type orangefs_ktype = {
908 .sysfs_ops = &orangefs_sysfs_ops,
909 .default_groups = orangefs_default_groups,
910 .release = orangefs_obj_release,
913 static struct orangefs_attribute acache_hard_limit_attribute =
916 sysfs_service_op_show,
917 sysfs_service_op_store);
919 static struct orangefs_attribute acache_reclaim_percent_attribute =
920 __ATTR(reclaim_percentage,
922 sysfs_service_op_show,
923 sysfs_service_op_store);
925 static struct orangefs_attribute acache_soft_limit_attribute =
928 sysfs_service_op_show,
929 sysfs_service_op_store);
931 static struct orangefs_attribute acache_timeout_msecs_attribute =
932 __ATTR(timeout_msecs,
934 sysfs_service_op_show,
935 sysfs_service_op_store);
937 static struct attribute *acache_orangefs_default_attrs[] = {
938 &acache_hard_limit_attribute.attr,
939 &acache_reclaim_percent_attribute.attr,
940 &acache_soft_limit_attribute.attr,
941 &acache_timeout_msecs_attribute.attr,
944 ATTRIBUTE_GROUPS(acache_orangefs_default);
946 static struct kobject *acache_orangefs_obj;
948 static void acache_orangefs_obj_release(struct kobject *kobj)
950 kfree(acache_orangefs_obj);
951 acache_orangefs_obj = NULL;
954 static struct kobj_type acache_orangefs_ktype = {
955 .sysfs_ops = &orangefs_sysfs_ops,
956 .default_groups = acache_orangefs_default_groups,
957 .release = acache_orangefs_obj_release,
960 static struct orangefs_attribute capcache_hard_limit_attribute =
963 sysfs_service_op_show,
964 sysfs_service_op_store);
966 static struct orangefs_attribute capcache_reclaim_percent_attribute =
967 __ATTR(reclaim_percentage,
969 sysfs_service_op_show,
970 sysfs_service_op_store);
972 static struct orangefs_attribute capcache_soft_limit_attribute =
975 sysfs_service_op_show,
976 sysfs_service_op_store);
978 static struct orangefs_attribute capcache_timeout_secs_attribute =
981 sysfs_service_op_show,
982 sysfs_service_op_store);
984 static struct attribute *capcache_orangefs_default_attrs[] = {
985 &capcache_hard_limit_attribute.attr,
986 &capcache_reclaim_percent_attribute.attr,
987 &capcache_soft_limit_attribute.attr,
988 &capcache_timeout_secs_attribute.attr,
991 ATTRIBUTE_GROUPS(capcache_orangefs_default);
993 static struct kobject *capcache_orangefs_obj;
995 static void capcache_orangefs_obj_release(struct kobject *kobj)
997 kfree(capcache_orangefs_obj);
998 capcache_orangefs_obj = NULL;
1001 static struct kobj_type capcache_orangefs_ktype = {
1002 .sysfs_ops = &orangefs_sysfs_ops,
1003 .default_groups = capcache_orangefs_default_groups,
1004 .release = capcache_orangefs_obj_release,
1007 static struct orangefs_attribute ccache_hard_limit_attribute =
1010 sysfs_service_op_show,
1011 sysfs_service_op_store);
1013 static struct orangefs_attribute ccache_reclaim_percent_attribute =
1014 __ATTR(reclaim_percentage,
1016 sysfs_service_op_show,
1017 sysfs_service_op_store);
1019 static struct orangefs_attribute ccache_soft_limit_attribute =
1022 sysfs_service_op_show,
1023 sysfs_service_op_store);
1025 static struct orangefs_attribute ccache_timeout_secs_attribute =
1026 __ATTR(timeout_secs,
1028 sysfs_service_op_show,
1029 sysfs_service_op_store);
1031 static struct attribute *ccache_orangefs_default_attrs[] = {
1032 &ccache_hard_limit_attribute.attr,
1033 &ccache_reclaim_percent_attribute.attr,
1034 &ccache_soft_limit_attribute.attr,
1035 &ccache_timeout_secs_attribute.attr,
1038 ATTRIBUTE_GROUPS(ccache_orangefs_default);
1040 static struct kobject *ccache_orangefs_obj;
1042 static void ccache_orangefs_obj_release(struct kobject *kobj)
1044 kfree(ccache_orangefs_obj);
1045 ccache_orangefs_obj = NULL;
1048 static struct kobj_type ccache_orangefs_ktype = {
1049 .sysfs_ops = &orangefs_sysfs_ops,
1050 .default_groups = ccache_orangefs_default_groups,
1051 .release = ccache_orangefs_obj_release,
1054 static struct orangefs_attribute ncache_hard_limit_attribute =
1057 sysfs_service_op_show,
1058 sysfs_service_op_store);
1060 static struct orangefs_attribute ncache_reclaim_percent_attribute =
1061 __ATTR(reclaim_percentage,
1063 sysfs_service_op_show,
1064 sysfs_service_op_store);
1066 static struct orangefs_attribute ncache_soft_limit_attribute =
1069 sysfs_service_op_show,
1070 sysfs_service_op_store);
1072 static struct orangefs_attribute ncache_timeout_msecs_attribute =
1073 __ATTR(timeout_msecs,
1075 sysfs_service_op_show,
1076 sysfs_service_op_store);
1078 static struct attribute *ncache_orangefs_default_attrs[] = {
1079 &ncache_hard_limit_attribute.attr,
1080 &ncache_reclaim_percent_attribute.attr,
1081 &ncache_soft_limit_attribute.attr,
1082 &ncache_timeout_msecs_attribute.attr,
1085 ATTRIBUTE_GROUPS(ncache_orangefs_default);
1087 static struct kobject *ncache_orangefs_obj;
1089 static void ncache_orangefs_obj_release(struct kobject *kobj)
1091 kfree(ncache_orangefs_obj);
1092 ncache_orangefs_obj = NULL;
1095 static struct kobj_type ncache_orangefs_ktype = {
1096 .sysfs_ops = &orangefs_sysfs_ops,
1097 .default_groups = ncache_orangefs_default_groups,
1098 .release = ncache_orangefs_obj_release,
1101 static struct orangefs_attribute pc_acache_attribute =
1104 sysfs_service_op_show,
1107 static struct orangefs_attribute pc_capcache_attribute =
1110 sysfs_service_op_show,
1113 static struct orangefs_attribute pc_ncache_attribute =
1116 sysfs_service_op_show,
1119 static struct attribute *pc_orangefs_default_attrs[] = {
1120 &pc_acache_attribute.attr,
1121 &pc_capcache_attribute.attr,
1122 &pc_ncache_attribute.attr,
1125 ATTRIBUTE_GROUPS(pc_orangefs_default);
1127 static struct kobject *pc_orangefs_obj;
1129 static void pc_orangefs_obj_release(struct kobject *kobj)
1131 kfree(pc_orangefs_obj);
1132 pc_orangefs_obj = NULL;
1135 static struct kobj_type pc_orangefs_ktype = {
1136 .sysfs_ops = &orangefs_sysfs_ops,
1137 .default_groups = pc_orangefs_default_groups,
1138 .release = pc_orangefs_obj_release,
1141 static struct orangefs_attribute stats_reads_attribute =
1147 static struct orangefs_attribute stats_writes_attribute =
1153 static struct attribute *stats_orangefs_default_attrs[] = {
1154 &stats_reads_attribute.attr,
1155 &stats_writes_attribute.attr,
1158 ATTRIBUTE_GROUPS(stats_orangefs_default);
1160 static struct kobject *stats_orangefs_obj;
1162 static void stats_orangefs_obj_release(struct kobject *kobj)
1164 kfree(stats_orangefs_obj);
1165 stats_orangefs_obj = NULL;
1168 static struct kobj_type stats_orangefs_ktype = {
1169 .sysfs_ops = &orangefs_sysfs_ops,
1170 .default_groups = stats_orangefs_default_groups,
1171 .release = stats_orangefs_obj_release,
1174 int orangefs_sysfs_init(void)
1178 gossip_debug(GOSSIP_SYSFS_DEBUG, "orangefs_sysfs_init: start\n");
1180 /* create /sys/fs/orangefs. */
1181 orangefs_obj = kzalloc(sizeof(*orangefs_obj), GFP_KERNEL);
1185 rc = kobject_init_and_add(orangefs_obj,
1193 kobject_uevent(orangefs_obj, KOBJ_ADD);
1195 /* create /sys/fs/orangefs/acache. */
1196 acache_orangefs_obj = kzalloc(sizeof(*acache_orangefs_obj), GFP_KERNEL);
1197 if (!acache_orangefs_obj) {
1202 rc = kobject_init_and_add(acache_orangefs_obj,
1203 &acache_orangefs_ktype,
1208 goto acache_obj_bail;
1210 kobject_uevent(acache_orangefs_obj, KOBJ_ADD);
1212 /* create /sys/fs/orangefs/capcache. */
1213 capcache_orangefs_obj =
1214 kzalloc(sizeof(*capcache_orangefs_obj), GFP_KERNEL);
1215 if (!capcache_orangefs_obj) {
1217 goto acache_obj_bail;
1220 rc = kobject_init_and_add(capcache_orangefs_obj,
1221 &capcache_orangefs_ktype,
1225 goto capcache_obj_bail;
1227 kobject_uevent(capcache_orangefs_obj, KOBJ_ADD);
1229 /* create /sys/fs/orangefs/ccache. */
1230 ccache_orangefs_obj =
1231 kzalloc(sizeof(*ccache_orangefs_obj), GFP_KERNEL);
1232 if (!ccache_orangefs_obj) {
1234 goto capcache_obj_bail;
1237 rc = kobject_init_and_add(ccache_orangefs_obj,
1238 &ccache_orangefs_ktype,
1242 goto ccache_obj_bail;
1244 kobject_uevent(ccache_orangefs_obj, KOBJ_ADD);
1246 /* create /sys/fs/orangefs/ncache. */
1247 ncache_orangefs_obj = kzalloc(sizeof(*ncache_orangefs_obj), GFP_KERNEL);
1248 if (!ncache_orangefs_obj) {
1250 goto ccache_obj_bail;
1253 rc = kobject_init_and_add(ncache_orangefs_obj,
1254 &ncache_orangefs_ktype,
1259 goto ncache_obj_bail;
1261 kobject_uevent(ncache_orangefs_obj, KOBJ_ADD);
1263 /* create /sys/fs/orangefs/perf_counters. */
1264 pc_orangefs_obj = kzalloc(sizeof(*pc_orangefs_obj), GFP_KERNEL);
1265 if (!pc_orangefs_obj) {
1267 goto ncache_obj_bail;
1270 rc = kobject_init_and_add(pc_orangefs_obj,
1278 kobject_uevent(pc_orangefs_obj, KOBJ_ADD);
1280 /* create /sys/fs/orangefs/stats. */
1281 stats_orangefs_obj = kzalloc(sizeof(*stats_orangefs_obj), GFP_KERNEL);
1282 if (!stats_orangefs_obj) {
1287 rc = kobject_init_and_add(stats_orangefs_obj,
1288 &stats_orangefs_ktype,
1293 goto stats_obj_bail;
1295 kobject_uevent(stats_orangefs_obj, KOBJ_ADD);
1299 kobject_put(stats_orangefs_obj);
1301 kobject_put(pc_orangefs_obj);
1303 kobject_put(ncache_orangefs_obj);
1305 kobject_put(ccache_orangefs_obj);
1307 kobject_put(capcache_orangefs_obj);
1309 kobject_put(acache_orangefs_obj);
1311 kobject_put(orangefs_obj);
1316 void orangefs_sysfs_exit(void)
1318 gossip_debug(GOSSIP_SYSFS_DEBUG, "orangefs_sysfs_exit: start\n");
1319 kobject_put(acache_orangefs_obj);
1320 kobject_put(capcache_orangefs_obj);
1321 kobject_put(ccache_orangefs_obj);
1322 kobject_put(ncache_orangefs_obj);
1323 kobject_put(pc_orangefs_obj);
1324 kobject_put(stats_orangefs_obj);
1325 kobject_put(orangefs_obj);