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 const 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 const 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 const 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 const 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 const 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 const 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 const 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
);