1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef _BCACHE_SYSFS_H_
3 #define _BCACHE_SYSFS_H_
6 const struct kobj_type type ## _ktype = { \
7 .release = type ## _release, \
8 .sysfs_ops = &((const struct sysfs_ops) { \
9 .show = type ## _show, \
10 .store = type ## _store \
12 .default_groups = type ## _groups \
16 static ssize_t fn ## _show(struct kobject *kobj, struct attribute *attr,\
20 static ssize_t fn ## _store(struct kobject *kobj, struct attribute *attr,\
21 const char *buf, size_t size) \
23 #define SHOW_LOCKED(fn) \
27 mutex_lock(&bch_register_lock); \
28 ret = __ ## fn ## _show(kobj, attr, buf); \
29 mutex_unlock(&bch_register_lock); \
33 #define STORE_LOCKED(fn) \
37 mutex_lock(&bch_register_lock); \
38 ret = __ ## fn ## _store(kobj, attr, buf, size); \
39 mutex_unlock(&bch_register_lock); \
43 #define __sysfs_attribute(_name, _mode) \
44 static struct attribute sysfs_##_name = \
45 { .name = #_name, .mode = _mode }
47 #define write_attribute(n) __sysfs_attribute(n, 0200)
48 #define read_attribute(n) __sysfs_attribute(n, 0444)
49 #define rw_attribute(n) __sysfs_attribute(n, 0644)
51 #define sysfs_printf(file, fmt, ...) \
53 if (attr == &sysfs_ ## file) \
54 return sysfs_emit(buf, fmt "\n", __VA_ARGS__); \
57 #define sysfs_print(file, var) \
59 if (attr == &sysfs_ ## file) \
60 return sysfs_emit(buf, \
61 __builtin_types_compatible_p(typeof(var), int) \
63 __builtin_types_compatible_p(typeof(var), unsigned int) \
65 __builtin_types_compatible_p(typeof(var), long) \
67 __builtin_types_compatible_p(typeof(var), unsigned long)\
69 __builtin_types_compatible_p(typeof(var), int64_t) \
71 __builtin_types_compatible_p(typeof(var), uint64_t) \
73 __builtin_types_compatible_p(typeof(var), const char *) \
74 ? "%s\n" : "%i\n", var); \
77 #define sysfs_hprint(file, val) \
79 if (attr == &sysfs_ ## file) { \
80 ssize_t ret = bch_hprint(buf, val); \
86 #define var_printf(_var, fmt) sysfs_printf(_var, fmt, var(_var))
87 #define var_print(_var) sysfs_print(_var, var(_var))
88 #define var_hprint(_var) sysfs_hprint(_var, var(_var))
90 #define sysfs_strtoul(file, var) \
92 if (attr == &sysfs_ ## file) \
93 return strtoul_safe(buf, var) ?: (ssize_t) size; \
96 #define sysfs_strtoul_bool(file, var) \
98 if (attr == &sysfs_ ## file) { \
99 unsigned long v = strtoul_or_return(buf); \
106 #define sysfs_strtoul_clamp(file, var, min, max) \
108 if (attr == &sysfs_ ## file) { \
109 unsigned long v = 0; \
111 ret = strtoul_safe_clamp(buf, v, min, max); \
120 #define strtoul_or_return(cp) \
123 int _r = kstrtoul(cp, 10, &_v); \
129 #define strtoi_h_or_return(cp, v) \
131 int _r = strtoi_h(cp, &v); \
136 #define sysfs_hatoi(file, var) \
138 if (attr == &sysfs_ ## file) \
139 return strtoi_h(buf, &var) ?: (ssize_t) size; \
142 #endif /* _BCACHE_SYSFS_H_ */